linux系統中docker服務和普通服務對外訪問埠不通的問題
linux系統中docker服務和普通服務對外訪問埠不通的問題
前一段時間,在一個新的centos 7.4
伺服器上執行專案,共有四個專案,因為特殊原因,兩個是通過docker
執行,另外兩個是通過nginx
和tomcat
執行。
當執行起來以後,發現docker
執行的那兩個可以正常在外網訪問,而另外兩個不是docker
的死活訪問不到。
我的排除問題的方法如下:
1、檢查專案是否執行:
查看了tomcat
是否執行:
輸入如下命令:
ps -aux|grep tomcat
的確tomcat執行正常,看過日誌,執行也沒有問題
查看了nginx
對映的另一個專案,埠仍存在,我後來直接輸入了ss -tnl
結果如下:
奇怪了,埠也是正常執行的,為什麼偏偏
docker
的能對外訪問,那兩個不行呢。
那現在的情況如下圖:
執行環境 | 外網埠 | 內網埠 |
---|---|---|
docker服務 | 7001(正常訪問) | 10001(正常) |
docker服務 | 7002(正常訪問) | 10002(正常) |
nginx服務 | 7003(訪問失敗) | 10003(正常) |
tomcat服務 | 7004(訪問失敗) | 10004(正常) |
2、確認內網訪問:
難道是另外兩個外網埠忘記開了?我趕緊試一下這兩個不通的專案是否可以內網訪問:
分別用瞭如下命令:
curl -i http://localhost:10003
和:
wget http://localhost:10003
10004
也如上試過了,內網沒問題,因此我判斷埠沒開,趕緊把鐵鍋甩了出去。
3、再次排查
第二天,伺服器提供方更狠,直接說內網telnet
我的那倆埠訪問不到,但是我內網是可以的,真的太奇怪了。
整個過程我都沒有想過防火牆的問題。為什麼呢?
因為首先這是個新伺服器,並沒有設定過埠的規則,docker
後來我們架構師說,你把那兩個通的專案先關掉,用那倆不通的專案先試試這兩個通的埠,試試能不能外網訪問?
這想法我怎麼沒想到,哈哈,我趕緊試試,發現,的確也不能訪問,那這樣就賴不上人家了,只能自己再看了。
4、最終問題原因
在最後,我先關掉了一下防火牆,因為centos 7
預設安裝的防火牆是firewall
,所以我先將防火牆關掉:
關掉firewall
防火牆
systemctl stop firewalld.service 關閉防火牆
然後訪問了下專案,才發現,專案都通了,竟然都可以正常訪問。
為什麼docker
的可以,其他的竟然不可以,防火牆是肯定沒有設定過,為什麼呢?難道是docker
在安裝的時候,自動設定了?
5、安裝iptables
既然找到了問題,以前沒有設定過firewall
,我想直接重新安裝iptables
的了。
首先關閉firewall
開機啟動
systemctl disable firewalld.service
確認防火牆是否關掉
關閉後顯示notrunning即表示已關閉
firewall-cmd --state
安裝iptables
yum install iptables
yum install iptables-services
如果yum
命令不可用,可以參照另一篇文章,linux命令—使用yum命令時出錯,Could not retrieve mirrorlist
啟動iptables
service iptables start 或者 systemctl start iptables
設定開機啟動iptables
systemctl enable iptables.service
編輯防火牆檔案,輸入如下命令:
vim /etc/sysconfig/iptables
在其中開啟了我的那四個埠:
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 10001 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 10002 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 10003 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 10004 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
即如上,我開啟了我的 80、10001、10002、10003、10004
埠。
設定完之後,重啟iptables
service iptables restart
這樣就可以正常訪問專案了。