将wlan0桥接到eth0


25

在Arch Linux上,我希望eth0(连接到桥接路由器)共享从wlan0接收的连接,我已经阅读了教程,但是我对其他用户不是很精明,也不完全理解。


8
请不要在问题或标题中输入“ [已解决]”,接受答案是表明问题已解决的正确方法。它可以更改问题在主列表中的显示方式,并在标记为正确的答案上添加绿色的复选标记。
Zypher

1
如果没有人对此页面造成混乱,我将不胜感激。如果您有任何问题,请与我联系。谢谢。
dbdii407 2010年

13
serverfault.com/faq标题为“其他人可以编辑我的东西”
Zypher 2010年

@Zypher链接到的URL不再存在。相关段落是否移至其他地方?
kasperd 2015年

Answers:


24

更新

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

设定NAT

应该改用NAT:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

分配IP

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

ifconfig eth0 10.0.0.1 netmask 255.255.255.0 up

安装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;
}

启动dhcpd

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

就是这样!

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


brctl addbr mybridge
brctl addif mybridge eth0
brctl addif mybridge wlan0

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

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

dhclient -d mybridge

3
您实际上不需要桥接接口的IP地址即可进行桥接。
Massimo 2010年

7
无法将wlan0添加到网桥mybridge:不支持的操作
dbdii407 2010年

1
@Massimo:是的,这是真的。需要有效的IP才能从“桥接设备”访问网络。
cstamas 2010年

10
NAT与桥接完全不同。桥接是第二层,NAT是第三层,特定于IPv4。我不明白为什么这是一个可以接受的答案。
WhyNotHugo 2014年

3
@Hugo IP NAT是第3层,但MAC NAT是第2层。对于WiFi桥接,可以使用4addr,WDS,MAC NAT,也可以在第3层做一些事情(例如IP NAT)。
David Schwartz

27

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

# iw dev <wifiInterface> set 4addr on

即:

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

# iw dev <wifiInterface> set 4addr on
# brctl addif <bridgename> <wifiInterface>

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

# brctl show

2
此设置是做什么的,为什么您特别建议在这种情况下使用它?
hakre

当尝试将wlan0接口添加到网桥接口时,这是针对“不允许操作”错误的解决方案。之后,您必须在/ etc / network / interfaces中指定网桥接口,以便在启动后启动。
Str82DHeaD

1
@hakre该4addr模式使WiFi的行为像有线以太网一样足够,桥接将起作用。没有它,没有NAT桥接将无法进行。
David Schwartz

1
4addr确实要求无线链接的两端都支持它(假定您正在尝试实现wifi扩展器)
nhed

5

取决于AP对您的重要性:

1)它可能只希望看到来自您的数据包,并且具有您知道的链路层地址(因此不是桥接数据包)2)实际上可能更聪明,并且知道哪个IP地址应该属于哪个链路层地址(原因它知道DHCP并对其进行检查)

如果1 + 2都为真,则确实需要IP NAT,DHCP等。

但是,如果只有1),则可以伪造链路层地址,然后按相反方向将其反向映射到正确的地址,如此处所述:

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


真的很乱 每次添加新计算机时,它都需要进行额外的设置。
迈克尔·汉普顿

4

如适配器/驱动程序所支持,其他答案中所述的4addr当然是最好的方法,但并非所有人都支持。NAT可能在某些方面起作用,但是通过局域网双向进行正确的通信将成为问题(例如,连接打印机或访问NAT另一端的其他IoT设备)。依赖广播/多播的任何内容(例如自动发现,bonjour)都将通过NAT失败。

替代方法是使用https://wiki.debian.org/BridgeNetworkConnectionsProxyArp中所述的ARP代理(经过仿制)。我已经在用于打印机的Raspberry Pi上进行了设置,它的工作原理就像一个魅力(我在post-up命令中添加了10秒的睡眠时间,以使其首先获得IP地址,这可能与我以前的速度慢有关RPi ...)


到目前为止,我所看到的指向proxy-arp plus dhcp-helper解决方案的链接是最兼容,最干净的解决方案。
明华

3

网桥wlan和4addr:

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

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

iw dev wlan0 set 4addr on

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

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

iw dev wlan0 set 4addr off

然后,添加另一个接口-名称是任意选择的-具有不同的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

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

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

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

直接WLAN桥

在某些情况下,您也可以使用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

然后,接口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

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

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

换句话说,通过在硬件接口和虚拟接口之间使用IPv4转发,您认为可以将VM / LXC / NNS像物理接口一样连接到LAN,但这不是真的:您完全忘记了基本的ARP流量,这才是真正允许LAN运行的功能。因此,问题是:如果我正确转发了IPv4流量,又如何转发ARP流量,以便我的VM / LXC / NNS正常工作?诀窍是使用proxy-arp。

完整的答案在Bohdi Zazen的Blog中,标题很显眼:Bridge无线卡。他使用过时的软件包uml-utilities来通过命令tunctl创建虚拟接口:这是他唯一使用uml-utilities的命令,因此您可以放心地忽略下载该软件包,并使用命令I上面写的创建了一个tap或tun界面,您可以随意修改相应的命令。然后为您的LXC创建一个veth对,现在在tap0和veth0之间创建一个桥接。必须将此桥称为br0,而不是Bohdi Zazen描述的简单tap0接口。


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


0

我喜欢Proxy Arp方法,但是最初的问题指定了Arch Linux。这是Raspbian实现的Arch Linux版本。我很努力地适应从Debian维基原来的做法提到这里NETCTL使用ExecUpPostExecDownPre没有成功。一切都在命令行中运行,但不在配置文件中。

步骤:

  1. 使用systemd-networked实现无线联网。在.network文件中,设置IPForward=yes。我使用WPA请求方来管理无线网络接口。
  2. 启用的mDNS通过设置中继enable-reflector=yes/etc/avahi/avahi-daemon.conf; 启动并启用(avahi-daemon.service如果尚未启用)。
  3. 从AUR 安装parprouting,并通过改编Raspbian答案中的一个为其创建服务文件。我发现没有必要将接口设置为混杂的。自然,此服务将需要启动并启用。
[Unit]
Description=proxy arp routing service
Documentation=/raspberrypi//q/88954/79866

[Service]
Type=forking
# Restart until wlan0 gained carrier
Restart=on-failure
RestartSec=5
TimeoutStartSec=30
ExecStartPre=/lib/systemd/systemd-networkd-wait-online --interface=wlan0 --timeout=6 --quiet
ExecStartPre=/usr/bin/echo 'systemd-networkd-wait-online: wlan0 is online'
# clone the dhcp-allocated IP to eth0 so dhcrelay will relay for the correct subnet
ExecStartPre=/usr/bin/bash -c '/usr/bin/ip addr add $(/usr/bin/ip -4 -br addr show wlan0 | /usr/bin/grep -Po "\\d+\\.\\d+\\.\\d+\\.\\d+")/32 dev eth0'
ExecStartPre=/usr/bin/ip link set dev eth0 up

#         v minus sign
ExecStart=-/usr/bin/parprouted eth0 wlan0

ExecStopPost=/usr/bin/ip link set dev eth0 down
ExecStopPost=/usr/bin/bash -c '/usr/bin/ip addr del $(/usr/bin/ip -4 -br addr show eth0 | /usr/bin/grep -Po "\\d+\\.\\d+\\.\\d+\\.\\d+")/32 dev eth0'

[Install]
WantedBy=wpa_supplicant@wlan0.service
  1. 要为连接到以太网端口的设备支持DHCP,请创建dhcrelay(通过DHCP程序包)服务。通过对日志进行grep查找来查找DHCP服务器的地址似乎很麻烦,但是可以。启动并启用。
[Unit]
Description=DHCRelay Service
After=network-online.target parprouted_bridge.service
Type=simple

[Service]
ExecStart=/usr/bin/bash -c '/usr/bin/dhcrelay -d -4 -iu wlan0 -id eth0 $(/usr/bin/journalctl -b -u systemd-networkd.service | /usr/bin/grep -Po "via\s+\K\\d+\\.\\d+\\.\\d+\\.\\d+")'

[Install]
WantedBy=multi-user.target

这种方法对带有ArchLinuxArm的Raspberry Pi Model B +(适用于带有RT5370芯片组的USB WiFi适配器)有效。由于Pi将仅通过以太网为打印机提供WiFi,因此我希望它对粗暴处理具有鲁棒性,因此下一步是将SD卡配置为只读

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.