如何在使用 docker 时打开 iptables 中特定 IP 的端口?

如何在使用 docker 时打开 iptables 中特定 IP 的端口?

postgreSQL里面有一个数据库Docker,我不想将其暴露给主机网络,因为它会导致所有用户看到暴露的数据库端口。 (目前我没有 pfsense 或类似的东西)。

整体配置iptables如下:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
Chain FORWARD (policy DROP)
target     prot opt source               destination
DOCKER-USER  all  --  0.0.0.0/0            0.0.0.0/0
DOCKER-ISOLATION-STAGE-1  all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
Chain DOCKER (2 references)
target     prot opt source               destination
ACCEPT     tcp  --  0.0.0.0/0            172.18.0.2           tcp dpt:15672
ACCEPT     tcp  --  0.0.0.0/0            172.18.0.18          tcp dpt:8081
ACCEPT     tcp  --  0.0.0.0/0            172.18.0.19          tcp dpt:443
ACCEPT     tcp  --  0.0.0.0/0            172.18.0.19          tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            172.18.0.8           tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            172.18.0.13          tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            172.18.0.11          tcp dpt:5432
Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination
DOCKER-ISOLATION-STAGE-2  all  --  0.0.0.0/0            0.0.0.0/0
DOCKER-ISOLATION-STAGE-2  all  --  0.0.0.0/0            0.0.0.0/0
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
Chain DOCKER-ISOLATION-STAGE-2 (2 references)
target     prot opt source               destination
DROP       all  --  0.0.0.0/0            0.0.0.0/0
DROP       all  --  0.0.0.0/0            0.0.0.0/0
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
Chain DOCKER-USER (1 references)
target     prot opt source               destination  

我所做的是将 docker 内部的数据库暴露给同一端口上的主机:

0.0.0.0:5432:5432

iptables删除了所有连接,只添加了ACCEPT我的 IP 地址 111.111.111.111 和 222.222.222.222。下面的链接对此进行了解释:

所以我发出了以下命令:

iptables -I DOCKER-USER -s 111.111.111.111 -p tcp --dport 5432 -j ACCEPT
iptables -I DOCKER-USER -s 222.222.222.222 -p tcp --dport 5432 -j ACCEPT
iptables -I DOCKER-USER -p tcp --dport PORT_X -j REJECT --reject-with icmp-port-unreachable

通过上述配置,我无法从222.222.222.222端口 5432 远程登录。

请注意,我已将规则添加到 docker 链中。

我无法理解为什么会发生这种情况,并且我无法从第一个和第二个 IP 地址远程登录到端口。我的配置有问题吗?

答案1

将 IP 地址列入白名单并不是很安全:IP 欺骗很容易被用来绕过它。

手动配置 IPTables 是过度设计问题,而且没有必要。

将容器配置为使用 Unix 套接字(代替 IP 套接字)。这使您可以更好地控制权限。然后,您可以使用ssh安全隧道将端口转发到本地计算机(到另一个 Unix 套接字或 IP 套接字)。

相关内容