ssh端口转发需通过服务端配置实现目标地址白名单控制,核心是禁用通配地址、限定permitopen范围、绑定本地与内网、按用户分组授权,并禁用高危的动态及远程转发功能。

SSH端口转发本身不自带目标地址白名单机制,限制可转发的目标地址必须靠服务端配置和网络层协同控制。核心思路是:不让 SSH 服务进程有能力连接任意外部地址,同时阻止用户绕过规则自行指定目标。
禁用通配目标地址(关键第一步)
OpenSSH 默认允许 -L 或 -R 中的目标地址为任意 IP 或域名(如 192.168.1.100、google.com、localhost)。要收紧,需在 SSH 服务端配置中禁止解析非受限地址:
- 编辑
/etc/ssh/sshd_config - 添加或确认以下两行:
AllowTcpForwarding yes<br>PermitOpen any
改为:AllowTcpForwarding yes<br>PermitOpen 127.0.0.1:3306 127.0.0.1:6379 192.168.10.0/24:80
-
PermitOpen列出所有允许被转发到的「目标地址:端口」组合,支持 CIDR 网段;未列出的地址+端口对,即使用户在ssh -L命令中指定,也会被 sshd 拒绝并报错bind: Permission denied - 重启服务:
sudo systemctl restart sshd
绑定转发仅限本地回环与可信内网
避免用户通过跳转机访问外网或跨网段资源,应从监听范围和目标范围双重限制:
- 本地转发(
-L)中,若目标地址写localhost,它实际指向的是 SSH 服务器本机 —— 这个localhost是服务端视角,不是客户端视角 - 因此,只允许
PermitOpen包含127.0.0.1和明确授权的内网段(如10.0.5.0/24),严禁出现0.0.0.0、*、公网 IP 或域名 - 配合防火墙策略,在 SSH 服务器上 默认拒绝 outbound TCP 连接,仅放行
PermitOpen中列出的目标地址和端口(例如用iptables或firewalld限制sshd进程的出向连接)
按用户粒度控制转发能力
不同用户应有不同转发权限,避免一个高权限账号成为全网跳板:
- 使用
Match User或Match Group块实现差异化配置 - 示例:仅允许运维组访问数据库内网段,开发组只能连本机服务
Match Group devops<br> PermitOpen 127.0.0.1:3306 10.1.20.0/24:5432<br><br>Match Group developers<br> PermitOpen 127.0.0.1:5432 127.0.0.1:6379
- 搭配
AllowUsers或AllowGroups确保只有授权用户能登录,进一步缩小攻击面
禁用动态转发与远程转发(如无需)
动态转发(-D)和远程转发(-R)风险更高,尤其 -R 可被用于反向代理或内网穿透:
- 彻底禁用:在
sshd_config中设AllowTcpForwarding no(但会同时禁用所有转发) - 更精细做法:保留本地转发,关闭其余两种
AllowTcpForwarding yes<br>GatewayPorts no<br>PermitTunnel no
-
GatewayPorts no阻止-R绑定到非127.0.0.1的地址;PermitTunnel no禁用-w虚拟网卡隧道,也间接抑制部分高级滥用场景











