我的情况如下: 1-我有 2 个 OpenVPN 服务器(服务器 A 和服务器 B)。
2- 客户端通过 VPN 连接到每个服务器,没有直接的 LAN。
3-服务器 B 作为 VPN 客户端连接到服务器 A。
4- 服务器 B 运行 2 个 OpenVPN 实例
5- Asuume 笔记本电脑 B 通过 VPN 连接到服务器 B,我需要它至少到达服务器 A。
6- 服务器 A VPN DHCP 为 10.8.0.0/24
7- 服务器 B VPN DHCP 为 172.30.0.0/16
8- 服务器 B 具有静态 IP 10.8.0.101(VPN 客户端)
- 问题是我无法从笔记本电脑 B 访问服务器 A。并且服务器 A 无法通过 VPN 服务器 IP 而不是客户端 IP 访问服务器 B。
网络配置如下:
服务器 A 配置
[root@localhost ~]# ifconfig
eth0 inet addr:X.X.X.X Bcast:X.X.X.255 Mask:255.255.255.0
eth0:0 inet addr:X.X.X.X Bcast:X.X.255.255 Mask:255.255.0.0
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.8.0.1 P-t-P:10.8.0.2 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:629066 errors:0 dropped:0 overruns:0 frame:0
TX packets:416252 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:136006302 (129.7 MiB) TX bytes:114377768 (109.0 MiB)
服务器 B
[root@vps8887 ~]# ifconfig
eth0 inet addr:X.X.X.X Bcast:X.X.X.255 Mask:255.255.255.0
eth0:0 inet addr:X.X.X.X Bcast:X.X.X.255 Mask:255.255.255.0
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:172.30.0.1 P-t-P:172.30.0.2 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:69 errors:0 dropped:0 overruns:0 frame:0
TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:4140 (4.0 KiB) TX bytes:240 (240.0 b)
tun1 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.8.0.101 P-t-P:10.8.0.102 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:34 errors:0 dropped:0 overruns:0 frame:0
TX packets:105 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:2856 (2.7 KiB) TX bytes:8820 (8.6 KiB)
服务器 A 的路由:
[root@localhost ~]# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
10.8.0.2 * 255.255.255.255 UH 0 0 0 tun0
10.8.0.0 10.8.0.2 255.255.255.0 UG 0 0 0 tun0
192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
172.16.0.0 * 255.255.0.0 U 0 0 0 eth0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
服务器B的路由:
[root@vps8887 ~]# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
10.8.0.102 * 255.255.255.255 UH 0 0 0 tun1
172.30.0.2 * 255.255.255.255 UH 0 0 0 tun0
X.X.X.0 * 255.255.255.0 U 0 0 0 eth0
10.8.0.0 10.8.0.101 255.255.255.0 UG 0 0 0 tun1
X.X.X.0 * 255.255.255.0 U 0 0 0 eth0
172.30.0.0 172.30.0.2 255.255.0.0 UG 0 0 0 tun0
link-local * 255.255.0.0 U 0 0 0 eth0
default X.X.X.1 0.0.0.0 UG 0 0 0 eth0
default X.X.X.1 0.0.0.0 UG 0 0 0 eth0
当我尝试在服务器 A 上添加路由时出现问题,添加以下命令:
route add -net 172.30.0.0/16 gw 10.8.0.101
出现此错误:
“SIOCADDRT:网络不可访问”
服务器A端口1194的OpenVPN配置
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
client-to-client
duplicate-cn
server 10.8.0.0 255.255.255.0
client-config-dir ccd
push "dhcp-option DNS 10.8.0.1"
status openvpn-status.log
keepalive 10 120
comp-lzo
persist-key
persist-tun
crl-verify /etc/openvpn/crl.pem
verb 3
================ Server B Client ccd ================
push "dhcp-option DNS 8.8.8.8"
ifconfig-push 10.8.0.101 10.8.0.102
=====================================================
服务器 B 的 OpenVPN 配置
======================= Server B ( Server Config )========================
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
client-to-client
duplicate-cn
server 172.30.0.0 255.255.0.0
push " route 10.8.0.0 255.255.255.0 "
status openvpn-status.log
keepalive 10 120
comp-lzo
persist-key
persist-tun
verb 3
==============================================================================
================= Server B ( Client Config )==============================
client
dev tun
proto udp
remote serverA 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
route-nopull
route 10.8.0.0 255.255.255.0 10.8.0.101
comp-lzo
verb 5
===============================================================================
最后:我需要这些站点相互交流。
答案1
OpenVPN 路由命令概述
路线
该route
命令进入服务器配置并告诉服务器将路由添加到其自己的内核路由表。您不需要在指令route
中为子网添加命令server
,但您需要route
为服务器应处理的每个其他子网添加命令。本质上,这将告诉内核将这些子网发送到 openvpn 服务器。例如:
# serverA.conf (just a fragment)
server 10.8.0.0 255.255.255.0
...
route 172.30.0.0 255.255.255.0 # Add a route to the kernel routing table
伊洛特
该iroute
命令创建对 openvpn 而言“内部”的路由,以便 openvpn 服务器知道哪些客户端负责子网,如下所述这里和这里。在数据包到达内核路由表之前,openvpn 会在数据包从 tun/tap 设备进入时对其进行解密,并检查它们以查看如何处理它们。如果没有 iroute 命令,服务器将无法识别它们。
# ccd/ServerB.conf
iroute 172.30.0.0
按“路线...”
该push
命令还可用于其他用途,但对于路由,您需要push
子网到客户端的路由。这将告诉客户端更改其内核路由表以将流量发送到 VPN 服务器。没有这个,客户端将不知道如何从私有子网 10.8.0.0 到 172.30.0.0 获取数据包。这些应该进入 ccd/client 或仅进入服务器配置(如果它适用于所有客户端)。
# ServerA.conf (more of the fragment)
server 10.8.0.0 255.255255.0
...
route 172.30.0.0 255.255.255.0 # add the route to the server's kernel
push "route 172.30.0.0 255.255.255.0" # add the route to the clients
客户对客户
该client-to-client
命令告诉服务器允许客户端相互通信。我相信这是默认注释的,并且是必要的。
内核ip转发
这不是 OpenVPN 配置,以下内容特定于 Linux。不过,这对于运行 OpenVPN 服务器的任何人来说都很重要。每个服务器都必须在内核中启用 IP 转发,例如这. 还要确保防火墙规则不会阻止转发。
关于您的设置
看起来您缺少iroute
指令。服务器 B 需要在其 ccd 文件中有一个条目。该iroute
命令告诉 openvpn 服务器哪个客户端知道该子网。
# ccd/ServerB
iroute 172.30.0.0 255.255.255.0
编辑:再看一遍,我注意到另一件事。
看起来服务器 A 并没有将到服务器 B 的路由推送给它的客户端:
# ServerA config
push " route 172.30.0.0 255.255.255.0 "
我用两台运行 openvpn 的服务器执行此操作。您不必手动向任何机器添加任何路由。如果您正确配置了 openvpn,服务器 B 将使用 告诉服务器 A 它处理 172.30.0.0 iroute
。服务器 A 将使用 告诉客户端通过服务器 A 发送 172.30.0.0 push " route ... "
。并且您已经让服务器 B 推送 10.8.0.0 的路由。
为了测试这是否有效,我建议ping
不要尝试添加路线。
答案2
我自己解决了。重要的是“ipforwarding”在两边都没有启用。这是主要问题。iroute 对我来说不清楚,我看了这篇文章: OpenVPN 和 iroute 路由全部由OpenVPN完成,无需手动路由,如下图所示:
最后感谢Danger Ginger的帮助。