V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
revlis7
V2EX  ›  问与答

Linux 开启 IP 转发无效,求解

  •  
  •   revlis7 · 284 天前 · 1035 次点击
    这是一个创建于 284 天前的主题,其中的信息可能已经有所发展或是发生改变。

    家里有一台 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 连接,还有什么办法吗?

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

    但是同样的 VPN 在我那台 Windows 7 上,可以一直保持连接数个月(今天试下来 Linux 应该也没什么问题),所以肯定是 Mac 系统的问题。
    ysc3839
        2
    ysc3839  
       284 天前 via Android   ❤️ 1
    印象中只能用 iptables 配置 NAT 挺麻烦,我都是用 firewalld 的 add masquerade ,或者干脆用 OpenWrt
    ysc3839
        3
    ysc3839  
       284 天前 via Android
    @ysc3839 打错了,是“印象中直接用 iptables”
    billlee
        4
    billlee  
       284 天前   ❤️ 1
    看起来像是 PMTUD 的问题,在 iptables 加上 mss clamping 试试
    revlis7
        5
    revlis7  
    OP
       283 天前
    又研究了下,其实在 IP 转发设置后,不拨 VPN 时是可以正常访问所有网页的,在连上 VPN 之后,访问公司内网的页面也是 OK 的,问题只出在连上 VPN 再访问外网页面时部分连接会超时。
    fantathat
        6
    fantathat  
       283 天前 via iPhone   ❤️ 1
    看 ip 地址对应的网卡,内网网卡是不是新建的,是不是要将内网网卡与外网网卡建立连接啊
    digimoon
        7
    digimoon  
       283 天前   ❤️ 1
    op 可以直接贴一下连上 vpn 后那 linux 的路由表和 iptables 规则
    revlis7
        8
    revlis7  
    OP
       283 天前
    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
        9
    revlis7  
    OP
       283 天前
    我觉得问题应该出在 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
        10
    digimoon  
       283 天前   ❤️ 1
    不习惯看这种,路由表用 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
        11
    revlis7  
    OP
       283 天前
    还真的是 MTU 的问题,上午加 mss clamping 的时候用的-A 参数,错把规则添加到 FORWARD 最后了,所以没起作用,用了楼上的参数,添加到第一条规则就好了,感谢二位 @billlee @digimoon
    billlee
        12
    billlee  
       283 天前   ❤️ 1
    其实,我们一般是把 TCPMSS 加在 mangle 表的,默认的表是 filter, 这个操作显然不属于过滤操作。
    revlis7
        13
    revlis7  
    OP
       283 天前
    Fixed
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   6210 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:56 · PVG 09:56 · LAX 18:56 · JFK 21:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.