在 linux 服务器上,可以使用 iptables 或 nftables 将外部访问的特定端口映射到 ssh 服务的默认端口(22)。具体做法是配置 nat 表的 prerouting 链,使用 target=dnat 指令将目标地址和端口重写为本地回环地址及 22 端口。这样配置后,外部用户通过映射端口连接时,系统会自动将其转发给 ssh 守护进程。

如何配置 iptables 实现端口重定向
使用 iptables 命令可以直接添加规则来实现端口映射。需要确保内核已开启 IP 转发功能,并在 nat 表的 PREROUTING 链中插入一条规则。该规则匹配目标端口并执行 DNAT 动作,将流量指向 127.0.0.1:22。此方法适用于大多数基于 Debian 或 CentOS 的传统 Linux 发行版。

sudo sysctl -w net.ipv4.ip_forward=1 sudo iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 127.0.0.1:22 sudo iptables-save > /etc/iptables/rules.v4
上述代码首先启用 IP 转发,然后添加一条针对 TCP 协议、目标端口为 2222 的规则,将其重定向到本地 22 端口。最后保存规则以确保重启后生效。执行后,外部用户可通过 ssh -p 2222 user@server_ip 进行连接。
如何使用 nftables 替代 iptables 进行映射
对于较新的 Linux 内核,推荐使用 nftables 作为防火墙后端。它提供了更简洁的语法和更好的性能。配置过程包括创建一个名为 ssh_redirect 的 inet 类型表,并在其中定义一个 prerouting 钩子。在该钩子中,匹配传入的 TCP 数据包,若目标端口为 2222,则执行 dnat 操作至 127.0.0.1:22。这种方式避免了 iptables 的多表切换复杂性。

sudo nft add table inet ssh_redirect
sudo nft add chain inet ssh_redirect prerouting { type filter hook prerouting priority -150 \; }
sudo nft add rule inet ssh_redirect prerouting tcp dport 2222 dnat to 127.0.0.1:22
这段代码创建了必要的表和链,并添加了具体的重定向规则。与 iptables 不同,nftables 的配置通常写入配置文件或通过脚本持久化。验证配置是否生效可使用 nft list ruleset 查看当前规则集。连接测试方式与之前相同,只需确保防火墙允许 2222 端口的入站流量即可。
SSH 服务监听地址对映射结果的影响
当端口映射成功后,SSH 服务必须正确监听本地接口才能接受连接。如果 /etc/ssh/sshd_config 中设置了 ListenAddress 0.0.0.0 或 ListenAddress ::,服务会监听所有网络接口,包括回环地址 127.0.0.1,从而能够响应来自 DNAT 规则的请求。若仅监听了特定外网 IP,而映射指向了 127.0.0.1,则连接会失败。因此,检查 SSH 配置的监听范围是排查映射问题的关键步骤。

















