OpenVPN 路由局域网

OpenVPN 路由局域网

设置说明:

  • 一个名为 vpn1 的 VPN 服务器
  • 一个名为 vpn2 的 VPN 客户端
  • vpn1 后面有一个网络,IP 地址为 10.0.0.0/24
  • vpn2 后面有一个网络,IP 地址为 10.0.2.0/24
  • 为简单起见,VPN 盒现在是其 LAN 中机器的默认网关

服务器配置:vpn1

mode server
tls-server
dev tun

local PUBLIC-IP-HERE
port 1194
proto udp

persist-key
persist-tun

# Certificates and encryption
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/server.crt
key /etc/openvpn/easy-rsa/keys/server.key
dh /etc/openvpn/easy-rsa/keys/dh2048.pem
tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0

cipher BF-CBC        
comp-lzo            

push "route 10.0.0.0 255.255.255.0"
push "route 10.0.2.0 255.255.255.0"
push "route 10.255.254.0 255.255.255.0"
route 10.0.2.0 255.255.255.0
client-to-client
max-clients 30

user nobody
group nogroup
keepalive 10 120
status /var/log/openvpn-status.log
verb 3

ifconfig-pool-persist ipp.txt
client-config-dir ccd
server 10.255.254.0 255.255.255.0

push "explicit-exit-notify 3"

在 ccd/client 中我有:

iroute 10.0.2.0 255.255.255.0
ifconfig-push 10.255.254.9 10.255.254.10

“ip a”的样子:

3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    inet 10.0.0.1/24 brd 10.0.0.255 scope global eth1

172: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
    link/none 
    inet 10.255.254.1 peer 10.255.254.2/32 scope global tun0

“ip r” 的样子(我删除了默认路由,因为它不重要):

10.0.0.0/24 dev eth1  proto kernel  scope link  src 10.0.0.1
10.0.2.0/24 via 10.255.254.2 dev tun0 
10.255.254.0/24 via 10.255.254.2 dev tun0 
10.255.254.2 dev tun0  proto kernel  scope link  src 10.255.254.1 

客户端配置:vpn2

client
dev tun
remote PUBLIC-IP-HERE 1194
nobind
persist-key
persist-tun
proto udp

ca /etc/openvpn/easy-rsa/keys/client/ca.crt
cert /etc/openvpn/easy-rsa/keys/client/client.crt
key /etc/openvpn/easy-rsa/keys/client/client.key

tls-auth /etc/openvpn/easy-rsa/keys/client/ta.key 1
cipher BF-CBC
comp-lzo
ns-cert-type server
verb 3

“ip a”的样子:

7: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    inet 10.0.2.1/24 brd 10.0.2.255 scope global br0

8: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
    link/none 
    inet 10.255.254.9 peer 10.255.254.10/32 scope global tun0

“ip r” 的样子(我再次删除了默认网关和相关内容):

10.0.0.0/24 via 10.255.254.10 dev tun0 
10.0.2.0/24 dev br0  proto kernel  scope link  src 10.0.2.1 
10.255.254.0/24 via 10.255.254.10 dev tun0 
10.255.254.10 dev tun0  proto kernel  scope link  src 10.255.254.9 

常规配置:

  • Iptables 策略允许一切
  • 已启用 IP 转发
  • RP 过滤器已禁用

有效的方法:

  • 从 lan1 中的任意主机 ping 到 vpn2 ( 10.0.0.11 -> 10.255.254.9 )
  • 从 lan2 中的任意主机 ping 到 vpn1 ( 10.0.2.11 -> 10.255.254.1 )
  • 从 vpn1 ping 到 lan2(10.255.254.1 -> lan2 中的任何主机 10.0.2.0/24)
  • 从 vpn2 ping 到 lan1(10.255.254.9 -> lan2 中的任何主机 10.0.0.0/24)

无效的方法:

  • 从 lan1 中的任意主机 ping lan2
  • 从 lan2 中的任意主机 ping lan1

通过 NAT,我可以:

  • 从 lan1 中的任意主机 ping lan2
  • 但不能从 lan2 中的任何主机到 lan1 但不能从 lan2 中的任何主机到 lan1

我应该能够从 LAN1 ping LAN2 中的任何主机,而无需 NAT,反之亦然。这里出了什么问题?有些东西我没搞清楚,但我不知道是什么。

答案1

这是一个路由问题。

我怀疑您的 iroute 指令没有生效。您命名为“ccd/client”的文件实际上必须具有与客户端证书的主题名称相对应的文件名。因此,如果客户端证书的 DN 是C=CA,O=Foo Ltd,CN=Example,则文件应该是“ccd/Example”。

除此之外,您的配置看起来正确。

相关内容