一些网站在 TLS 握手时挂起

一些网站在 TLS 握手时挂起

我刚刚从 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 网络设备。

相关内容