从现有 WiFi 到以太网的透明桥?

从现有 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:~ $ 

答案1

好的,我认为这里的主要问题是通信问题:您使用的术语在网络中具有非常具体的含义(将 WLAN 桥接到 LAN),而不是描述所需的结果(我有一个没有 WLAN 的设备 A,我想通过第二个设备将其连接到我的 WLAN 路由器,以便可以从 WLAN 上的所有其他设备访问该路由器,反之亦然)。然后,您当然会得到一个符合具有特定含义的术语的答案(XY 问题中的 Y)),这不是您想要的(您的 X)。

这就是 XY 问题的全部内容:如果您询问 X 而不是 Y,您会得到正确的答案。如果你问Y,人们无法正确回答。

那么,让我们做一些网络基础知识。这开放系统互连模型描述了网络的几个层。第 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 的计算机。

稍微简化一下,“数据包”(802.11帧通过 WLAN 发送的 ) 包含 A、B 和 C 的 MAC 地址(3 地址模式)。因此,AP 可以桥接 WLAN 和 LAN 适配器,形成单个网段:如果 C 想要直接向 A 发送第 2 层数据包,它知道它与 B 关联,因此它可以将地址(A、B、C )到数据包中。当 B 收到数据包时,它看到最终目的地是 A,因此它可以在桥接 LAN 接口上再次将其发送出去。另一个方向也是如此。

现在,如果 STA C 尝试做同样的事情,桥接 LAN 和 WLAN,会发生什么?那么当D向A发送二层数据包时,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 添加适当的(静态)路由表,就像这样,它就变得可达。由于三层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 可以只说“发送第 3 层数据包到 10.0.0.2”,它就会正常到达。无需 NAT。

请注意,在大多数家庭网络上,只有一个 AP(很少有人知道如何正确设置多个 AP,如果他们想要多个 AP,就会做一些可怕的事情,例如双 NAT),并且您的家庭路由器将 A 和 B 组合成一个设备。但协议仍然如上所述。

您会发现多个 AP 的设置与酒店等场所中描述的一样,由专业人员进行安装。

答案2

我得到了它!只需要一些细微的调整这个起点,它似乎平移一个方向,但不平移另一个方向。向另一个方向填充使其发出“咔嗒”声。

显然,由于我仍然不完全理解的原因(有线设备连接到 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

当然,您可以根据需要更改这些地址,但请务必保持它们正确。

相关内容