上一篇文章 关于iptables和docker只允许某些ip访问设置,里面东西写得很多,我经过实践后,得出更简便的过程。
参考资料 www.cnblogs.com/bill1015/p/…
我们模拟服务器上有两个服务,一个nginx是直接宿主机安装运行在80端口上叫做ng1,另一个用docker运行nginx服务运行在8080端口上叫做ng2。
我们的目标:
1、宿主机和docker容器内可以访问外网
2、宿主机ng1和容器内ng2可以相互ping通
3、禁止所有外部ip访问ng1和ng2的网页
4、允许某个ip或者ip网段访问ng1和容器ng2网页
5、宿主机和ng2容器内可以ssh其他服务器
提供纯净环境
分别查看nat
和filter
表,不带-t
默认是filter
表
安装宿主机nginx
宿主机nginx运行在80端口
yum install -y nginx
nginx
安装docker内nginx容器
docker内nginx容器在8080端口
docker run -d -p 8080:80 --name nginx2 ccr.ccs.tencentyun.com/rootegg/node:nginx-1.24.0
安装iptables
如果服务器没有iptables就安装
# 设置国内镜像
sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://mirror.centos.org|baseurl=http://mirrors.aliyun.com|g' \
-i.bak \
/etc/yum.repos.d/CentOS-*.repo
# 必须关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 安装
yum install -y iptables iptables-services
systemctl enable iptables.service
systemctl start iptables
systemctl status iptables
配置iptables规则
宿主机ng1和docker内ng2通过iptables限制访问,要分开配置。
限制docker访问,只需要限制docker-user链
限制宿主机访问
宿主机ng1限制访问
关闭所有访问宿主机ng1
# 先允许22端口ssh开放,不然后面一句执行后就无法连接ssh了
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
# 修改默认规则入站禁止,出站允许
iptables -P INPUT DROP
此时外网访问80端口端口网页失败,访问8080端口网页还是成功
说明这句NIPUT限制成功宿主机nginx,但是docker的nginx容器还是没限制
仅允许指定ip访问宿主机ng1
# 允许某ip访问,或者可以写子网掩码 10.100.60.0/24
iptables -I INPUT -s 183.226.239.196 -j ACCEPT
此时这个这个指定ip源可以正常访问80和8080的nginx
允许宿主机SSH其他服务器
# 允许SSH其他服务器
iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
允许回环,宿主机可以访问到docker内容器
# 允许本机回环访问
iptables -I INPUT -i lo -j ACCEPT
视情况而定开放80和443端口
需要对外所有地址提供网页80和443就开放,否则就不用开发
iptables -I INPUT -p tcp -m multiport --dport 443,80 -j ACCEPT
持久化
## 上面所有执行后,持久化不然是保存到内存中的
service iptables save
最终INPUT增加了4条ACCEPT配置规则
限制容器访问
容器内ng2限制访问
限制docker访问,只需要限制docker-user链
禁止所有ip访问docker容器
# 先删掉DOCKER-USER默认的那条数据
iptables -D DOCKER-USER 1
# 禁止所有访问docker容器,注意必须要网卡名,根据自己网卡名替换etho0,这句位置一定是最后一句
iptables -I DOCKER-USER -i eth0 -j DROP
# 允许docker相互访问和访问宿主机,这个172.17.0.1是docker0的ip
iptables -I INPUT -s 172.17.0.1/16 -j ACCEPT
# 允许docker容器内访问外网
iptables -I DOCKER-USER -m state --state ESTABLISHED,RELATED -j RETURN
允许某个ip访问docker容器的服务
iptables -I DOCKER-USER -i eth0 -s 183.226.239.209 -j RETURN
持久化
## 上面所有执行后,持久化不然是保存到内存中的
service iptables save
回退备注
如果要开放DOCKER访问,还原所有ip可访问直接RETURN,这个要在第一句
iptables -I DOCKER-USER -j RETURN
最终效果
以后怎么添加白名单ip
经过上面开放INPUT和DOCKER-USER之后,只需要执行下面这三句就可以添加白名单IP了
# 允许访问宿主机提供的端口服务
iptables -I INPUT -s 183.226.239.209 -j ACCEPT
# 允许访问docker容器提供的服务
iptables -I DOCKER-USER -i eth0 -s 183.226.239.209 -j RETURN
# 持久化
service iptables save