32.5 Γεφύρωση

Γράφει ο / η Andrew Thompson.

32.5.1 Εισαγωγή

Μερικές φορές είναι χρήσιμο να χωρίσοετε ένα φυσικό δίκτυο (Όπως ένα τμήμα Ethernet) σε δύο χωριστά τμήματα δικτύων χωρίς να χρειάζεται να δημιουργήσετε δευτερεύοντα IP υποδίκτυα και να χρησιμοποιήσετε έναν δρομολογητή για τη σύνδεση των τμημάτων μαζί. Μια συσκευή που συνδέει δύο δίκτυα μαζί με αυτόν τον τρόπο ονομάζεται «Γέφυρα». Ένα σύστημα FreeBSD με δύο κάρτες δικτύου μπορεί να λειτουργήσει ως γέφυρα.

Η γέφυρα λειτουργεί με την εκμάθηση των διευθύνσεων των ΜAC επιπέδων (Διευθύνσεις Ethernet) των συσκευών σε κάθε μία από τις διασυνδέσεις του δικτύου της. Προωθεί την κίνηση μεταξύ δύο δικτύων μόνο όταν η πηγή του και ο προορισμός του βρίσκονται σε διαφορετικά δίκτυα.

Από πολλές απόψεις, μια γέφυρα είναι σαν ένας Ethernet διακόπτης με πολύ λίγες πόρτες.

32.5.2 Περιπτώσεις όπου η γεφύρωση είναι κατάλληλη.

Υπάρχουν πολλές κοινές καταστάσεις στις οποίες μια γέφυρα χρησιμοποιείται σήμερα.

32.5.2.1 Συνδέοντας Δίκτυα

Η βασική λειτουργία μιας γέφυρας είναι να ενώσει δύο ή περισσότεροα τμήματα του δικτύου μαζί. Υπάρχουν πολλοί λόγοι για να χρησιμοποιήσετε μία γεφύρωση βασισμένη σε host πάνω από πεδία δικτυακού εξοπλισμού, όπως περιορισμούς καλωδίωσης, τείχος προστασίας ή σύνδεση ψευδοδικτύων όπως Virtual Machine (εικονικές μηχανές). Μια γέφυρα μπορεί επίσης να συνδέσει μια ασύρματη διασύνδεση τρέχωντας σε λειτουργία hostap σε ένα ενσύρματο δίκτυο και να λειτουργεί ως ένα σημείο πρόσβασης.

32.5.2.2 Filtering/Traffic Shaping τείχου προστασίας

Μια συνηθισμένη περίπτωση είναι όταν σε ένα τείχος προστασίας η λειτουργικότητα χρειάζεται χωρίς δρομολόγηση ή στισς υπηρεσίες μετάφρασης διευθύνσεων δικτύου (NAT).

Ένα παράδειγμα είναι μια μικρή εταιρεία που συνδέεται μέσω DSL ή ISDN στον ISP της. Έχουν 13 παγκοσμίως προσβάσιμες IP διευθύνσεις από τον ISP τους και έχουν 10 υπολογιστές στο δίκτυό τους. Σε αυτήν την περίπτωση, χρησιμοποιώντας ένα δρομολογητή - βάση το τείχος προστασίας είναι δύσκολο λόγω του θέματος της δημιουργίας υποδικτύων.

Ενα τείχος προστασίας βασισμένο στην γεφύρωση μπορεί να ρυθμιστεί και να πέσει στο μονοπάτι αμέσως στο downstream του DSL/ISDN δρομολογητή του χωρίς κανένα IP αριθμιτικό θέμα.

32.5.2.3 Σύνδεση δυκτίου

Μια γέφυρα μπορεί να ενώσει δύο τμήματα του δικτύου και να χρησιμοποιηθεί για να επιθεωρεί όλα τα πλαίσια Ethernet που περνούν μεταξύ τους. Αυτό μπορεί να προέρχεται από τη χρήση bpf(4)/tcpdump(1) στην γεφύρωση της διεπαφής ή στέλνοντας ένα αντίγραφο όλων για να πραγματοποιήσει μία επιπλέον διεπαφή (σύνδεση θυρών).

32.5.2.4 Επίπεδο 2 VPN

Δύο δίκτυα Ethernet μπορούν να ενωθούν σε μια σύνδεση IP γεφυρώνοντας τα δίκτυα σε ένα EtherIP κανάλι ή tap(4) βασισμένο στη λύση όπως το OpenVPN.

32.5.2.5 Επίπεδο 2 Πλεονασμός

Ένα δίκτυο μπορεί να συνδεθεί μαζί με πολλαπλές συνδέσεις και να χρησιμοποιήσει το πρώτόκολλο σύνδεσης δέντρου για να μπλοκάρει περιττές διαδρομές. Για να λειτουργήσει σωστά ένα δίκτυο Ethernet μόνο μία ενεργή διαδρομή μπορεί να υπάρχει μεταξύ δύο συσκευών. Η σύνδεση θυρών θα ανιχνέυσει βρόγχους και θα θέσει τις περιττές συνδέσεις σε κατάσταση μπλοκαρίσματος. Σε περίπτωση που μία από τις ενεργές συνδέσεις αποτύχει τότε το πρωτόκολλο θα υπολογίσει ένα διαφορετικό δέντρο και επανενεργοποιήσετε μία από τις μπλοκαρισμένες διαδρομές για την αποκατάσταση της σύνδεσης όλων των σημείων στο δίκτυο.

32.5.3 Ρύθμιση Πυρήνα

Αυτή η ενότητα καλύπτει if_bridge(4) την εκτέλεση της γεφύρωσης. Ένας netgraph οδηγός γεφύρωσης είναι επίσης διαθέσιμος. Για περισσότερες πληροφορίες δείτε ng_bridge(4) εγχειρίδιο.

Ο οδηγός γέφυρα είναι ένας οδηγός του πυρήνα και φορτώνεται αυτόματα κατά ifconfig(8) τη δημιουργία μιάς διεπαφής γέφυρα. Είναι δυνατόν να χτίσετε τη σύνδεση στον πυρήνα προσθέτωντας device if_bridge στο αρχείο ρυθμίσεων του πυρήνα.

Το φιλτράρισμα πακέτων μπορεί να χρησιμοποιηθεί με κάθε πακέτο του τοίχους προστασίας που πιάνεται μέσω του pfil(9) πλαισίου. Το τοίχος προστασίας μπορεί να φορτωθεί ως οδηγός ή να χτιστεί μέσα στον πυρήνα.

Η γέφυρα μπορεί να χρησιμοποιηθεί ως ένας σχηματισμός της κίνησης altq(4) ή dummynet(4).

32.5.4 Ενεργοποιώντας την Γέφυρα

Η γέφυρα δημιουργείται με την κλωνοποίηση της διεπαφής. Για να δημιουργήσετε τη χρήση γέφυρας ifconfig(8). Αν ο οδηγός γεφύρωσης δεν παρουσιάζεται στον πυρήνα τότε θα φορτωθεί αυτομάτως.

# ifconfig bridge create
bridge0
# ifconfig bridge0
bridge0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether 96:3d:4b:f1:79:7a
        id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
        maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200
        root id 00:00:00:00:00:00 priority 0 ifcost 0 port 0

Μια διεπαφή γέφυρας δημιουργείται και εκχωρεί αυτόματα μια τυχαία δημιουργούμενη διέυθυνση Ethernet. Η maxaddr και timeout παράμετροι ελέγχουν πόσες διευθύνσεις MAC η γέφυρα θα κρατήσει κατά τη διαβίβαση του πίνακα και πόσα δευτερόλεπτα πριν από κάθε είσοδο θα αφαιρεθεθούν μετά την εθέαση τους για τελευταία φορά. Οι άλλες παράμετροι ελέγχουν τον τρόπο που δραστηριοποιείται η σύνδεση δέντρου.

Προσθέστε τις συνδέσεις του δικτύου μέλους στη γέφυρα. Για να μπορεί η γέφυρα να προωθεί τα πακέτα σε όλες τις διασυνδέσεις μελών πρέπει να είναι πάνω:

# ifconfig bridge0 addm fxp0 addm fxp1 up
# ifconfig fxp0 up
# ifconfig fxp1 up

Η γέφυρα τώρα προωθεί Ethernet πλαίσια μεταξύ fxp0 και fxp1. Η ισότιμη σύνδεση στο /etc/rc.conf έτσι ώστε η γέφυρα να δημιουργείται στην εκκίνηση είναι:

cloned_interfaces="bridge0"
ifconfig_bridge0="addm fxp0 addm fxp1 up"
ifconfig_fxp0="up"
ifconfig_fxp1="up"

Αν η γέφυρα - υποδοχή χρειάζεται μια διεύθυνση IP τότε η σωστή θέση να το ορίσετε είναι στην ίδια την διεπαφή γέφυρας και όχι σε μία από τις διασυνδέσεις μελών. Αυτό μπορεί να ρυθμιστεί είτε στατικά είτε μέσω του DHCP:

# ifconfig bridge0 inet 192.168.0.1/24

Είναι επίσης δυνατόν να αντιστοιχίσετε μια διεύθυνση IPv6 σε μία διεπαφή γέφυρας.

32.5.5 Το τοίχος προστασίας

Όταν το φιλτράρισμα πακέτων είναι ενεργοποιημένο, τα πακέτα γεφύρωσης θα διέρχονται από το φίλτρο εισερχομένων στο σημείο προσδιορισμού της επαφής, της διεπαφής γεφύρωσης και θα εξέρχονταιγια την κατάλληλες διασυνδέσεις. Τότε το στάδιο μπορεί να απενεργοποιηθεί. Όταν η κατεύθυνση της ροής πακέτων είναι σημαντική, είναι καλύτερα το τείχος προστασίας στις διεπαφές μέλους και όχι στην ίδια την γέφυρα.

Η γέφυρα έχει αρκετές διαμορφώσιμες ρυθμίσεις για τη διέλευση μη-IP και ARP πακέτων, και επίπεδα 2 τοίχους προστασίας με IPFW. Δείτε if_bridge(4) για περισσότερες πληροφορίες.

32.5.6 Ζέυγος δέντρου

Ο οδηγός γέφυρα υλοποιεί το πρωτόκολλο γρήγορης σύνδεσης δέντρων (RSTP or 802.1w) με οπίσθια συμβατότητα με την κληροδότηση του πρωτοκόλλου σύνδεσης δέντρου (STP). Η σύνδεση δέντρου χρησιμοποιείται για να εντοπίζει και να απομακρύνει βρόχους σε τοπολογία του δικτύου. Το RSTP παρέχει ταχύτερη σύγκλιση σύνδεσης δέντρου κληρονομιάς STP. Το πρωτόκολλο θα ανταλλάξει πληροφορίες με γειτονικούς διακόπτες για γρήγορη μετάβαση σε αποστολή χωρίς τη δημιουργία βρόγχων.

Ο πίνακας που ακολουθεί δείχνει τους τρόπους υποστήριξης της λειτουργίας:

Έκδοση Λειτουργικού συστήματος STP τρόποι Προεπιλεγμένος τρόπος
FreeBSD 5.4--FreeBSD 6.2 STP STP
FreeBSD 6.3+ RSTP or STP STP
FreeBSD 7.0+ RSTP or STP RSTP

Spanning Tree can be enabled on member interfaces using the stp command. For a bridge with fxp0 and fxp1 as the current interfaces, enable STP with the following:

# ifconfig bridge0 stp fxp0 stp fxp1
bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether d6:cf:d5:a0:94:6d
        id 00:01:02:4b:d4:50 priority 32768 hellotime 2 fwddelay 15
        maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200
        root id 00:01:02:4b:d4:50 priority 32768 ifcost 0 port 0
        member: fxp0 flags=1c7<LEARNING,DISCOVER,STP,AUTOEDGE,PTP,AUTOPTP>
                port 3 priority 128 path cost 200000 proto rstp
                role designated state forwarding
        member: fxp1 flags=1c7<LEARNING,DISCOVER,STP,AUTOEDGE,PTP,AUTOPTP>
                port 4 priority 128 path cost 200000 proto rstp
                role designated state forwarding

This bridge has a spanning tree ID of 00:01:02:4b:d4:50 and a priority of 32768. As the root id is the same it indicates that this is the root bridge for the tree.

Another bridge on the network also has spanning tree enabled:

bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether 96:3d:4b:f1:79:7a
        id 00:13:d4:9a:06:7a priority 32768 hellotime 2 fwddelay 15
        maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200
        root id 00:01:02:4b:d4:50 priority 32768 ifcost 400000 port 4
        member: fxp0 flags=1c7<LEARNING,DISCOVER,STP,AUTOEDGE,PTP,AUTOPTP>
                port 4 priority 128 path cost 200000 proto rstp
                role root state forwarding
        member: fxp1 flags=1c7<LEARNING,DISCOVER,STP,AUTOEDGE,PTP,AUTOPTP>
                port 5 priority 128 path cost 200000 proto rstp
                role designated state forwarding

The line root id 00:01:02:4b:d4:50 priority 32768 ifcost 400000 port 4 shows that the root bridge is 00:01:02:4b:d4:50 as above and has a path cost of 400000 from this bridge, the path to the root bridge is via port 4 which is fxp0.

32.5.7 Advanced Bridging

32.5.7.1 Reconstruct Traffic Flows

The bridge supports monitor mode, where the packets are discarded after bpf(4) processing, and are not processed or forwarded further. This can be used to multiplex the input of two or more interfaces into a single bpf(4) stream. This is useful for reconstructing the traffic for network taps that transmit the RX/TX signals out through two separate interfaces.

To read the input from four network interfaces as one stream:

# ifconfig bridge0 addm fxp0 addm fxp1 addm fxp2 addm fxp3 monitor up
# tcpdump -i bridge0

32.5.7.2 Span Ports

A copy of every Ethernet frame received by the bridge will be transmitted out a designated span port. The number of span ports configured on a bridge is unlimited, if an interface is designated as a span port then it may not also be used as a regular bridge port. This is most useful for snooping a bridged network passively on another host connected to one of the span ports of the bridge.

To send a copy of all frames out the interface named fxp4:

# ifconfig bridge0 span fxp4

32.5.7.3 Private Interfaces

A private interface does not forward any traffic to any other port that is also a private interface. The traffic is blocked unconditionally so no Ethernet frames will be forwarded, including ARP. If traffic needs to be selectively blocked then a firewall should be used instead.

32.5.7.4 Sticky Interfaces

If a bridge member interface is marked as sticky then dynamically learned address entries are treated at static once entered into the forwarding cache. Sticky entries are never aged out of the cache or replaced, even if the address is seen on a different interface. This gives the benefit of static address entries without the need to pre-populate the forwarding table, clients learnt on a particular segment of the bridge can not roam to another segment.

Another example of using sticky addresses would be to combine the bridge with VLANs to create a router where customer networks are isolated without wasting IP address space. Consider that CustomerA is on vlan100 and CustomerB is on vlan101. The bridge has the address 192.168.0.1 and is also an internet router.

# ifconfig bridge0 addm vlan100 sticky vlan100 addm vlan101 sticky vlan101
# ifconfig bridge0 inet 192.168.0.1/24

Both clients see 192.168.0.1 as their default gateway and since the bridge cache is sticky they can not spoof the MAC address of the other customer to intercept their traffic.

Any communication between the VLANs can be blocked using private interfaces (or a firewall):

# ifconfig bridge0 private vlan100 private vlan101

The customers are completely isolated from each other, the full /24 address range can be allocated without subnetting.

32.5.7.5 Address limits

The number of unique source MAC addresses behind an interface can be limited. Once the limit is reached packets with unknown source addresses are dropped until an existing host cache entry expires or is removed.

The following example sets the maximum number of Ethernet devices for CustomerA on vlan100 to 10.

# ifconfig bridge0 ifmaxaddr vlan100 10

32.5.7.6 SNMP Monitoring

The bridge interface and STP parameters can be monitored via the SNMP daemon which is included in the FreeBSD base system. The exported bridge MIBs conform to the IETF standards so any SNMP client or monitoring package can be used to retrieve the data.

On the bridge machine uncomment the begemotSnmpdModulePath."bridge" = "/usr/lib/snmp_bridge.so" line from /etc/snmp.config and start the bsnmpd daemon. Other configuration such as community names and access lists may need to be modified. See bsnmpd(1) and snmp_bridge(3) for more information.

The following examples use the Net-SNMP software (net-mgmt/net-snmp) to query a bridge, the net-mgmt/bsnmptools port can also be used. From the SNMP client host add to $HOME/.snmp/snmp.conf the following lines to import the bridge MIB definitions in to Net-SNMP:

mibdirs +/usr/share/snmp/mibs
mibs +BRIDGE-MIB:RSTP-MIB:BEGEMOT-MIB:BEGEMOT-BRIDGE-MIB

To monitor a single bridge via the IETF BRIDGE-MIB (RFC4188) do

% snmpwalk -v 2c -c public bridge1.example.com mib-2.dot1dBridge
BRIDGE-MIB::dot1dBaseBridgeAddress.0 = STRING: 66:fb:9b:6e:5c:44
BRIDGE-MIB::dot1dBaseNumPorts.0 = INTEGER: 1 ports
BRIDGE-MIB::dot1dStpTimeSinceTopologyChange.0 = Timeticks: (189959) 0:31:39.59 centi-seconds
BRIDGE-MIB::dot1dStpTopChanges.0 = Counter32: 2
BRIDGE-MIB::dot1dStpDesignatedRoot.0 = Hex-STRING: 80 00 00 01 02 4B D4 50
...
BRIDGE-MIB::dot1dStpPortState.3 = INTEGER: forwarding(5)
BRIDGE-MIB::dot1dStpPortEnable.3 = INTEGER: enabled(1)
BRIDGE-MIB::dot1dStpPortPathCost.3 = INTEGER: 200000
BRIDGE-MIB::dot1dStpPortDesignatedRoot.3 = Hex-STRING: 80 00 00 01 02 4B D4 50
BRIDGE-MIB::dot1dStpPortDesignatedCost.3 = INTEGER: 0
BRIDGE-MIB::dot1dStpPortDesignatedBridge.3 = Hex-STRING: 80 00 00 01 02 4B D4 50
BRIDGE-MIB::dot1dStpPortDesignatedPort.3 = Hex-STRING: 03 80
BRIDGE-MIB::dot1dStpPortForwardTransitions.3 = Counter32: 1
RSTP-MIB::dot1dStpVersion.0 = INTEGER: rstp(2)

The dot1dStpTopChanges.0 value is two which means that the STP bridge topology has changed twice, a topology change means that one or more links in the network have changed or failed and a new tree has been calculated. The dot1dStpTimeSinceTopologyChange.0 value will show when this happened.

To monitor multiple bridge interfaces one may use the private BEGEMOT-BRIDGE-MIB:

% snmpwalk -v 2c -c public bridge1.example.com
enterprises.fokus.begemot.begemotBridge
BEGEMOT-BRIDGE-MIB::begemotBridgeBaseName."bridge0" = STRING: bridge0
BEGEMOT-BRIDGE-MIB::begemotBridgeBaseName."bridge2" = STRING: bridge2
BEGEMOT-BRIDGE-MIB::begemotBridgeBaseAddress."bridge0" = STRING: e:ce:3b:5a:9e:13
BEGEMOT-BRIDGE-MIB::begemotBridgeBaseAddress."bridge2" = STRING: 12:5e:4d:74:d:fc
BEGEMOT-BRIDGE-MIB::begemotBridgeBaseNumPorts."bridge0" = INTEGER: 1
BEGEMOT-BRIDGE-MIB::begemotBridgeBaseNumPorts."bridge2" = INTEGER: 1
...
BEGEMOT-BRIDGE-MIB::begemotBridgeStpTimeSinceTopologyChange."bridge0" = Timeticks: (116927) 0:19:29.27 centi-seconds
BEGEMOT-BRIDGE-MIB::begemotBridgeStpTimeSinceTopologyChange."bridge2" = Timeticks: (82773) 0:13:47.73 centi-seconds
BEGEMOT-BRIDGE-MIB::begemotBridgeStpTopChanges."bridge0" = Counter32: 1
BEGEMOT-BRIDGE-MIB::begemotBridgeStpTopChanges."bridge2" = Counter32: 1
BEGEMOT-BRIDGE-MIB::begemotBridgeStpDesignatedRoot."bridge0" = Hex-STRING: 80 00 00 40 95 30 5E 31
BEGEMOT-BRIDGE-MIB::begemotBridgeStpDesignatedRoot."bridge2" = Hex-STRING: 80 00 00 50 8B B8 C6 A9

To change the bridge interface being monitored via the mib-2.dot1dBridge subtree do:

% snmpset -v 2c -c private bridge1.example.com
BEGEMOT-BRIDGE-MIB::begemotBridgeDefaultBridgeIf.0 s bridge2

Αυτό το κείμενο, και άλλα κείμενα, μπορεί να βρεθεί στο ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Για ερωτήσεις σχετικά με το FreeBSD, διαβάστε την τεκμηρίωση πριν να επικοινωνήσετε με την <questions@FreeBSD.org>.
Για ερωτήσεις σχετικά με αυτή την τεκμηρίωση, στείλτε e-mail στην <doc@FreeBSD.org>.