如何在运行Docker容器的云虚拟机上仅开放SSH端口并屏蔽其他端口(避免破坏Docker规则)
如何在运行Docker容器的云虚拟机上仅开放SSH端口并屏蔽其他端口(避免破坏Docker规则)
嗨,我完全懂你的顾虑——既要把不必要的端口全锁死提升安全性,又怕乱改iptables搞坏Docker的自动规则,更担心一不小心把自己的SSH连接搞丢,连机器都登不回去。别慌,咱们用Docker官方预留的规则链来操作,既安全又不会影响容器运行。
核心思路:用DOCKER-USER链做自定义规则
Docker会自动管理一套iptables规则,但它专门预留了DOCKER-USER链给用户添加自定义的外部流量规则——所有从外部进入主机的流量都会先经过这个链,而且Docker更新自身规则时不会改动这个链里的内容,完美解决你的痛点。
分步操作(全程安全,不会锁死自己)
1. 先给当前SSH连接“买保险”
首先要确保已经建立的SSH连接不会被切断,同时允许新的SSH连接进来:
# 允许所有已建立/相关的连接(比如你当前的SSH会话) iptables -A DOCKER-USER -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # 允许SSH端口的新连接(如果你的SSH端口不是默认22,改成你自己的端口) iptables -A DOCKER-USER -p tcp --dport 22 -j ACCEPT
2. 添加临时拒绝规则(测试用,防止锁死)
为了避免万一出错连不上机器,咱们先加一个5分钟后自动失效的拒绝规则,这样即使出问题,等5分钟就能恢复:
# 拒绝所有其他外部进入的流量,5分钟后自动失效 iptables -A DOCKER-USER -j REJECT --reject-with icmp-port-unreachable -m timeout --timeout 300s
3. 测试连接是否正常
现在立刻打开一个新的终端窗口,尝试SSH登录这台虚拟机:
- 如果能正常登录,说明规则没问题;
- 如果登不上,别慌,等5分钟后临时规则失效,就能重新连接,然后检查步骤1里的端口是否写错。
4. 固化规则(测试通过后)
确认没问题后,把临时规则换成永久的:
# 先删除临时的超时拒绝规则(可选,因为超时后会自动消失) iptables -D DOCKER-USER -j REJECT --reject-with icmp-port-unreachable -m timeout --timeout 300s # 添加永久的拒绝规则 iptables -A DOCKER-USER -j REJECT --reject-with icmp-port-unreachable
5. 保存规则,确保重启后生效
根据你的操作系统不同,保存规则的命令略有区别:
- Debian/Ubuntu:
iptables-save > /etc/iptables/rules.v4 - RHEL/CentOS/Rocky Linux:
service iptables save
关键说明
- 这个规则只会限制外部机器直接访问主机的端口,容器之间的通信、容器向外的网络请求完全不受影响,Docker的正常运行也不会被干扰;
- 你的MariaDB容器因为是通过SSH隧道访问的,本身就不需要对外暴露端口,这个规则正好彻底封死了直接访问容器端口的可能,完全符合你的需求;
- 万一操作失误锁死了SSH,如果你用的是云服务商的控制台,大多提供“VNC/串行控制台”直接登录机器,进去清空
DOCKER-USER链的规则就行:iptables -F DOCKER-USER
备注:内容来源于stack exchange,提问作者bfredo123




