Linux 开启 IP 转发无效,求解

2023-07-30 01:42:25 +08:00
 revlis7

家里有一台 Linux 上开了 VPN ,另一台 Mac 想通过这台 Linux 上网,我是按这个教程配置的 IP Forwarding 以及 Iptables: https://www.linode.com/docs/guides/linux-router-and-ip-forwarding/ 然后将 Mac 的网关指向 Linux

问题是在浏览器里打开网页时,可以看到页面加载,但是部分 JS 或图片链接一直显示超时,而且无论如何刷新这几个链接都是失效的。从 Linux 本机上打开任何页面都是没问题的,因为自己对 iptables 不熟,想问问各位大佬有什么办法没有?

另外我之前一直是在 Windows 上连 VPN ,然后共享网络连接给家里其他电脑,一直都没什么问题,今天想在 Linux 上试试,结果一直卡在这里,系统是 Fedora28/32 两个我都尝试过,如果在 Linux 想共享 VPN 连接,还有什么办法吗?

1170 次点击
所在节点    问与答
13 条回复
revlis7
2023-07-30 02:08:20 +08:00
再说到另一问题,我在 Mac 上拨 L2TP 的 VPN ,几乎每过一段时间必定会断线,短则几分钟,长则数小时,这也是为什么我这么费劲用别的电脑拨 VPN 的关系,这个问题我之前也问过,好像也没什么答案。

但是同样的 VPN 在我那台 Windows 7 上,可以一直保持连接数个月(今天试下来 Linux 应该也没什么问题),所以肯定是 Mac 系统的问题。
ysc3839
2023-07-30 06:02:02 +08:00
印象中只能用 iptables 配置 NAT 挺麻烦,我都是用 firewalld 的 add masquerade ,或者干脆用 OpenWrt
ysc3839
2023-07-30 06:02:45 +08:00
@ysc3839 打错了,是“印象中直接用 iptables”
billlee
2023-07-30 09:34:00 +08:00
看起来像是 PMTUD 的问题,在 iptables 加上 mss clamping 试试
revlis7
2023-07-30 10:15:23 +08:00
又研究了下,其实在 IP 转发设置后,不拨 VPN 时是可以正常访问所有网页的,在连上 VPN 之后,访问公司内网的页面也是 OK 的,问题只出在连上 VPN 再访问外网页面时部分连接会超时。
fantathat
2023-07-30 10:49:58 +08:00
看 ip 地址对应的网卡,内网网卡是不是新建的,是不是要将内网网卡与外网网卡建立连接啊
digimoon
2023-07-30 11:13:50 +08:00
op 可以直接贴一下连上 vpn 后那 linux 的路由表和 iptables 规则
revlis7
2023-07-30 12:02:17 +08:00
Destination Gateway Genmask Flags Metric Ref Use Iface
default 0.0.0.0 0.0.0.0 U 50 0 0 ppp0
default _gateway 0.0.0.0 UG 100 0 0 ens33
10.60.50.1 0.0.0.0 255.255.255.255 UH 50 0 0 ppp0
180.[VPN_ADDRESS] _gateway 255.255.255.255 UGH 100 0 0 ens33
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
_gateway 0.0.0.0 255.255.255.255 UH 100 0 0 ens33

Iptables 很简单,只有两条规则:
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 245K 155M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 10827 889K MASQUERADE all -- * * 0.0.0.0/0 0.0.0.0/0
revlis7
2023-07-30 12:08:55 +08:00
我觉得问题应该出在 DNS 上, 因为超时连接的错误都是 NS_ERROR_NET_TIMEOUT ,并且我在 Linux 上本机 nslookup 也都超时(但奇怪的是 Firefox 是可以正常打开网页的)
我搜到这篇文章: https://unix.stackexchange.com/questions/466105/iptables-masquerade-breaks-dns-lookups 说 MASQUERADE 规则可能会 break DNS 查询,因为 systemd-resolved 是工作在 127.0.0.53 上的,然后改了下 MASQUERADE 后,确实 Linux 本机的 nslookup 工作了,但是在 Mac 上还是不能打开网页,依旧是 NS_ERROR_NET_TIMEOUT
digimoon
2023-07-30 12:37:25 +08:00
不习惯看这种,路由表用 ip ro ,iptables 用 iptables-save
大概看了应该没啥问题,192.168.1.0 网段才会走 ens33 ,默认走 ppp0
如果只是 dns 问题那直接用 ip 应该是正常的,可以 ping 119.29.29.29
又或者 curl -H "host: baidu.com" 39.156.66.10

mtu 问题可以用
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
revlis7
2023-07-30 16:00:02 +08:00
还真的是 MTU 的问题,上午加 mss clamping 的时候用的-A 参数,错把规则添加到 FORWARD 最后了,所以没起作用,用了楼上的参数,添加到第一条规则就好了,感谢二位 @billlee @digimoon
billlee
2023-07-30 16:49:09 +08:00
其实,我们一般是把 TCPMSS 加在 mangle 表的,默认的表是 filter, 这个操作显然不属于过滤操作。
revlis7
2023-07-30 17:20:50 +08:00
Fixed

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/960889

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX