最近無法通過SSH連接Linux服務器,訪問該服務器上的HTTP服務也出現異常。可以ping,但是telnet端口超時,網站wget超時,訪問超時。
最后排查是內核配置問題
原來是 net.ipv4.tcp_timestamps 設置了為 1 ,即啟用時間戳
cat /proc/sys/net/ipv4/tcp_timestamps
這時將其關閉
修改 /etc/sysctl.conf 中
net.ipv4.tcp_timestamps = 0
sysctl -p
生效
原理:
問題出在了 tcp 三次握手,ping 的通 icmp ok ,http ssh mysql 都不 ok
經過nat之后,如果前面相同的端口被使用過,且時間戳大於這個鏈接發出的syn中的時間戳,服務器上就會忽略掉這個syn,不返會syn-ack消息,表現為用戶無法正常完成tcp3次握手,從而不能打開web頁面。在業務閑時,如果用戶nat的端口沒有被使用過時,就可以正常打開;業務忙時,nat端口重復使用的頻率高,很難分到沒有被使用的端口,從而產生這種問題。
只有客戶端和服務端都開啟時間戳的情況下,才會出現能ping通不能建立tcp三次握手的情況
netstat -s | grep timestamp
在同一個內網環境下,多人使用同一個公網IP進行上網,這樣NAT之后是大大增加了端口的重復使用的概率,Centos7默認開起了TCP/IP建立的timestamp,所有導致TCP三次握手失敗。
cat /proc/sys/net/ipv4/tcp_tw_recycle
cat /proc/sys/net/ipv4/tcp_timestamps
net.ipv4.tcp_tw_recycle=0
net.ipv4.tcp_timestamps=0