CentOS 7服务器间基于tun0设备搭建OpenVPN多跳网络的配置求助
CentOS 7服务器间基于tun0设备搭建OpenVPN多跳网络的配置求助
看起来你已经理清了多跳OpenVPN的核心思路——通过服务器A中转,把客户端流量导向拥有无限互联网的服务器B,这个方案完全可行,我来帮你补全配置里的关键细节和遗漏步骤,让整个链路跑通:
先明确目标拓扑
本地客户端 → OpenVPN服务器A(tun0: 10.8.0.0/24) → 站点到站点隧道 → 服务器B(tunX: 10.9.0.0/24) → B的eth0出口到互联网
步骤1:搭建A和B之间的稳定站点到站点隧道
你之前手动创建tun0的方式只是给设备加了地址,但没有建立双向连通的隧道。推荐用OpenVPN做站点到站点隧道(比SSH隧道更稳定可靠):
在服务器B上部署小型OpenVPN服务器(用于和A互联)
- 复用你在A上生成的OpenVPN证书链(或者单独生成一套,确保A和B信任彼此的证书)
- 创建配置文件
/etc/openvpn/server-b.conf:dev tun proto tcp port 1195 # 选一个和A的OpenVPN端口(比如1194)不同的端口 server 10.9.0.0 255.255.255.0 push "route 10.8.0.0 255.255.255.0" # 告诉B要把A的客户端网段流量路由回来 persist-key persist-tun cipher AES-256-CBC auth SHA512 ca ca.crt cert server-b.crt key server-b.key dh dh.pem keepalive 10 120 user nobody group nobody status openvpn-status.log verb 3 - 启动并启用服务:
systemctl start openvpn@server-b && systemctl enable openvpn@server-b
在服务器A上配置OpenVPN客户端(连接到B的服务器)
- 创建配置文件
/etc/openvpn/client-to-b.conf:client dev tun proto tcp remote [B的公网IP] 1195 resolv-retry infinite nobind persist-key persist-tun remote-cert-tls server auth SHA512 cipher AES-256-CBC ca ca.crt cert client-a.crt key client-a.key verb 3 - 启动并启用服务:
systemctl start openvpn@client-to-b && systemctl enable openvpn@client-to-b - 此时A会生成一个新的tun接口(比如
tun1),获得10.9.0.x的地址,你可以用ping 10.9.0.1测试和B的连通性。
步骤2:调整A的OpenVPN服务器配置,引导客户端流量到B
修改A的主OpenVPN服务器配置(比如/etc/openvpn/server.conf),添加以下内容:
push "redirect-gateway def1 bypass-dhcp" # 让客户端把所有互联网流量发往A push "dhcp-option DNS 8.8.8.8" # 给客户端指定公共DNS,避免解析问题 route 0.0.0.0 0.0.0.0 10.9.0.1 # 告诉A把所有互联网流量转发到B的隧道地址
重启A的OpenVPN服务生效:
systemctl restart openvpn@server
步骤3:完善iptables转发和NAT规则(修正你之前的规则)
在服务器A上:
A只需要做流量转发,不需要做NAT(最终NAT由B完成),添加规则:
# 允许客户端网段到B隧道的流量转发 iptables -A FORWARD -i tun0 -o tun1 -j ACCEPT # 允许B返回给客户端的流量转发 iptables -A FORWARD -i tun1 -o tun0 -j ACCEPT
在服务器B上:
保留你之前的MASQUERADE规则,同时添加转发规则:
# 允许A隧道到互联网的流量转发 iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT # 允许互联网返回给A的流量转发 iptables -A FORWARD -i eth0 -o tun0 -j ACCEPT # 保留你已有的NAT规则 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
步骤4:加固系统网络配置
- 确认IPv4转发已永久开启(你已经做了,但再确认下):
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p - 不要直接关闭防火墙,建议配置规则(更安全):
- 在A上:
firewall-cmd --add-service=openvpn --permanent firewall-cmd --add-port=1194/tcp --permanent # A的主OpenVPN端口 firewall-cmd --add-port=1195/tcp --permanent # A连接B的隧道端口 firewall-cmd --add-masquerade --permanent firewall-cmd --reload - 在B上:
firewall-cmd --add-service=openvpn --permanent firewall-cmd --add-port=1195/tcp --permanent firewall-cmd --add-masquerade --permanent firewall-cmd --reload
- 在A上:
步骤5:客户端配置调整
你的客户端配置基本没问题,只需要确保remote指向A的公网IP和主OpenVPN端口(比如1194),连接后:
- 查看客户端路由表,确认默认路由指向tun接口
- 访问
https://icanhazip.com,检查出口IP是否是B的公网IP - 测试之前会出现403的网站,确认访问正常
备选方案:用SSH隧道实现A和B的tun互联(不推荐长期使用)
如果你坚持用SSH隧道,也可以这样操作:
- 在B上执行:
ip tuntap add dev tun0 mode tun ip addr add 10.9.0.1/24 dev tun0 ip link set dev tun0 up ssh -f -N -T -w 0:0 [A的用户名]@[A的公网IP] - 在A上执行:
ip addr add 10.9.0.2/24 dev tun0 ip link set dev tun0 up
之后的路由、iptables规则和上面的OpenVPN站点到站点方案一致,但SSH隧道稳定性不如OpenVPN,适合临时测试。
备注:内容来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

