You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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互联)

  1. 复用你在A上生成的OpenVPN证书链(或者单独生成一套,确保A和B信任彼此的证书)
  2. 创建配置文件/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
    
  3. 启动并启用服务:
    systemctl start openvpn@server-b && systemctl enable openvpn@server-b
    

在服务器A上配置OpenVPN客户端(连接到B的服务器)

  1. 创建配置文件/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
    
  2. 启动并启用服务:
    systemctl start openvpn@client-to-b && systemctl enable openvpn@client-to-b
    
  3. 此时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:加固系统网络配置

  1. 确认IPv4转发已永久开启(你已经做了,但再确认下):
    echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
    sysctl -p
    
  2. 不要直接关闭防火墙,建议配置规则(更安全):
    • 在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
      

步骤5:客户端配置调整

你的客户端配置基本没问题,只需要确保remote指向A的公网IP和主OpenVPN端口(比如1194),连接后:

  1. 查看客户端路由表,确认默认路由指向tun接口
  2. 访问https://icanhazip.com,检查出口IP是否是B的公网IP
  3. 测试之前会出现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 10:40:26