在内网穿透场景下,最稳妥的做法是基于密钥认证建立反向隧道,并严格限制转发权限。这种方案适合需要长期稳定访问内网服务且具备公网服务器的场景,核心在于“最小权限原则”与“网络层隔离”。
先说结论:优先使用密钥认证配合权限限制,避免直接暴露内网端口给公网,适合远程维护或访问内部特定服务。
- 先判断:确认公网服务器是否允许端口转发及具体策略。
- 优先做:配置专用用户、禁用密码登录、限制转发目标、配置防火墙。
- 再验证:通过日志和端口状态确认隧道连通且无异常访问。
安全配置实施步骤
以下是基于 Linux 环境的标准实施流程,建议在测试环境验证后再应用于生产。
1. 创建专用隧道用户
不要在公网服务器上直接使用 root 或主账号做隧道中转。创建一个仅用于隧道的用户,并限制其 Shell 权限。由于我们将禁用密码认证,因此无需设置密码。
useradd -m -s /bin/false tunnel_user
# 注意:无需执行 passwd tunnel_user,避免密码认证风险2. 配置 SSH 服务端权限
编辑公网服务器的 /etc/ssh/sshd_config,针对该用户做限制。关键点包括禁用密码登录、限制转发目标以及控制端口监听范围。
Match User tunnel_user
ForceCommand true
PermitOpen 内网服务 IP:内网服务端口
AllowTcpForwarding yes
X11Forwarding no
PermitTunnel no
PasswordAuthentication no
# 若需外网访问隧道端口,开启 GatewayPorts,但必须配合防火墙限制
# GatewayPorts yes修改后重启 SSH 服务:systemctl restart sshd。
3. 生成并部署密钥
在内网机器生成密钥对,将公钥放入公网服务器对应用户的 authorized_keys 中。确保私钥权限为 600。
ssh-keygen -t ed25519
ssh-copy-id -i ~/.ssh/id_ed25519.pub tunnel_user@公网服务器 IP4. 防火墙安全配置
若开启了 GatewayPorts 或需要限制访问来源,必须在防火墙层面进行限制。以下是 ufw 和 iptables 的示例。
使用 ufw 限制特定 IP 访问隧道端口:
ufw allow from 可信外部 IP to any port 远程端口使用 iptables 限制特定 IP 访问:
iptables -A INPUT -p tcp -s 可信外部 IP `--dport` 远程端口 -j ACCEPT
iptables -A INPUT -p tcp `--dport` 远程端口 -j DROP建立与保持隧道
使用以下命令发起连接。添加 -o ServerAliveInterval=60 等参数保持连接活跃,防止因空闲断开。
ssh -N -R 远程端口:内网服务 IP:内网服务端口 -o ServerAliveInterval=60 -o ServerAliveCountMax=3 tunnel_user@公网服务器 IP若需要保持隧道长期稳定,可结合 autossh 工具,并配置为 systemd 服务:
autossh -M 0 -N -R 远程端口:内网服务 IP:内网服务端口 -o ServerAliveInterval=60 tunnel_user@公网服务器 IP验证与排查
1. 检查端口监听
在公网服务器上执行:
ss -tlnp | grep 远程端口确认端口处于 LISTEN 状态。若未开启 GatewayPorts,默认只监听 localhost;若开启,则监听 0.0.0.0,此时必须确认防火墙规则生效。
2. 检查连接日志
查看 /var/log/auth.log 或 /var/log/secure,确认只有预期的密钥登录记录,无密码爆破尝试。若发现密码登录尝试,检查 PasswordAuthentication 是否已生效。
3. 功能测试
从外部尝试访问公网服务器的监听端口,确认能连通内网服务,且无法访问其他未授权的内网地址。
关键风险规避
1. GatewayPorts 与防火墙联动
默认 SSH 反向隧道只在公网服务器的 localhost 监听。若需外网访问,需开启 GatewayPorts yes,但这会让监听端口对所有 IP 开放。务必配合防火墙(ufw/iptables)限制源 IP,否则内网服务将直接暴露在公网。
2. 认证方式强制限制
严禁允许 root 用户建立隧道,严禁开启密码认证。配置中必须显式设置 PasswordAuthentication no,防止因密钥丢失或配置错误导致密码认证被启用。
3. 隧道断开与自愈
网络波动会导致隧道中断。生产环境建议使用 autossh 或配置 systemd 服务自动重启隧道进程,不要依赖手动维持。同时配置 ServerAliveInterval 检测连接状态。
4. 权限过大风险
未限制 PermitOpen 时,拥有隧道权限的用户可能转发任意内网端口。务必在配置中明确指定允许转发的目标 IP 和端口,并使用 ForceCommand true 禁止用户执行 Shell 命令。