從現有 WiFi 到乙太網的透明橋接?
我已經看到很多將橋接機變成另一個具有自己的 DHCP 伺服器等的路由器的範例。但是我想使用有線設備,就好像它直接連接到原始路由器一樣。橋接機自己連接WiFi沒有問題。
這個答案似乎接近我想要的,但它也說,
The wlan0 interface also has to be condigured to connect to your remote AP so this configuration is not be used verbatim.
正如警告所說,它不能自行工作 - 找不到 WiFi 適配器,因此無法連接 - 但它沒有說明如何重新建立原始的工作連接。我怎麼做?
/etc/wpa_supplicant/wpa_supplicant.conf
是:ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=US network={ ssid="MyNetwork" psk="MyPassword" key_mgmt=WPA-PSK }
WiFi工作時,
/etc/network/interfaces
預設為:# interfaces(5) file used by ifup(8) and ifdown(8) # Please note that this file is written to be used with dhcpcd # For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf' # Include files from /etc/network/interfaces.d: source-directory /etc/network/interfaces.d
結果
ifconfig
:pi@FCC-FOH:~ $ ifconfig eth0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 ether b8:27:eb:4c:6c:a7 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.43.35 netmask 255.255.255.0 broadcast 192.168.43.255 inet6 fe80::c39b:c8ac:86c9:1f0e prefixlen 64 scopeid 0x20<link> inet6 2600:100a:b02f:8196:b8ae:3d20:c4d0:817c prefixlen 64 scopeid 0x0<global> ether 00:f0:00:36:1f:1a txqueuelen 1000 (Ethernet) RX packets 17 bytes 1955 (1.9 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 52 bytes 7956 (7.7 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 pi@FCC-FOH:~ $
當我嘗試啟用網橋時,
/etc/network/interfaces
是:# interfaces(5) file used by ifup(8) and ifdown(8) # Please note that this file is written to be used with dhcpcd # For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf' # Include files from /etc/network/interfaces.d: source-directory /etc/network/interfaces.d auto eth0 allow-hotplug eth0 iface eth0 inet manual auto wlan0 allow-hotplug wlan0 iface wlan0 inet manual auto br0 iface br0 inet dhcp bridge_ports eth0 wlan0
結果
ifconfig
:pi@FCC-FOH:~ $ ifconfig br0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 ether b8:27:eb:4c:6c:a7 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 ether b8:27:eb:4c:6c:a7 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 wlan0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 ether 00:f0:00:36:1f:1a txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 pi@FCC-FOH:~ $
我得到了它!只需要從這個起點進行一些細微的調整,這似乎可以轉換一個方向,但不能轉換另一個方向。填充另一個方向使其“點擊”。
顯然,由於我仍然不完全理解的原因(有線設備連接到 WiFi 網路),您不能通過這種網橋使用 DHCP,但是如果您對網橋和設備的靜態地址沒問題,它可以工作. 我是這樣做的:
將其添加到
/etc/network/interfaces
:auto eth0 auto lo wlan0 iface lo inet loopback # We're going to play router on this interface, so set that address iface eth0 inet static address 192.168.3.1 netmask 255.255.255.0 # Setup WiFi and take a static address, so we know the context allow-hotplug wlan0 iface wlan0 inet static wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf address 192.168.2.5 netmask 255.255.255.0 gateway 192.168.2.1 # Take a second address, so we can bridge it to the single device at 192.168.3.x iface wlan0 inet static address 192.168.2.6
將其添加到
/etc/rc.local
:# Match settings in /etc/network/interfaces IP_THIS="192.168.2.6" IP_OTHR="192.168.3.6" # Actual work echo "1" > /proc/sys/net/ipv4/ip_forward iptables -t nat -A PREROUTING -d $IP_OTHR -i eth0 -j DNAT --to-destination $IP_THIS iptables -t nat -A PREROUTING -d $IP_THIS -i wlan0 -j DNAT --to-destination $IP_OTHR iptables -t nat -A POSTROUTING -s $IP_THIS -j SNAT --to-source $IP_OTHR iptables -t nat -A POSTROUTING -s $IP_OTHR -j SNAT --to-source $IP_THIS
確保
/etc/wpa_supplicant/wpa_supplicant.conf
包括以下內容:network={ ssid="MyNetwork" psk="MyPassword" key_mgmt=WPA-PSK }
如果您已經通過圖形實用程序連接,它可能已經存在,但無論如何都要確保。根據您的網路的需要進行修改。
將橋接設備設置為靜態:
address: 192.168.3.6 netmask: 255.255.255.0 gateway: 192.168.3.1
及其目標(如果有)在
192.168.2.x
網路上,就好像它直接在該網路上一樣。與它自己的子網之外的東西進行通信似乎很奇怪,但是當網橋進行轉換時(
iptables
),它就正確了。同樣,在主網路上配置任何東西以使用橋接器的第二個地址,而不是實際地址,與橋接設備通信。
使用交叉電纜將設備連接到網橋,重新啟動網橋後,它應該“正常工作”。(或者至少它對我有用)
生成的結構是:
Router: addr: 192.168.2.1 ssid: MyNetwork pass: MyPassword auth: WPA2 dhcp: 100+ Target for Bridged Device addr: 192.168.2.2 Bridge addr: 192.168.2.5 (WiFi primary - used for the Bridge Machine itself) addr: 192.168.2.6 (WiFi secondary - forwards to Bridged Device) addr: 192.168.3.1 (Wired - "plays router" for Bridged Device) Bridged Device addr: 192.168.3.6
當然,您可以根據需要更改這些地址,但請務必保持正確。
好的,我認為這裡的主要問題是通信問題:您使用的術語在網路中具有非常特定的含義(將 WLAN 橋接到 LAN)而不是描述期望的結果(我有一個沒有 WLAN 的設備 A,我想通過第二個設備將它連接到我的 WLAN 路由器,以便可以從 WLAN 上的所有其他設備訪問,反之亦然)。然後當然你會得到一個適合具有特定含義的術語的答案(你在 XY 問題中的 Y)),這不是你想要的(你的 X)。
這就是 XY 問題的全部內容:如果你問的是 X 而不是 Y,你會得到正確的答案。如果您詢問 Y,人們無法正確回答。
所以,讓我們做一些網路基礎知識。OSI 模型描述了幾層網路。第 2 層是乙太網/Wifi 層:設備由 MAC 地址標識,有一個網段(也稱為廣播域),所有設備都可以在該網段中看到彼此,並可以向該網段上的所有其他設備發送消息。另一方面,第 3 層使用 Internet (IP) 地址。
橋接意味著連接兩個第 2 層段,以便它們顯示為單個第 2 層段(因此第 2 層廣播將在前面的兩個段中看到)。路由意味著通過在第 3 層找到數據包的下一個目的地,然後將此數據包轉發到第 2 層上的此目的地,從而連接兩個第 2 層段。
現在 WLAN 被設計為允許在第二層網段(稱為分佈式系統(DS))上有多個接入點:
<--- SEGMENT (DS) ---> <- SEGMENT -> LAN WLAN LAN | | .....C1------------D |---- B1 .... A----| .....C2 | |---- B2 .. |
A 是 DS 的網關,B1 和 B2 是接入點(AP),C1 和 C2 是站(STA),D 是通過 LAN 連接到 C1 的電腦。
簡化一點,通過 WLAN 發送的數據包包含 A、B 和 C(3 地址模式)的 MAC 地址。因此,AP 可以橋接 WLAN 和 LAN 適配器,形成一個單獨的網段:如果 C 想直接向 A 發送第 2 層數據包,它知道它與 B 相關聯,因此它可以放置地址 (A,B,C ) 到數據包中。當 B 收到數據包時,它看到最終目的地是 A,因此它可以在橋接的 LAN 介面上再次將其發送出去。同樣在另一個方向。
現在,如果 STA C 嘗試做同樣的事情並橋接 LAN 和 WLAN,會發生什麼?那麼當 D 向 A 發送第 2 層數據包時,C 應該在 WLAN 數據包中放入哪些地址?它可以放入(A,B,D)。如果通信未加密,則 AP B 會說“嘿,該數據包來自 D,但我與 D 沒有關聯。所以該數據包一定出錯了,讓我們丟棄它”。更糟糕的是,如果通信是加密的(這應該是今天的標準),密鑰是在 AP 和 STA 之間協商的。但是C只有
<B,C>
鑰匙,沒有<B,D>
鑰匙。所以這個數據包不能正確加密。如果 C 只輸入自己的 MAC 地址會怎樣?然後對於發送到D 的數據包,它們最終也會被發送到 C。因此 C 必須決定如何區分將數據包轉發給 D 和自己接受這些數據包。這很難做到,因為在第 2 層上,它沒有很多資訊可以作為此決定的依據。這就是為什麼在這種情況下,您最終會以 C“消失”而 D 似乎直接連接到 B。這是 WLAN_KABEL 實施的解決方案。這種變化確實基於所使用的(第 3 層)埠等做出此決定。
另一種選擇是只輸入所有涉及的地址(A、B、C、D)而不是只輸入(A、B、C)。這稱為 4 地址模式,或者有時稱為無線分配系統(WDS;小心,WDS 也用於其他類似的專有方式)。
所以現在您知道為什麼可以在 STA 上橋接 LAN 和 WLAN。
如果您不想橋接,並且只保留圖片中的段,那麼一切都變得簡單:您路由,只需在 A 和所有 B 上為 D 添加適當的(靜態)路由表,就像這樣,它變得可達。由於第 3 層 IP 地址是基於分段分配的,因此它只是具有不同範圍內的地址。例如,WLAN網段為192.168.23.0/24,假設A為192.168.23.1,B1為192.168.23.2,B2為192.168.23.3,C1為192.168.23.100,C2為192.168.23.101;C1 和 D 之間的 LAN 段 C1 為 10.0.0.1,D 為 10.0.0.2。然後 C2 可以只說“向 10.0.0.2 發送第 3 層數據包”,它會正常到達。不需要 NAT。
請注意,在大多數家庭網路上,只有一個 AP(很少有人知道如何正確設置多個 AP,如果他們想要多個 AP,則執行雙 NAT 等可怕的事情),並且您的家庭路由器將 A 和 B 組合成一個設備。但是協議仍然如上所述。
您會發現像酒店等中描述的那樣設置了多個 AP,專業人員在那裡進行了安裝。