UFW+Docker环境下关闭主机80/443端口后,如何让Tinyproxy容器访问Nginx后端服务器
UFW+Docker环境下关闭主机80/443端口后,如何让Tinyproxy容器访问Nginx后端服务器
我太懂你现在的困扰了——想把主机的80、443端口对外彻底封死,只让Tinyproxy容器的流量能进到Nginx后端,但之前配的UFW规则完全没起作用。这其实是Docker和UFW的默认交互逻辑在搞鬼,咱们一步步拆解解决:
第一步:先把流量路径掰正
你之前大概率是让Tinyproxy转发请求到主机的80/443端口,但现在主机端口关了,自然连不上。正确的姿势是让Tinyproxy直接访问Nginx容器的IP或者服务名,绕开主机端口:
- 如果不想修改原有网络架构,可以把Tinyproxy临时接入Nginx的网络(不影响它原有的网络配置):
之后Tinyproxy就能直接用Nginx的容器名(比如docker network connect <你的Nginx容器所在网络名> <你的Tinyproxy容器名>nginx-service)访问,不用再走主机IP了。 - 要是不想跨网络连接,也可以用
docker inspect <nginx容器名> | grep "IPAddress"拿到Nginx的容器IP,直接让Tinyproxy转发到这个IP的80/443端口。
第二步:让Docker尊重UFW规则(关键!)
默认情况下,Docker会直接修改系统的iptables规则,完全绕过UFW的配置,这就是你之前加了UFW规则但没用的核心原因。咱们改一下Docker的配置:
- 编辑(没有就新建)Docker的配置文件:
sudo nano /etc/docker/daemon.json - 加入以下内容,禁用Docker自动修改iptables的功能:
{ "iptables": false } - 重启Docker服务让配置生效:
sudo systemctl restart docker
第三步:配置正确的UFW规则
现在Docker不会乱改iptables了,咱们来加精准的允许规则:
假设Tinyproxy所在的Docker子网是192.168.20.0/24,Nginx所在的子网是192.168.10.0/24,执行以下命令:
# 允许Tinyproxy子网访问Nginx子网的80、443端口 sudo ufw allow from 192.168.20.0/24 to 192.168.10.0/24 port 80/tcp sudo ufw allow from 192.168.20.0/24 to 192.168.10.0/24 port 443/tcp # 彻底关闭主机对外的80、443端口 sudo ufw deny 80/tcp sudo ufw deny 443/tcp # 重新加载UFW规则 sudo ufw reload
第四步:更新Nginx的访问限制
之前你只允许了Nginx网关IP192.168.10.1,现在Tinyproxy的流量会来自它自己的子网192.168.20.0/24,所以要把这个网段加到Nginx的允许列表里:
在Nginx的server块里修改规则:
allow 192.168.10.1; allow 192.168.20.0/24; deny all;
修改完后重启Nginx容器:
docker restart <你的Nginx容器名>
最后验证一下
- 用外部机器测试主机的80/443端口:比如
nc -zv <你的主机公网IP> 80,应该显示连接失败,说明对外端口确实关了。 - 测试Tinyproxy的转发功能:通过Tinyproxy访问后端服务,看是否能正常响应,同时检查Nginx的日志,确认流量来自Tinyproxy的子网IP。
备注:内容来源于stack exchange,提问作者Vinicius Gonçalves Melo
相关产品推荐
相关产品推荐

