将 wlan0 桥接到 eth0

dbd*_*407 34 networking linux router bridge wlan

在 Arch Linux 上,我想让 eth0(连接到桥接路由器)共享从 wlan0 接收到的连接,我已经阅读了教程,但我不像其他用户那样精通命令,也不完全理解。

小智 37

桥接wifi接口,您可以使用iw工具同样启用4addr

# iw dev <wifiInterface> set 4addr on
Run Code Online (Sandbox Code Playgroud)

IE:

# brctl addif <bridgename> <wifiInterface>
can't add <wifiInterface> to bridge <bridgename>: Operation not supported

# iw dev <wifiInterface> set 4addr on
# brctl addif <bridgename> <wifiInterface>
Run Code Online (Sandbox Code Playgroud)

现在它应该可以工作了。您可以使用以下方法显示桥梁:

# brctl show
Run Code Online (Sandbox Code Playgroud)

  • 这个设置有什么用,你为什么特别建议在这种情况下使用它? (2认同)
  • `4addr` 确实需要无线链路的两端都支持它(假设您正在尝试实现 wifi 扩展器) (2认同)

cst*_*mas 30

更新

根据 linux-ath5k-devel 上的这个线程,不可能在无线(客户端又名站模式)和有线接口之间进行桥接。

设置 NAT

应该改为设置 NAT:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)

分配 IP

然后你必须为自己分配IP地址:

ifconfig eth0 10.0.0.1 netmask 255.255.255.0 up
Run Code Online (Sandbox Code Playgroud)

安装 dhcp 守护进程

安装 dhcp 服务器并将以下文本添加到其配置文件中(在 /etc/dhcpd.conf 或类似内容中)

subnet 10.0.0.0 netmask 255.255.255.0 {
    range 10.0.0.100 10.0.0.120;
    option routers 10.0.0.1;
    option domain-name-servers the-ip-address-you-have-in-etc-resolv.conf;
}
Run Code Online (Sandbox Code Playgroud)

启动 dhcpd

然后启动它 /etc/init.d/dhcpd start

就是这样!

如果您对非工作桥接设置感兴趣,请仅阅读以下内容


brctl addbr mybridge
brctl addif mybridge eth0
brctl addif mybridge wlan0
Run Code Online (Sandbox Code Playgroud)

首先创建一个桥接口,我选择一个任意名称mybridge然后向它添加接口。

您应该请求一个新的 IP 地址(仅当您想为桥接设备本身获取有效 IP 时才需要这样做):

dhclient -d mybridge
Run Code Online (Sandbox Code Playgroud)

  • NAT 与桥接完全不同。桥接是第二层,NAT 是第三层,并且特定于 IPv4。我不明白为什么这是一个可以接受的答案。 (10认同)
  • 无法将 wlan0 添加到桥接 mybridge:不支持操作 (8认同)
  • @Hugo IP NAT 是第 3 层,但 MAC NAT 是第 2 层。对于 WiFi 桥接,您可以使用 4addr、WDS、MAC NAT,或者您可以在第 3 层(例如 IP NAT)上执行某些操作。 (5认同)
  • 您实际上并不需要桥接接口的 IP 地址来使桥接工作。 (3认同)

int*_*ika 12

桥接 wlan 和 4addr:

桥接 wlan0 是一种痛苦。您通常无法将其添加到桥接接口(brctl 返回“不允许操作”),并且使用 VirtualBox 的“桥接”过滤器会导致大量的 ARP 和 DHCP 冲突。造成这种情况的原因是 802.11 帧默认只包含三个地址:两个无线设备(笔记本电脑和 AP)的 MAC 地址和最终接收方的 MAC 地址(如在以太网中)。总是假设只有一个可能的发起者。

802.11 可以携带第四个,即始发者的 MAC 地址,这在 WDS 模式下由中继器使用。也可以在 Linux 上使用 iw 启用此功能,启用此模式将允许 wlan0 用​​于桥接接口以及 VirtualBox 桥接网络:

iw dev wlan0 set 4addr on
Run Code Online (Sandbox Code Playgroud)

但是,启用 4addr 后,您可能会被 AP 完全忽略:关联成功但所有数据帧都消失在以太中。这可能是出于安全原因(因为很难欺骗源 MAC 地址。是的。)在我的路由器(运行 OpenRG)中,有必要为无线 AP 接口启用“WDS”模式,添加一个 WDS 设备仅限于我的笔记本电脑的 MAC 地址,并将其添加到 LAN 桥接器。4addr 数据包现在可以工作了。

但是,还有另一个问题——路由器现在拒绝来自笔记本电脑的三地址数据包,这可能相当不方便(每次更改 WLAN 网络时都必须切换 4addr)。解决方法是在膝上型电脑上添加连接到同一设备但具有不同 MAC 地址的第二个无线接口。首先撤消之前的配置:

iw dev wlan0 set 4addr off
Run Code Online (Sandbox Code Playgroud)

然后,添加第二个接口——名称是任意选择的——具有不同的 MAC 地址:

iw dev wlan0 interface add wds.wlan0 type managed 4addr on
ip link set dev wds.wlan0 addr <addr>
ip link set dev wds.wlan0 up
Run Code Online (Sandbox Code Playgroud)

这里必须匹配路由器中配置的WDS设备地址;除此之外,它可以是任何有效的 MAC 地址。wlan0 的原始 MAC 然后保留用于“正常”使用。

可以同时使用 wlan0 和 wds.wlan0——尽管我只测试了两次关联到同一个 AP,而不是不同的 AP。我猜他们至少需要在同一个频道上。

有人问为什么在 VirtualBox 可以桥接 WiFi 时使用它“很好”。答案是 VirtualBox 不会发送虚拟机的 MAC 地址;相反,它也在 MAC 层执行 NAT。– 2014-08-22

直接无线网桥

在某些情况下,您还可以使用 wlan_kabel。它使用数据包套接字直接桥接 wlan*-设备与以太网设备。但是,您一次只能使用 wlan_kabel 桥接一个 MAC。它没有被接入点禁止的缺点,因为只使用了 wlan 设备的原始 MAC。在您的情况下,这意味着 wlan0 只能由一个 VM 使用,甚至不能由主机使用。你可以在这里获得wlan_kabel。这类似于macvlans解决方案。

与 ipvlan 桥接

IP Vlan 没有网桥的限制,它可用于桥接网络,有关如何使用它的详细信息可以在此处找到

化装舞会替代品

Linux 路由可以与 iptables-masquerade 和 ip_forward 一起使用来实现桥接,但如前所述,这需要启用 ip_forward 并使 linux 像路由器一样工作,这需要仔细设置,因为它可能会引入一些安全问题。

# bridge setup
brctl addbr br0
ifconfig br0 10.10.20.1/24 up
 
# enable ipv4 forwarding
echo "1" > /proc/sys/net/ipv4/ip_forward
 
# netfilter cleanup
iptables --flush
iptables -t nat -F
iptables -X
iptables -Z
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
 
# netfilter network address translation
iptables -t nat -A POSTROUTING -o wlan0 -s 10.10.20.0/24  -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)

然后接口 br0 将可以访问 wlan0 网络

重要的和相关的

此外,非常重要的是,您不应使用过时的、已弃用的命令,如ifconfig、brctl等。iproute2 套件包含所有这些的命令,包括设置虚拟接口(我们曾经不得不使用 openvpn)和创建网桥。如果您不知道如何使用 ip 架设网桥,那么我们开始吧

  ip tuntap add tap0 mode tap user root 
  ip link set tap0 up
  ip link add br0 type bridge
  ip link set tap0 master br0
  ip link set eth0 master br0
  ip addr add 10.173.10.1/24  dev br0
  ip link set br0 up
Run Code Online (Sandbox Code Playgroud)

使用这组命令,我们创建了一个名为 tap0 的虚拟接口,然后创建了一个名为 br0 的网桥,然后将 eth0 和 tap0 绑定到网桥,我们为其分配了 IP 地址 10.173.10.1,然后将其全部启动。需要启动接口的三个单独实例(用于 tap0、eth0 和 br0)。

完成这项工作的技巧是使用 proxy.arp,它允许您的电脑(而不是您的 VM/Linux 容器/网络命名空间)代替它们回答 ARP 查询。

换句话说,通过在你的硬件接口和你的虚拟接口之间使用 IPv4 转发,你认为你可以将你的 VM/LXC/NNS 连接到你的 LAN,就好像它是一个物理接口一样,但事实并非如此:你忘记了绝对基本的 ARP 流量,这才是真正允许 LAN 运行的原因。所以,问题是:如果我正确转发 IPv4 流量,我如何还转发 ARP 流量,以便我的 VM/LXC/NNS 工作?诀窍是使用proxy-arp。

完整的答案在Bohdi Zazen 的博客中,标题很醒目:桥接无线网卡。他使用过时的包 uml-utilities 通过命令 tunctl 创建虚拟接口:这是他使用 uml-utilities 的唯一命令,因此您可以放心地忽略下载包,并使用命令 I上面写来创建一个 tap 或 tun 界面,无论你喜欢哪个,只需相应地修改命令。然后为您的 LXC 创建一个 veth 对,现在在 tap0 和 veth0 之间创建一个桥梁。这个名为 br0 的网桥是你必须代理 arp 的,而不是 Bohdi Zazen 描述的简单的 tap0 接口。


来源:askubuntu.comnullroute.eu.orgfirejail.wordpress.comsuperuser.com


Arn*_*out 5

取决于 AP 对您的意义:

1) 它可能只想看到来自您的数据包,以及您已知的链路层地址(因此不是桥接数据包) 2) 它实际上可能更聪明,并且知道哪个 IP 地址应该属于哪个链路层地址(因为它知道 DHCP 并检查它)

如果 1+2 都为真,则您确实需要诸如 IP NAT、DHCP、..

但如果只有 1) 是这种情况,您可以伪造链路层地址,并将其反向映射到另一个方向的正确地址,如下所述:

https://wiki.debian.org/BridgeNetworkConnections#Bridging_with_a_wireless_NIC


Tho*_*est 5

当适配器/驱动程序支持时,其他答案中描述的 4addr 当然是最好的方法,但并非所有方法都如此。NAT 可能适用于某些情况,但在 LAN 上的双向通信会出现问题(例如,连接打印机或访问 NAT 另一侧的其他物联网设备)。任何依赖广播/多播(例如自动发现、bonjour)的东西都将通过 NAT 失败。

另一种方法是使用 ARP 代理(parprouted),如https://wiki.debian.org/BridgeNetworkConnectionsProxyArp 中所述。我已经在 Raspberry Pi 上为打印机设置了它,它的工作原理就像一个魅力(我在post-up命令中添加了 10 秒的睡眠以让它首先获得一个 IP 地址,这可能与我的旧设备运行缓慢有关树莓派...)