使用zabbix作为示例的Docker自定义iptables规则

任务:关闭除特定IP地址之外的所有传入连接。

有一个由linux和三个带有静态IP地址的窗口组成的测试环境 。 在Linux上,docker与zabbix一起安装,redmine图像。 并且在两台Windows计算机上安装并配置了来自zabbix的代理,在第三台上,您需要组织查看zabbix的功能。 有必要限制zabbix服务器中的其他用户,但不限制redmine。

所有命令均以root用户身份执行。

官方文档说iptables DOCKER-USER规则。 只需更改此规则。 首先,我们看看什么是规则,我们只关注某些规则。

可以看出,目标DOCKER-USER的规则是FORWARD规则中的第一条规则。 因此,您只应更改它。

iptables -L FORWARD -n -v Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 421K 169M DOCKER-USER all -- * * 0.0.0.0/0 0.0.0.0/0 419K 167M DOCKER-ISOLATION-STAGE-1 all -- * * 0.0.0.0/0 0.0.0.0/0 

从DOCKER规则表中,您可以看到打开了哪些端口以及容器的内部ip地址。

 iptables -L DOCKER -n -v Chain DOCKER (4 references) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- !docker_redmine docker_redmine 0.0.0.0/0 172.16.237.2 tcp dpt:3000 0 0 ACCEPT udp -- !br-c56432fe07cc br-c56432fe07cc 0.0.0.0/0 172.16.238.2 udp dpt:162 0 0 ACCEPT tcp -- !br-c56432fe07cc br-c56432fe07cc 0.0.0.0/0 172.16.238.3 tcp dpt:10051 0 0 ACCEPT tcp -- !br-c56432fe07cc br-c56432fe07cc 0.0.0.0/0 172.16.238.4 tcp dpt:443 5 248 ACCEPT tcp -- !br-c56432fe07cc br-c56432fe07cc 0.0.0.0/0 172.16.238.4 tcp dpt:80 

DOCKER-USER规则中没有特殊规则;整个连接都通过自身。

 iptables -L DOCKER-USER -n -v Chain DOCKER-USER (1 references) pkts bytes target prot opt in out source destination 4180 1634K RETURN all -- * * 0.0.0.0/0 0.0.0.0/0 

首先,我们将处理zabbix网络,即,我们将建立一个恒定的网络名称。 因此,当您重新创建docker-compose时,网络名称不会更改。 从网络的当前状态来看,zabbix有一个名为br-c56432fe07cc的网络,效果不是很好。 在* .yaml文件中,添加一行负责网络名称zbx_net_frontend:“ com.docker.network.bridge.name:” docker_zabbix“。

配置部分:

 networks: zbx_net_frontend: driver: bridge driver_opts: com.docker.network.enable_ipv6: "false" com.docker.network.bridge.name: "docker_zabbix" 

重新创建网络之后。 应替换为您的* .yaml。

 docker-compose -f docker-compose_v3_ubuntu_mysql_latest.yaml down docker-compose -f docker-compose_v3_ubuntu_mysql_latest.yaml up -d 

我们看一下DOCKER规则。

 iptables -L DOCKER -n -v Chain DOCKER (4 references) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- !docker_redmine docker_redmine 0.0.0.0/0 172.16.237.2 tcp dpt:3000 0 0 ACCEPT udp -- !docker_zabbix docker_zabbix 0.0.0.0/0 172.16.238.2 udp dpt:162 0 0 ACCEPT tcp -- !docker_zabbix docker_zabbix 0.0.0.0/0 172.16.238.3 tcp dpt:10051 0 0 ACCEPT tcp -- !docker_zabbix docker_zabbix 0.0.0.0/0 172.16.238.4 tcp dpt:443 5 252 ACCEPT tcp -- !docker_zabbix docker_zabbix 0.0.0.0/0 172.16.238.4 tcp dpt:80 

仍然需要将规则添加到DOCKER-USER表中。 首先,我们为从外部接口(我有eth0 )到docker_zabbix网络的所有连接引入DROP规则。

 iptables -I DOCKER-USER -i eth0 -o docker_zabbix -j DROP 

现在,所有连接均被拒绝到docker_zabbix网络。 让我们为一个IP地址启用连接,更准确地说,数据包可以继续沿FORWARD前进。

 iptables -I DOCKER-USER -i eth0 -s 192.168.43.55 -j RETURN 

此处未明确指定docker_zabbix网络。 我们使用powershell从主机192.168.43.55检查zabbix的可用性。

 tnc 192.168.43.136 -port 8081 ComputerName : 192.168.43.136 RemoteAddress : 192.168.43.136 RemotePort : 8081 InterfaceAlias : vEthernet (Swich_in) SourceAddress : 192.168.43.55 TcpTestSucceeded : True 

zabbix docker已打开8081端口。 确保zabbix属于端口8081。

 docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c047f18a4445 zabbix/zabbix-web-nginx-mysql:ubuntu-4.2-latest "docker-entrypoint.sh" About an hour ago Up About an hour (healthy) 0.0.0.0:8081->80/tcp, 127.0.0.1:8443->443/tcp zabbix_zabbix-web-nginx-mysql_1 

但是请记住,规则必须指定端口80,而不是8081。如果指定端口8081,则不会打开对zabbix的访问。 对于第二个主机,该命令。

 iptables -I DOCKER-USER -i eth0 -p tcp --dport 80 -s 192.168.43.10 -j RETURN 

对于第三个主机,仅打开端口10051,此主机上使用了活动代理。

 iptables -I DOCKER-USER -i eth0 -p tcp --dport 10051 -s 192.168.43.13 -j RETURN 

另一个问题,我们不能脱离容器进入外部世界。 通知脚本不起作用,并且无法检查网站的可用性。 还有一个命令可以解决现有连接。

 iptables -I DOCKER-USER -i eth0 -o docker_zabbix -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 

不要忘记重启服务器后,创建的规则将被删除。

Source: https://habr.com/ru/post/zh-CN473222/


All Articles