我在 CentOS 6.3 上使用 pppd 执行 PPPoE 时遇到问题。
CentOS 系统是一个专用的路由器/网关,可执行 NAT(双向)和各种数据包过滤。它具有用于 LAN 和 Internet 端的独立网卡,分别为 eth0 和 eth1。
互联网一侧是 DSL 调制解调器。调制解调器喜欢自己做所有事情,包括 NAT。为了防止它这样做,我必须给它无效的帐户信息,然后在 CentOS 系统上实现 PPPoE。
我在 CentOS 系统上执行 PPPoE 时遇到了问题,互联网连接非常不稳定。客户端可以访问某些网站,而不能访问其他网站,某些网页会加载一半,然后总是停在同一位置,TCP 连接经常会重置。
我已将其归结为 MTU 问题。通过将 MTU 从标准 1500 降低到 1492,我可以使 LAN 端的任何给定客户端系统(所有 Windows)都能正常工作。
另一方面,如果我允许调制解调器执行 PPPoE 和 NAT,在 eth1 上启用 IP 和 DHCP 客户端,并将 IP 过滤脚本设置为路由到 eth1 而不是 ppp0,则客户端可以在将 MTU 设置为 1500 的情况下正常工作。(此配置的问题是双重 NAT 会影响性能并使入站连接路由更加棘手。)
Ping 测试(使用 DF)显示 Internet 绑定的 MTU 实际上仍然限制为 1492,即使客户端不需要如此设置。
因此,看起来客户端通常正在执行路径 MTU 发现,但 pppd(或者可能是 NetFilter)以某种方式妨碍了它。
我通常会将 CentOS 系统上的 NetFilter (iptables) 设置为丢弃所有 INPUT 和 OUTPUT 流量(因为系统的唯一任务是转发)。我尝试暂时将这些策略更改为 ACCEPT,以防路径 MTU 发现依赖于来自它的 ICMP 错误,但问题仍然存在。
我在 PPPoE 方面一点经验都没有,希望有人能够指出我正确的方向。谢谢!
答案1
首先,PMTUd 确实要求 ICMP转发的发送到发送流量的机器。但如果您允许 RELATED,ESTABLISHED 所需的 ICMP 将被允许通过。具有连接跟踪功能的 NAT 会将其返回到正确的机器。
不过,您可能正在寻找这条神奇的 iptables 行:
iptables -t mangle -I FORWARD -p tcp -o ppp0 -j TCPMSS --set-mss 1452 # MTU-40 for IPv4
# use the correct outbound interface in place of ppp0
您的路由器可能会自动执行此操作。