我正在尝试将树莓派设置为无线接入点和路由器之间的网桥(原因是我想将设备连接到 AP 并tc
在 pi 上使用来模拟较差的网络)。路由器连接到 pi at eth0
,AP 连接到 pi at eth1
(USB 转以太网适配器)。
我正在使用dhcpcd
并dnsmasq
尝试实现这一点。但是,即使我可以将设备连接到 AP 并且为其提供了 IP 地址(在 中指定的范围内dhcpcd.conf
),所有 ping(无论是域还是 IP 地址)都会超时(当我什至无法 ping pi 时)连接到 AP)。
我已启用 ipv4 转发/etc/sysctl.conf
:
net.ipv4.ip_forward=1
dhcpcd.conf
我添加了默认值:
# eth1 is connected to the AP
interface eth1
# This is the ip address of the Raspberry Pi
static ip_address=10.0.0.100/24
# This is the ip address of the router
static routers=10.0.0.1
我的dnsmasq.conf
看起来像这样(我不完全确定接口是否正确,我已将其设置为连接到 AP 的接口,但将其更改为eth0
似乎没有任何区别):
interface=eth1
listen-address=10.0.0.100
bind-interfaces
server=8.8.8.8
server=8.8.4.4
domain-needed
bogus-priv
dhcp-range=10.0.0.110,10.0.0.130,4h
我运行这些命令来添加 iptable 规则(然后我将 iptables 保存到文件中,并通过 启动时恢复它们rc.local
):
sudo iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
sudo iptables -A FORWARD -i eth1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
根据我的阅读,上面的规则应该可以通过 pi 正确转发流量,但情况似乎并非如此。
dhcpcd
我检查了和服务的状态dnsmasq
,但没有看到任何看起来像错误的内容。
dhcpcd
地位:
● dhcpcd.service - dhcpcd on all interfaces
Loaded: loaded (/lib/systemd/system/dhcpcd.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/dhcpcd.service.d
└─wait.conf
Active: active (running) since Tue 2019-02-26 12:02:43 GMT; 29min ago
Main PID: 368 (dhcpcd)
CGroup: /system.slice/dhcpcd.service
└─368 /sbin/dhcpcd -q -w
Feb 26 12:02:43 raspberrypi dhcpcd[368]: eth0: offered 10.0.0.140 from 10.0.0.1
Feb 26 12:02:43 raspberrypi dhcpcd[368]: eth0: probing address 10.0.0.140/24
Feb 26 12:02:47 raspberrypi dhcpcd[368]: eth0: using IPv4LL address 169.254.202.179
Feb 26 12:02:47 raspberrypi dhcpcd[368]: eth0: adding route to 169.254.0.0/16
Feb 26 12:02:48 raspberrypi dhcpcd[368]: eth0: leased 10.0.0.140 for 86400 seconds
Feb 26 12:02:48 raspberrypi dhcpcd[368]: eth0: adding route to 10.0.0.0/24
Feb 26 12:02:48 raspberrypi dhcpcd[368]: eth0: adding default route via 10.0.0.1
Feb 26 12:02:49 raspberrypi dhcpcd[368]: eth0: deleting route to 169.254.0.0/16
Feb 26 12:02:50 raspberrypi dhcpcd[368]: eth0: no IPv6 Routers available
Feb 26 12:02:50 raspberrypi dhcpcd[368]: eth1: no IPv6 Routers available
dnsmasq
地位:
● dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server
Loaded: loaded (/lib/systemd/system/dnsmasq.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2019-02-26 12:02:43 GMT; 33min ago
Main PID: 401 (dnsmasq)
CGroup: /system.slice/dnsmasq.service
└─401 /usr/sbin/dnsmasq -x /run/dnsmasq/dnsmasq.pid -u dnsmasq -r /run/dnsmasq/resolv.conf -7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new --local-service --trust-anchor=.,19036,8,2,49aac11d7b6f6446702e54a1607371607a1a41855200fd2ce1cdde32f24e8fb5 --trust-anchor=.,20326,8,2,e06d44b80b8f1d39a95c0b0d7c65d0
Feb 26 12:02:50 raspberrypi dnsmasq-dhcp[401]: DHCPDISCOVER(eth1) a0:f3:c1:6d:2f:1b
Feb 26 12:02:50 raspberrypi dnsmasq-dhcp[401]: DHCPOFFER(eth1) 10.0.0.129 a0:f3:c1:6d:2f:1b
Feb 26 12:02:50 raspberrypi dnsmasq-dhcp[401]: DHCPDISCOVER(eth1) a0:f3:c1:6d:2f:1b
Feb 26 12:02:50 raspberrypi dnsmasq-dhcp[401]: DHCPOFFER(eth1) 10.0.0.129 a0:f3:c1:6d:2f:1b
Feb 26 12:02:58 raspberrypi dnsmasq-dhcp[401]: DHCPDISCOVER(eth1) a0:f3:c1:6d:2f:1b
Feb 26 12:02:58 raspberrypi dnsmasq-dhcp[401]: DHCPOFFER(eth1) 10.0.0.129 a0:f3:c1:6d:2f:1b
Feb 26 12:02:58 raspberrypi dnsmasq-dhcp[401]: DHCPREQUEST(eth1) 10.0.0.129 a0:f3:c1:6d:2f:1b
Feb 26 12:02:58 raspberrypi dnsmasq-dhcp[401]: DHCPACK(eth1) 10.0.0.129 a0:f3:c1:6d:2f:1b TL-WR702N
Feb 26 12:35:05 raspberrypi dnsmasq-dhcp[401]: DHCPREQUEST(eth1) 10.0.0.124 f4:5c:89:8e:aa:a1
Feb 26 12:35:05 raspberrypi dnsmasq-dhcp[401]: DHCPACK(eth1) 10.0.0.124 f4:5c:89:8e:aa:a1 george
在此状态下,TL-WR702N
是AP,george
是与AP 连接的设备。
我很困惑我哪里出错了。我正在关注教程用于将 pi 设置为桥接器,并尝试通过参考 的手册页来调试此问题dnsmasq
,dhcpcd
但iptables
无济于事。
圆周率有自设置后已重新启动。
答案1
查看链接的教程后(https://pimylifeup.com/raspberry-pi-wifi-bridge/),我可以得出这样的结论:不是桥接教程,而是 NAT/路由器教程。甚至其中的评论也指出:
另外,需要注意的是,此设置是一个 wifi 客户端 NAT 路由器,从技术上讲不是一个桥接器。
因此,要实际使用桥,请遵循桥教程。既然是 Raspbian,Debian 的桥接网络连接应该足够好了。提到的bridge-utils包并不是真正需要的(已过时)brctl
可以完全被现代命令取代ip路由2的ip link
和(如果确实需要)bridge
,但对于其bridge-utils-interfaces
插件如果向上向下的配置。
因此最终可以使用类似以下内容来完成配置:
iface eth0 inet manual
iface eth1 inet manual
auto br0
iface br0 inet dhcp
bridge_ports eth0 eth1
不要在真实接口上放置任何 IP,因为它们现在成为桥接端口,并且它们的第 3 层设置将被忽略。同样不重要,但网桥应继承其第一个接口的 MAC 地址。因此,如果它确实很重要并且您希望使用 eth1 的 MAC,请将其放在命令的前面bridge_ports
(这也可能会更改路由器的 DHCP 提供)。
现在将eth0
各种设置中的任何引用更改为将接口声明为br0
,但很可能您甚至不需要它,因为例如您不再需要dnsmasq
.就是这样。
一些额外的信息:
如果您曾经使用过
iptables
替代或补充ebtables
尝试在两个接口之间进行过滤(提示:您可能不应该,它现在是一个网桥,而不是路由器,但它是状态透明防火墙网桥所需要的),请注意,如果激活br-netfilter桥接过滤和 IP 过滤层之间的特殊交互:基于 Linux 的桥上的 ebtables/iptables 交互。当不了解这一点时,这可能会导致难以调试的结果。许多
tc qdisc
效果(如netem
)仅适用于传出方向(出口)。由于您处于两个接口eth0
和之间eth1
,您可能会想,您总是可以找到用于特定预期操作的出口接口,但如果完成,eth0
那么 RPi 本身可能会在互联网端受到影响,这可能不是我们所希望的。您可以通过附加一个来避免这种情况中间功能块设备(ifb0
) 到eth1
:这会人为地在入口和网络代码的其余部分之间插入一个接口。因此,从传入数据流的角度来看,该接口现在是一个出口接口eth1
,并且可以愉快地接受诸如netem
.对于任何其他解释,它都是入口流的一部分。您现在可以将 TC 应用到eth1
和ifb0
并不受干扰地离开eth0
。我的回答中有更多信息:使用netem模拟桥接接口上的丢包