我刚刚从 Centurylink 提供的无线接入点改为使用 Linux 服务器连接到 Centurylink 的网络。
有些网站似乎在 TLS 握手时挂起,尤其是 kahoot.it 和 duckduckgo.com。Linux 上的 Firefox、Linux 上的 Lynx、Windows 上的 Chrome 和 curl 都挂起。这个 curl 命令是我能获得的最有用的信息:
135 % curl -v https://duckduckgo.com
* Trying 40.89.244.232:443...
* Connected to duckduckgo.com (40.89.244.232) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
* CApath: none
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* OpenSSL SSL_connect: Connection reset by peer in connection to duckduckgo.com:443
* Closing connection 0
curl: (35) OpenSSL SSL_connect: Connection reset by peer in connection to duckduckgo.com:443
奇怪的是,openssl s_client kahoot.it:443
有效。
https://kahoot.com作品,https://google.com可以工作,大多数其他网站也可以工作。
这到底发生了什么事?
以下是一些服务器详细信息:Arch linux,5.9.16.a-1-hardened 内核。
因为它是 Centurylink,所以我必须将 VLAN ID 设置为 201
ip link add link eno3 name eno3.201 type vlan id 201
:。
我已经按照 Arch Linux wiki 上关于 PPPoE 的介绍使用 PPPoE 来让服务器工作。
我已打开 IPv4 转发,并启用了 IPv4 NAT,以下是用于实现网络连接的 systemd 单元文件的摘录:
ExecStart=/usr/bin/modprobe iptable_nat
ExecStart=/usr/bin/sysctl net.ipv4.ip_forward=1
ExecStart=/usr/bin/iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE
ExecStart=/usr/bin/iptables -A FORWARD -o eno3 -i eno1 -s 10.0.0.0/24 -m conntrack --ctstate NEW -j ACCEPT
ExecStart=/usr/bin/iptables -t nat -A POSTROUTING -s 10.0.10.0/24 -j MASQUERADE
ExecStart=/usr/bin/iptables -A FORWARD -o eno3 -i eno2 -s 10.0.10.0/24 -m conntrack --ctstate NEW -j ACCEPT
ExecStart=/usr/bin/iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
服务器有网络设备 eno1、eno2、eno3、eno4。eno4 上没有任何设备连接。eno3 是我让 pppd 在其上工作的设备:
# ip -br l
lo UNKNOWN 00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
eno1 UP 44:a8:42:2d:c2:55 <BROADCAST,MULTICAST,UP,LOWER_UP>
eno2 UP 44:a8:42:2d:c2:56 <BROADCAST,MULTICAST,UP,LOWER_UP>
eno3 UP 44:a8:42:2d:c2:57 <BROADCAST,MULTICAST,UP,LOWER_UP>
eno4 DOWN 44:a8:42:2d:c2:58 <BROADCAST,MULTICAST>
eno3.201@eno3 UP 44:a8:42:2d:c2:57 <BROADCAST,MULTICAST,UP,LOWER_UP>
ppp0 UNKNOWN <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP>
[root@monarch ~]# ip -br a
lo UNKNOWN 127.0.0.1/8 ::1/128
eno1 UP 10.0.0.1/24 fe80::46a8:42ff:fe2d:c255/64
eno2 UP 10.0.10.1/24 fe80::46a8:42ff:fe2d:c256/64
eno3 UP fe80::46a8:42ff:fe2d:c257/64
eno4 DOWN
eno3.201@eno3 UP fe80::46a8:42ff:fe2d:c257/64
ppp0 UNKNOWN 71.33.205.38 peer 207.225.112.2/32
答案1
我在 Arch Linux wiki 中找到了一个想法,ppp 的条目:
pppoe 下的 MTU 为 1492 字节。大多数站点使用 1500 的 MTU。因此,您的连接会发送 ICMP 3:4(需要分片)数据包,要求较小的 MTU,但有些站点的防火墙会阻止该数据包。
在 iptables 中实现 PMTU 限制的命令是:
iptables -I FORWARD -o ppp0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
这对我的设置有效,其中pppd
创建了 ppp0 网络设备。