亲测可用iptables和docker限制ip访问

882 阅读4分钟

上一篇文章 关于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其他服务器

提供纯净环境

分别查看natfilter表,不带-t默认是filter

image.png

image.png

安装宿主机nginx

宿主机nginx运行在80端口

yum install -y nginx
nginx

image.png

安装docker内nginx容器

docker内nginx容器在8080端口

docker run -d -p 8080:80 --name nginx2  ccr.ccs.tencentyun.com/rootegg/node:nginx-1.24.0

image.png

安装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容器还是没限制

image.png

仅允许指定ip访问宿主机ng1

# 允许某ip访问,或者可以写子网掩码 10.100.60.0/24
iptables -I INPUT -s 183.226.239.196 -j ACCEPT

此时这个这个指定ip源可以正常访问80和8080的nginx

image.png

允许宿主机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配置规则

image.png

限制容器访问

容器内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

最终效果

image.png

以后怎么添加白名单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