You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在运行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

火山引擎 最新活动