openssh 限制私有网络访问需修改 sshd_config 的 listenaddress 指令为具体内网 ip(如 listenaddress 192.168.5.10),禁用 listenaddress 0.0.0.0 和 ::,再配合 nftables/iptables 仅放行 192.168.0.0/16、10.0.0.0/8、172.16.0.0/12 网段的 22 端口请求。

OpenSSH 默认监听所有网络接口(0.0.0.0 或 ::),若需限制仅允许私有网络(如 192.168.0.0/16、10.0.0.0/8、172.16.0.0/12)访问,关键在于修改 sshd_config 中的 ListenAddress 指令,配合系统防火墙做双重保障。
明确指定私有网段监听地址
编辑 /etc/ssh/sshd_config,找到或添加 ListenAddress 行,按实际内网网卡 IP 设置。例如服务器在内网中 IP 是 192.168.5.10,则写:
如需同时监听多个私有地址(比如双网卡),可重复多行:
ListenAddress 192.168.5.10ListenAddress 10.10.20.30
⚠️ 注意:不要写成 ListenAddress 192.168.0.0/16 —— OpenSSH 不支持 CIDR 写法,只接受具体 IPv4/IPv6 地址。
禁用默认全网监听,避免配置遗漏
检查配置中是否残留以下任意一行,如有请注释掉(加 #):
ListenAddress 0.0.0.0ListenAddress ::- 整行
ListenAddress未设置(此时默认监听全部接口)
确保配置中只保留你明确授权的私有 IP 地址行。改完后必须重载服务生效:
sudo systemctl reload sshd配合防火墙加固(推荐 iptables/nftables)
仅靠 ListenAddress 能防误连,但无法拦截发往其他端口或绕过 SSH 的扫描。建议补充防火墙规则,例如用 nftables 仅放行私有网段 SSH 请求:
或者用 iptables:
iptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
这样即使未来误开监听地址,防火墙仍能兜底拦截公网连接。
验证监听状态与连通性
执行以下命令确认 sshd 确实只绑定了预期地址:
sudo ss -tlnp | grep :22输出应类似:
tcp LISTEN 0 128 192.168.5.10:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))再从私有网络内另一台机器测试连接:
ssh user@192.168.5.10并从公网或非授权网段尝试连接,应连接超时或被拒绝。










