我见过很多将桥接机变成另一个具有自己的 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
当然,您可以根据需要更改这些地址,但请务必保持它们正确。