在使用 iptables 做 nat 時(shí),發(fā)現(xiàn)內(nèi)網(wǎng)機(jī)器 ping 某個(gè)域名 ping 的通,而使用 curl 測試不通
原來是 net.ipv4.tcp_timestamps 設(shè)置了為 1 ,即啟用時(shí)間戳
cat /proc/sys/net/ipv4/tcp_timestamps
這時(shí)將其關(guān)閉
修改 /etc/sysctl.conf 中
net.ipv4.tcp_timestamps = 0
sysctl -p
生效
原理
問題出在了 tcp 三次握手,ping 的通 icmp ok ,http ssh mysql 都不 ok
經(jīng)過nat之后,如果前面相同的端口被使用過,且時(shí)間戳大于這個(gè)鏈接發(fā)出的syn中的時(shí)間戳,服務(wù)器上就會(huì)忽略掉這個(gè)syn,不返會(huì)syn-ack消息,表現(xiàn)為用戶無法正常完成tcp3次握手,從而不能打開web頁面。在業(yè)務(wù)閑時(shí),如果用戶nat的端口沒有被使用過時(shí),就可以正常打開;業(yè)務(wù)忙時(shí),nat端口重復(fù)使用的頻率高,很難分到?jīng)]有被使用的端口,從而產(chǎn)生這種問題。
只有客戶端和服務(wù)端都開啟時(shí)間戳的情況下,才會(huì)出現(xiàn)能ping通不能建立tcp三次握手的情況
netstat -s | grep timestamp