如何配置通过OpenVPN访问服务器的SSH连接并解决IP限制问题
解决OpenVPN连接后无法SSH到服务器的问题
嘿,我完全懂你的困扰——你通过hosts.allow和hosts.deny把SSH访问限制在了指定公网IP,但OpenVPN客户端走的是10.8.0.x这类内网网段,自然被hosts.deny的sshd : ALL给拦住了。下面给你几个实用的解决思路,按需选就行:
方法一:直接将OpenVPN网段加入hosts.allow
这是最省心的方案,直接把OpenVPN的客户端子网添加到允许列表:
- 编辑
/etc/hosts.allow文件,在现有规则下方新增一行:
如果你修改过OpenVPN的默认网段,记得把sshd : 10.8.0.0/2410.8.0.0/24替换成你实际使用的子网段。 - 保存文件后无需重启服务,
tcpwrappers会自动加载新规则。
方法二:用OpenVPN脚本动态管理允许列表
如果你的OpenVPN客户端IP是动态分配的,或者想实现“连接时自动放行、断开时自动移除”的灵活控制,可以用OpenVPN的客户端钩子脚本:
- 创建连接触发脚本
/etc/openvpn/client-connect.sh,内容如下:#!/bin/bash echo "sshd : $ifconfig_pool_remote_ip" >> /etc/hosts.allow - 创建断开触发脚本
/etc/openvpn/client-disconnect.sh:#!/bin/bash sed -i "/sshd : $ifconfig_pool_remote_ip/d" /etc/hosts.allow - 给两个脚本添加执行权限:
chmod +x /etc/openvpn/client-connect.sh /etc/openvpn/client-disconnect.sh - 编辑OpenVPN服务器配置文件(通常是
/etc/openvpn/server.conf),添加两行配置:client-connect /etc/openvpn/client-connect.sh client-disconnect /etc/openvpn/client-disconnect.sh - 重启OpenVPN服务让配置生效:
systemctl restart openvpn@server
方法三:改用iptables替代tcpwrappers
如果你觉得hosts.allow/hosts.deny的控制粒度不够,也可以用iptables来实现更灵活的SSH访问控制,同时覆盖公网IP和OpenVPN网段:
- 添加允许规则,然后拒绝其他所有SSH请求:
把iptables -A INPUT -p tcp --dport 22 -s x.x.x.x -j ACCEPT iptables -A INPUT -p tcp --dport 22 -s 10.8.0.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROPx.x.x.x替换成你原来允许的公网IP,10.8.0.0/24替换为你的OpenVPN网段。 - 记得保存iptables规则,避免重启后失效:Debian/Ubuntu用
iptables-save > /etc/iptables/rules.v4,CentOS/RHEL用service iptables save。
这三个方案各有侧重:方法一适合固定网段的简单场景,方法二更适合动态IP的灵活管控,方法三则是功能更强的防火墙级控制。挑最适合你的就行~
内容的提问来源于stack exchange,提问作者jamiryo




