docker容器限定ip訪問
- 一、測試所需環境:
- 二、使用docker的 iptables 策略
- 三、Docker使用iptables 與系統Firewalld之間的關系
- 四、沖突解決方案
一、測試所需環境:
主機1:
ip:192.168.3.117
環境配置:docker、httpd(docker容器)
主機2:
ip:192.168.3.122
二、使用docker的 iptables 策略
默認情況下,允許所有外部源IP連接到Docker主機。要僅允許特定的IP(192.168.3.122)訪問容器,需要在DOCKER-USER過濾器鏈中插入相應規則。具體命令如下:
- 查看DOCKER-USER的鏈中的規則信息
#顯示DOCKER-USER的鏈中的規則信息
iptables -nL DOCKER-USER
- 主機1httpd容器的默認訪問端口為80,首先要禁止所有IP訪問docker的80端口
# 在主機192.168.3.117執行如下命令:(ens192 為本機網卡,以實際為準)
#禁止所有IP訪問docker的80端口
iptables -I DOCKER-USER -i ens192 -p tcp --dport 80 -j DROP
- 限定主機2訪問主機1的httpd容器,刪除DOCKER-USER的鏈中的默認規則(默認規則允許任意ip訪問)
#只允許192.168.3.122訪問docker的80端口
iptables -I DOCKER-USER -i ens192 -s 192.168.3.122 -p tcp --dport 80 -j ACCEPT
#刪除DOCKER-USER的鏈中的默認規則
iptables -D DOCKER-USER -j RETURN
- 保存新的DOCKER-USER策略,并設置iptables開機自啟
#保存DOCKER-USER策略
service iptables save
#設置iptables開機自啟,使策略永久生效
systemctl enable iptables.service
#或者
/etc/rc.d/init.d/iptables save
注: 通過iptables 命令設置的規則,默認是臨時性的。若需要規則永久生效,則要將命令寫入iptables配置文件之中。
使用此策略時,Firewall會被關閉
三、Docker使用iptables 與系統Firewalld之間的關系
Docker使用iptables來管理網絡流量和端口轉發。而Firewalld是CentOS/RHEL 7中默認的防火墻管理工具,它也使用iptables來實現規則。
當Firewalld激活時,它會自動配置iptables規則,并將iptables的管理權限交給自己。這就導致了Firewalld會屏蔽Docker容器的網絡訪問。這樣會導致,在系統Firewalld限定ip訪問后,容器的網絡仍舊是任意ip均可訪問。
四、沖突解決方案
禁用 docker 的 iptables 規則,使用系統的Firewalld
#在daemon.json文件加入以下命令,若沒有該文件,需要創建一個
vi /etc/docker/daemon.json
{
"iptables":false
}
開啟網絡地址轉換(NAT)
firewall-cmd --add-masquerade --permanent
#重新加載防火墻設置,使剛才添加的規則生效
firewall-cmd --reload
僅允許主機2訪問主機1的80端口
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.3.122" port protocol="tcp" port="80" accept'
#重新加載防火墻設置,使剛才添加的規則生效
firewall-cmd --reload
#查看防火墻設置
firewall-cmd --list-all
重啟docker
systemctl restart docker