iptables防火牆規則導致端口不通的案例分析
iptables防火牆規則導致端口不通的案例分析
- 問題現象:
一台服務器的8080端口訪問不通,但其他端口正常,例如ssh的22端口,ping也正常。
從其他機器上進行telnet連接8080端口測試,顯示是下邊這個結果。
[root@iZ25a9b7bpcZ ~]# telnet xx.xx.xx.xx 8080
Trying xx.xx.xx.xx...
telnet: connect to address xx.xx.xx.xx: No route to host
從telnet測試的結果,仔細看其實會發現有問題,這裏提示了錯誤“No route to host”。
正常進行telnet端口測試,如果端口不通,返回是這樣的情況,會提示“Connection refused”
[root@iZ25a9b7bpcZ ~]# telnet xx.xx.xx.xx 9999
Trying xx.xx.xx.xx...
telnet: connect to address xx.xx.xx.xx: Connection refused
而訪問8080端口會提示“No route to host”,沒有路由能連接到目標地址。但實際ping是通的,路由肯定沒有問題,這個異常的提示就是最大疑點。
-
排查過程:
首先想到是進行抓包,具體看下網絡連接情況。
在客戶端機器上,進行telnet連接測試,然後用 tcpdump 抓取訪問目標ip 120.xx.xx.xx 的數據包。
[root@iZ25a9b7bpcZ ~]# tcpdump -i any -s 0 host 120.xx.xx.xx
19:58:07.985224 IP 101.200.xx.xx.33631 > 120.xx.xx.xx.webcache: Flags [S], seq 783998905, win 14600, options [mss 1460,sackOK,TS val 624230653 ecr 0,nop,wscale 6], length 0
19:58:08.018285 IP 120.xx.xx.xx > 101.200.xx.xx: ICMP host 120.xx.xx.xx unreachable - admin prohibited, length 68
從抓包的結果看,客戶端訪問目標服務器的8080端口(抓包裏端口顯示webcache),但目標服務器給返回了一個ICMP協議類型的,提示目標地址不可達 。host 120.xx.xx.xx unreachable ,這裏明顯不正常。
同時也在服務器端進行了抓包,抓取客戶端ip 101.200.xx.xx 的連接。
root@iZ94jj4osq9Z:/etc/apache2# tcpdump -i any -s 0 host 101.200.xx.xx
19:57:39.974605 IP 101.200.xx.xx.33623 > 120.xx.xx.xx.http-alt: Flags [S], seq 1047961079, win 14600, options [mss 1460,sackOK,TS val 624202626 ecr 0,nop,wscale 6], length 0
19:57:39.974679 IP 120.xx.xx.xx > 101.200.xx.xx: ICMP host 120.24.183.92 unreachable - admin prohibited, length 68
服務器端也收到了客戶端訪問8080端口的請求,但沒有正常響應客戶端發的tcp三次握手的syn包,而是返回了一個異常的ICMP協議數據包,告訴客戶端目標不可達。
這裏也就可以明白,為什麼telnet端口測試,會提示“No route to host”
在Windows上用wireshark進行抓包查看,會看到服務器返回的錯誤信息“Host administratively prohibited”
服務器返回的ICMP協議的數據包中,是包含了客戶端請求的數據包信息。
-
確定問題:
通過抓包的信息,基本分析清楚了問題。出現連接異常,肯定是服務器上有特殊限製,防火牆之類的。
在目標服務器上查看 iptables防火牆規則。
root@iZ:~# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:443
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 limit: avg 100/sec burst 100
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 limit: avg 1/sec burst 10
syn-flood tcp -- 0.0.0.0/0 0.0.0.0/0 tcp flags:0x17/0x02
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
其中有
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
這條是拒絕所有連接的規則,而允許8080端口訪問的規則,是在這條規則之後,優先級沒有拒絕的高導致8080端口連接不上。
拒絕連接的規則有 reject-with icmp-host-prohibited 這個選項,所以被拒絕的連接會收到一個icmp,返回目標主機不可達,抓包裏看到返回的icmp協議,就是這個拒絕的規則導致。
最後解決方式,關閉iptables防火牆,或者把允許8080端口訪問的規則加到前邊。
最後更新:2017-08-17 16:02:20
上一篇:
Mysql CPU占用高的問題解決方法小結
下一篇:
報表幾種常用數據方案
Bootstrap Table筆記——2
雲盾WAF實現虛擬補丁——記一起Web漏洞應急響應
如何找到一個好的Joomla主機提供商
App Store開人民幣付款先河 蘋果中國本土化路上問題多
isupper <ctype.h> <cctype>
'System.Data.DataRow.DataRow(System.Data.DataRowBuilder)' is inaccessible due to its protection leve
為 gem install 按上翅膀 -- gem-fast
Android ListView – Holder模式和getItemViewType
jQuery去空格
MS SQL 表字段增加,刪除,修改