我已经成功地完成了以下工作:
ip netns add quarantine
ip link add eth0-q type veth peer name veth-q
ip link add br0 type bridge
ip link set veth-q master br0
ip link set br0 up
ip link set veth-q up
ip link set eth0-q netns quarantine
ip netns exec quarantine ip link set lo up
ip netns exec quarantine ip link set eth0-q up
ip netns exec quarantine ip address add 192.168.66.5/24 dev eth0-q
ip netns exec quarantine dnsmasq --interface=eth0-q --dhcp-range=192.168.66.10,192.168.66.50,255.255.255.0
ip link set eno1 master br0
这允许我运行 dnsmasq 实例,而不会干扰网络管理器,并让通过我的默认以太网接口 (eno1) 连接的设备获得 192.168.66.0/24 中的 IP
然后我决定授予互联网访问权限,我这样做了:
ip address add 192.168.66.1/24 dev br0
iptables -A FORWARD -i wlp58s0 -o br0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -o wlp58s0 -o br0 -j ACCEPT
iptables -A FORWARD -j LOG
iptables -t nat -A POSTROUTING -o wlp58s0 -j MASQUERADE
sysctl -w net.ipv4.ipforward=1
sysctl -p
其中 wlp58s0 是连接到我家 WiFi 的 WiFi 接口。我还必须杀死前面描述的 dnsmasq 并将其替换为:
ip netns exec quarantine dnsmasq --interface=eth0-q \
--dhcp-range=192.168.66.10,192.168.66.50,255.255.255.0 \
--dhcp-option=3,192.168.66.1 --dhcp-option=6,8.8.8.8
这样,通过 eno1 连接的设备就知道要找到网关并向 Google DNS 服务器 8.8.8.8 请求 DNS 查询。
所有这些都工作得很好,重新启动我的机器后,所有配置都按预期消失,并且一切正常。
然而:在早期的尝试中,我采纳了在互联网上找到的建议来启用数据包转发,并且我没有使用 sysctl,而是这样做:
echo 1 > /proc/sys/net/ipv4/ip_forward
在我已经将我的设备连接到 eno1 上(它已经有一个 IP)后,这已经授予了互联网访问权限。
但是:重新启动我的机器后,该 ip 转发设置已变得持久。而且:在我写了 1 的地方写了 0 是不持久的。更糟糕的是:初始设置(无法访问互联网,仅分发 IP)被破坏,我在 eno1 上的设备无法再从我一开始描述的配置中获取 IP。我使用wireshark:在br0上可以看到对IP的请求,但从veth-q上消失了,更奇怪的是:在veth-q上只能看到IPv6流量,ipv4流量完全消失了。通过向 /proc/sys/net/ipv4/ip_forward 写入 0 来手动禁用 IP 转发没有任何帮助。最终,我重新安装了我的 Linux 发行版(Ubuntu),并注意不再使用 echo 命令,并使用 sysctl 执行操作,这不会导致任何问题。
为什么会发生这种情况?这是一种非常奇怪和奇特的行为,因为我的计算机的其他一切似乎都工作得很好:我可以访问互联网,一切似乎都恢复正常,但网桥和 veth 之间的交互已损坏。
任何对此的启发将不胜感激!
答案1
因此,与我最初的想法相反,将 1 写入 /proc/sys/net/ipv4/ip_forward 是不是问题。
问题似乎与docker有关。
禁用 docker 后,我从网桥和虚拟以太网中观察到更正常的行为。
我将在这个答案的评论中写下我能找到的任何内容(更准确地说,是从 docker 导致了这个问题),但是,至少我可以有把握地说,手动将 1 写入 /proc/sys/net/ipv4/ip_forward 是不是问题,我想这在技术上解决了我的问题。