Linux 开启 IP 转发无效,求解

295 天前
 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 连接,还有什么办法吗?

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

但是同样的 VPN 在我那台 Windows 7 上,可以一直保持连接数个月(今天试下来 Linux 应该也没什么问题),所以肯定是 Mac 系统的问题。
ysc3839
295 天前
印象中只能用 iptables 配置 NAT 挺麻烦,我都是用 firewalld 的 add masquerade ,或者干脆用 OpenWrt
ysc3839
295 天前
@ysc3839 打错了,是“印象中直接用 iptables”
billlee
295 天前
看起来像是 PMTUD 的问题,在 iptables 加上 mss clamping 试试
revlis7
295 天前
又研究了下,其实在 IP 转发设置后,不拨 VPN 时是可以正常访问所有网页的,在连上 VPN 之后,访问公司内网的页面也是 OK 的,问题只出在连上 VPN 再访问外网页面时部分连接会超时。
fantathat
295 天前
看 ip 地址对应的网卡,内网网卡是不是新建的,是不是要将内网网卡与外网网卡建立连接啊
digimoon
295 天前
op 可以直接贴一下连上 vpn 后那 linux 的路由表和 iptables 规则
revlis7
294 天前
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
294 天前
我觉得问题应该出在 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
294 天前
不习惯看这种,路由表用 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
294 天前
还真的是 MTU 的问题,上午加 mss clamping 的时候用的-A 参数,错把规则添加到 FORWARD 最后了,所以没起作用,用了楼上的参数,添加到第一条规则就好了,感谢二位 @billlee @digimoon
billlee
294 天前
其实,我们一般是把 TCPMSS 加在 mangle 表的,默认的表是 filter, 这个操作显然不属于过滤操作。
revlis7
294 天前
Fixed

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

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

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

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

© 2021 V2EX