我正在设置 Gentoo Linux 家用路由器,配置如下:
eth0
:连接到 WAN(由 systemd-networkd 管理)wlan0
:LAN 接入点(由 hostapd 管理)
我将其用作dnsmasq
LAN 机器的 DNS 和 DHCP 服务器。
当前问题:我可以连接到路由器,但客户端无法连接互联网。
一些信息:
- 客户端名称服务器:路由器的 IP。
- 从路由器 ping google.com 正常。
- 从客户端机器到路由器的 Ping 操作正常。
- 从客户端机器 ping google.com 总是超时(但域名已解析)
- 路由器:
iptables -t {filter,nat,mangle,raw} -L
显示所有表中的所有链都有策略ACCEPT
- 路由器:
iptables -t nat -L
显示预期结果iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
- 确认的
sys.net.ipv4.ip_forward = 1
我在不同的客户端机器上测试了上述内容,并且这些客户端机器经过测试可以与其他 wifi 热点配合良好。
我不知道如何解决此问题,似乎按照常规程序操作即可,但客户端的互联网访问就是无法正常工作。如果您能提供下一步检查的提示或解决此问题的方法,我将不胜感激!
编辑:
这里的问题看起来与这个类似:流量未通过 NAT 转发。不过,我确实确认过了sys.net.ipv4.ip_forward = 1
。
以路由器为A
,客户端为B
。
ifconfig
在B
:
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether xx:xx:xx:xx:xx:xx
inet6 fe80::xxxx:xxxx:xxxx:xxxx%en0 prefixlen 64 scopeid 0x4
inet 192.168.1.62 netmask 0xffffff00 broadcast 192.168.1.255
nd6 options=1<PERFORMNUD>
media: autoselect
status: active
ifconfig
在A
:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet xx.xx.xx.154 netmask 255.255.254.0 broadcast xx.xx.xx.255
inet6 fe80::xxxx:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x20<link>
ether xx:xx:xx:xx:xx:xx txqueuelen 1000 (Ethernet)
RX packets 251116 bytes 22652889 (21.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 11731 bytes 979877 (956.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 16 memory 0xdf100000-df120000
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.199 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::xxxx:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x20<link>
ether xx:xx:xx:xx:xx:xx txqueuelen 1000 (Ethernet)
RX packets 12867 bytes 1090816 (1.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1272 bytes 306689 (299.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
iptables -S
在A
:
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
iptables -S -t nat
在A
:
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A POSTROUTING -o eth0 -j MASQUERADE
ping -n google.com
在A
:
PING google.com (216.58.192.206) 56(84) bytes of data.
64 bytes from 216.58.192.206: icmp_seq=1 ttl=57 time=1.29 ms
64 bytes from 216.58.192.206: icmp_seq=2 ttl=57 time=1.52 ms
[continued]
ping -n google.com
在B
:
PING google.com (216.58.192.206): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
[continued]
traceroute -i en0 8.8.8.8
在B
:
traceroute to 8.8.8.8 (8.8.8.8), 64 hops max, 52 byte packets
1 192.168.1.199 (192.168.1.199) 2.054 ms 2.033 ms 2.018 ms
2 * * *
3 * * *
4 * * *
答案1
编辑 /etc/sysctl.conf 以包含此行,然后重新启动:
net.ipv4.ip_forward=1
答案2
我发现我ip_forward
在设置iptables
规则之前已经设置了内核标志。我发现如果我在一切完成后禁用并再次启用它,NAT 将正常工作。所以现在我在脚本中输入了echo 1 > /proc/sys/net/ipv4/ip_forward
after命令,它就可以正常工作了!iptables
我仍然不知道为什么顺序如此重要。任何解释仍然会受到欢迎。