有些人的解法是修改 docker 的iptables 設定,但可能會衍生出其他問題
所以建議以下作法


編輯 /etc/ufw/after.rules

到檔案下方新增以下內容
# BEGIN UFW AND DOCKER
*filter
:ufw-user-forward - [0:0]
:DOCKER-USER - [0:0]
-A DOCKER-USER -j RETURN -s 10.0.0.0/8
-A DOCKER-USER -j RETURN -s 172.16.0.0/12
-A DOCKER-USER -j RETURN -s 192.168.0.0/16

-A DOCKER-USER -j ufw-user-forward

-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16
-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8
-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 192.168.0.0/16
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 10.0.0.0/8
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 172.16.0.0/12

-A DOCKER-USER -j RETURN
COMMIT
# END UFW AND DOCKER

存檔,重啟 ufw 
# systemctl restart ufw

新增以下 rules
ufw allow from 127.0.0.1
ufw allow from 信任ip1
ufw allow from 信任ip2
ufw deny from any
ufw route allow proto tcp from 信任ip1 to any port 8888
ufw route allow proto tcp from 信任ip1 to any port 80
ufw route allow proto tcp from 信任ip2 to any port 8888
ufw route allow proto tcp from 信任ip2 to any port 80

列出rule
# ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] Anywhere                   ALLOW IN    127.0.0.1
[ 2] Anywhere                   ALLOW IN    信任ip1
[ 3] Anywhere                   ALLOW IN    信任ip2
[ 4] Anywhere                   DENY IN     Anywhere
[ 5] 8888/tcp                   ALLOW FWD   信任ip1
[ 6] 80/tcp                     ALLOW FWD   信任ip1
[ 7] 8888/tcp                   ALLOW FWD   信任ip2
[ 8] 80/tcp                     ALLOW FWD   信任ip2
[ 9] Anywhere (v6)              DENY IN     Anywhere (v6)

測試功能正常

特別注意的是, route allow 的 port是 container listen 的 port 
不是對應到 host 機上的 port


    ports:
      - 8080:80

就要允許 80 而非 8080

arrow
arrow
    創作者介紹
    創作者 helloworld 的頭像
    helloworld

    Hello World

    helloworld 發表在 痞客邦 留言(0) 人氣()