iptables配置docker服务端口访问限制
服务器系统为 CentOS 7
PS:CentOS 7自带iptables,但不自带iptables-services。建议需要部署一下:yum install iptables-services
过程
遇到了一个需求,需要用iptables限制一个rabbitmq
服务端口只能由指定的ip访问,安装之前的直接限制就行
iptables -A INPUT -s 允许访问的ip -p tcp -m tcp --dport 5672 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 5672 -j DROP
执行完后使用iptables -L -n
命令可以查看当前所有的iptables规则。
但是很遗憾,并没有什么卵用,不管是别的服务器的统统都能访问。所以是为什么呢?
因为rabbitmq服务是用docker起的,docker会往系统中注册一个虚拟网卡叫docker0,访问docker服务的流量会直接被转发到这张网卡上,而因为docker0在linux系统中会被视为一张网卡,所以他的iptables规则是独有的,刚才设置的INPUT对docker服务是不生效的。
# docker规则
Chain DOCKER (1 references)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 172.17.0.2 tcp dpt:15672
ACCEPT tcp -- 0.0.0.0/0 172.17.0.2 tcp dpt:5672
ACCEPT tcp -- 0.0.0.0/0 172.17.0.3 tcp dpt:27017
ACCEPT tcp -- 0.0.0.0/0 172.17.0.4 tcp dpt:6379
解决办法
此时执行
iptables -I DOCKER -p tcp --dport 15672 -j DROP
iptables -I DOCKER -s 127.0.0.1 -p tcp --dport 15672 -j ACCEPT
iptables -I DOCKER -s 10.194.24.59 -p tcp --dport 15672 -j ACCEPT
iptables -L -n
就可以看到DOCKER规则中新增了刚执行的规则
保存规则并重启
service iptables save
service iptables restart
iptables -vxnL
扩展
iptables -A,-A的意思是加在最后,而iptables的匹配顺序是从上到下,所以用-A往最后追加的话,那就是【先写先匹配】
iptables -I,-I的意思是加在最前,也就是上面截图中的效果,明显是在规则链的最前面,那用-I往前追加的话,就是【先写后匹配】了
参考
1.https://zhuanlan.zhihu.com/p/457250110?utm_id=0