1. 程式人生 > >linux系統中docker服務和普通服務對外訪問埠不通的問題

linux系統中docker服務和普通服務對外訪問埠不通的問題

linux系統中docker服務和普通服務對外訪問埠不通的問題

  前一段時間,在一個新的centos 7.4 伺服器上執行專案,共有四個專案,因為特殊原因,兩個是通過docker 執行,另外兩個是通過nginxtomcat 執行。
  當執行起來以後,發現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

這樣就可以正常訪問專案了。

  雖然最後解決了問題,但是我還是沒搞明白,為什麼docker 執行的專案是可以訪問,其他的不行呢?期望大神解惑~