Networking

從現有 WiFi 到乙太網的透明橋接?

  • June 10, 2018

我已經看到很多將橋接機變成另一個具有自己的 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,專業人員在那裡進行了安裝。

引用自:https://unix.stackexchange.com/questions/448548