如何实现两台仅监听VPN地址的VPS无需VPN直接互访
如何实现两台仅监听VPN地址的VPS无需VPN直接互访
首先得明确问题核心:你的两台VPS的sshd都只绑定了各自的VPN内网地址,直接用公网IP访问时,22端口根本没在监听,自然连不上。下面给你两个针对性的解决方案,都能满足“仅允许对方VPS直接访问,不开放给其他公网用户”的需求:
方案一:修改sshd配置,添加公网IP监听并限制访问来源
这个方案让sshd同时监听VPN地址和公网IP,但只允许对方VPS的公网IP通过公网地址连接,其他用户还是只能通过VPN访问。
操作步骤(以第一台VPS为例):
- 编辑
sshd_config文件:
vi /etc/ssh/sshd_config
- 保留原有的
ListenAddress规则,新增公网IP的监听:
ListenAddress 192.170.0.1 # 原VPN地址监听 ListenAddress 192.168.0.1 # 新增公网IP监听
- 添加访问限制规则,只允许第二台VPS的公网IP(170.168.0.1)通过公网地址连接,同时保留VPN网段的访问权限:
# 允许VPN网段所有用户访问,同时允许第二台VPS的公网IP访问root用户 AllowUsers root@192.170.0.0/24 root@170.168.0.1
或者用更灵活的Match块:
Match Address 170.168.0.1 AllowUsers root
- 验证配置是否合法,避免重启后服务异常:
sshd -t
- 重启
sshd服务使配置生效:
systemctl restart sshd
做完这些,你在第二台VPS上直接执行ssh root@192.168.0.1就能连上第一台了,其他公网用户依然无法通过192.168.0.1访问。
方案二:用iptables做端口转发,无需修改sshd配置
如果不想改动sshd的监听设置,也可以通过iptables的NAT转发,把来自第二台VPS的公网IP的22端口请求,转发到第一台的VPN地址的22端口上。
操作步骤(以第一台VPS为例):
- 添加DNAT转发规则:
iptables -t nat -A PREROUTING -s 170.168.0.1 -p tcp --dport 22 -j DNAT --to-destination 192.170.0.1:22
这条规则的意思是:所有来自170.168.0.1(第二台VPS公网IP)的TCP 22端口请求,都转发到本地的192.170.0.1:22(sshd监听的VPN地址)。
2. 保存iptables规则,防止重启VPS后失效:
- Debian/Ubuntu系统:
iptables-save > /etc/iptables/rules.v4
- CentOS/RHEL系统:
service iptables save
现在你在第二台VPS上直接ssh root@192.168.0.1,请求会被第一台的iptables转发到VPN地址的sshd,就能顺利连接了。
两种方案对比
- 方案一更直观,权限控制更精细,但需要重启sshd服务(如果在线业务依赖sshd,建议先在测试环境验证)。
- 方案二无需改动sshd配置,不影响现有VPN用户的访问,适合不想重启服务的场景。
备注:内容来源于stack exchange,提问作者Hakim
相关产品推荐
相关产品推荐

