IPTables - 仅允许特定 IP 地址的 Docker 端口转发

IPTables - 仅允许特定 IP 地址的 Docker 端口转发

我在 Ubuntu 16.04 上托管一个 Web 应用程序。该应用程序的所有组件都位于 Docker 容器内,其中大多数只需要相互通信,而不需要与外部世界(如 PostgreSQL 或 ElasticSearch)进行通信。例如,ElasticSearch 默认在端口 9200 上公开其插件接口。

作为管理员,我需要访问这些界面,但我想将其限制为仅限于我的工作计算机。

我试过以下仅允许某个端口使用特定 IP 的指令,但 Docker 似乎覆盖了我的规则:

## ALLOW specific ports only on ONE IP address:
# ElasticSearch
iptables -I INPUT -p tcp -s MyWorkIP --dport 9200 -j ACCEPT
iptables -I INPUT -p tcp -s 0.0.0.0/0 --dport 9200 -j DROP
iptables -I INPUT -p tcp -s MyWorkIP --dport 9300 -j ACCEPT
iptables -I INPUT -p tcp -s 0.0.0.0/0 --dport 9300 -j DROP
iptables -I INPUT -p tcp -s MyWorkIP --dport 5601 -j ACCEPT
iptables -I INPUT -p tcp -s 0.0.0.0/0 --dport 5601 -j DROP
# PostgreSQL
iptables -I INPUT -p tcp -s MyWorkIP --dport 5432 -j ACCEPT
iptables -I INPUT -p tcp -s 0.0.0.0/0 --dport 5432 -j DROP

page:port我正在通过尝试从我的工作计算机(MyWorkIP在脚本中)和从我的手机(动态IP)访问特定内容来测试一切,但任何尝试都会授予我从这两个设备的访问权限。我需要的是MyWorkIP拒绝任何其他IP;所以我的手机无法访问。

我不太擅长 IPtables 配置,所以我不知道从哪里开始我的调查...(我在这台服务器上没有安装 X:我在一个术语中做所有事情)

有什么想法/想法吗?

答案1

我设法让它与此一起工作:

删除除 ipyouwanttoallow 之外的所有连接(入站和出站)
    iptables -I DOCKER ! -s ipyouwanttoallow -j DROP
接受从容器本地IP到世界的所有连接
    iptables -I DOCKER -s localipofyourcontainer -d 0.0.0.0/0 -j ACCEPT
允许外部服务器回答您的容器请求所必需的
    iptables -I DOCKER  -m state --state ESTABLISHED,RELATED -j ACCEPT

答案2

可能有两个问题:

  • 您需要在接口上启用转发或默认启用转发。
  • 您将需要从您的手机(也可能是您的 work_ip)进行转发。

考虑使用防火墙构建器工具来构建防火墙规则。我更喜欢使用它shorewall,因为它有很好的文档记录,有很好的示例配置,并且是用文件配置的。 ufw是一个替代方案。两者都可以作为 Ubuntu 软件包提供。

您可以使用隧道或代理来提供访问权限。

相关内容