谁能帮忙解答一下linux路由问题?本质上,我想使用 Ubuntu 笔记本电脑来提供对附加网络的互联网访问。
我有一个 Raspberry pi,有 wifi 网络 (192.168.42.0/24)。它的IP地址是192.168.42.20。
互联网接入由手机热点提供。 (192.168.43.0/24)。互联网网关是 192.168.43.1
我有一台 Linux 笔记本电脑(Ubuntu),带有两个 wifi 卡 - 上述网络各一个。 (192.168.42.21 和 192.168.43.10)
我还在以太网卡上连接了另一个网络,该网络成功与客户端共享互联网连接。该网络是 10.42.0.0/24。在本例中,笔记本电脑是 DHCP 服务器,其 IP 为 10.42.0.1
我正在尝试使用笔记本电脑为 Pi 提供互联网访问路由,我已向笔记本电脑添加了以下 iptable 规则。它们源自 10.42.0./24 网络的转发规则,正如我所说,该网络可以连接到互联网。
-A FORWARD -d 192.168.42.0/24 -o wlx801f0281f02a -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.42.0/24 -i wlx801f0281f02a -j ACCEPT
-A FORWARD -i wlx801f0281f02a -o wlx801f0281f02a -j ACCEPT
ip_forwarding is enabled
我在 Pi 上添加了一条路线。路由表现在显示为:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.42.21 0.0.0.0 UG 0 0 0 wlan0
192.168.42.0 0.0.0.0 255.255.255.0 U 303 0 0 wlan0
Pi 可以 ping 通其他网络,并且其他两个网络也可以 ping 通 Pi。
但是......尽管 10.42.0.117 上的设备可以愉快地连接到外部世界,但 Pi 仍然无法访问互联网。
10.42.0.117 上的路由表与 Pi 的路由表完全“平行”:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.42.0.1 0.0.0.0 UG 0 0 0 eth0
10.42.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
我缺少什么?
答案1
所以答案(在 @YoMismo 让我走上正轨之后)是再添加一条 iptables 规则:
sudo iptables --table nat -A POSTROUTING -s 192.168.42.0/24 ! -d 192.168.42.0/24 -j MASQUERADE
结果可以看到
sudo iptables -t nat -L -n -v
所以总结一下:在需要访问的设备上添加路由如下:
sudo ip route add 0.0.0.0/0 via 192.168.42.21 dev wlan0
192.168.42.21是“linux路由器”上“桥接”wifi适配器的IP地址
然后将iptables规则添加到“linux路由器”中,如下所示:
sudo iptables -A FORWARD -d 192.168.42.0/24 -o wlx801f0281f02a -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -s 192.168.42.0/24 -i wlx801f0281f02a -j ACCEPT
sudo iptables -A FORWARD -i wlx801f0281f02a -o wlx801f0281f02a -j ACCEPT
sudo iptables --table nat -A POSTROUTING -s 192.168.42.0/24 ! -d 192.168.42.0/24 -j MASQUERADE
同样,wlx801f0281f02a 是我用来连接到网络 192.168.42.0/24 的桥接 wifi 适配器接口。
因此,源设备上的互联网请求将使用源设备上的路由路由到“linux 路由器”上的 192.168.42.21,并在其中进行 NAT 并转发到网关。
请注意,ip_forward 已启用。
如果需求是临时/临时的,则使规则持久化或将它们放入 bash 脚本中。