我正在努力为 Linode 上的一组虚拟机设置 VPN 访问,拓扑结构如下所示:
db.example.com LAN: (eth0:0) 192.168.154.127/255.255.128.0
utility.example.com LAN: (eth0:0) 192.168.164.229/255.255.128.0
并且,LAN 上有更多的服务器,其地址在同一范围内。公用事业服务器托管 OpenVPN
这是我的服务器的 OpenVPN 配置,客户端配置不可用,因为我正在使用下对于OSX:
dev tun
mode server
tls-server
proto udp
port 1194
server 10.77.22.0 255.255.255.0
push "route 10.77.22.0 255.255.255.0"
push "route 192.168.154.0 255.255.128.0"
ifconfig-pool-persist ipp.txt
persist-key
persist-tun
client-to-client
ca ca.crt
dh dh1024.pem
cert server.crt
key server.key
tls-auth ta.key 0
cipher BF-CBC
comp-lzo
user nobody
group nogroup
keepalive 10 120
status openvpn-status.log
verb 3
当连接到 VPN 时,我可以 ping VPN 网关,并通过 SSH 登录,并且所有正常操作都没有问题,tcpdump
确认这些数据包正在通过tun0
我的 Mac 上的设备。
尝试192.168.154.127
通过 VPN 进行 ping 操作不起作用,tcpdump
确认设备上没有活动tun0
。
我通过阅读理解这我需要route
向我的添加一个配置server.conf
,添加以下行:
route 192.168.154.0 255.255.128.0
服务器在启动时抛出一个错误,内联在这里:
/sbin/route add -net 192.168.154.0 netmask 255.255.128.0 gw 10.77.22.2
route: netmask doesn't match route address
Usage: route [-nNvee] [-FC] [] List kernel routing tables
route [-v] [-FC] {add|del|flush} ... Modify routing table for AF.
route {-h|--help} [<AF>] Detailed usage syntax for specified AF.
route {-V|--version} Display version/author and exit.
-v, --verbose be verbose
-n, --numeric don't resolve names
-e, --extend display other/more information
-F, --fib display Forwarding Information Base (default)
-C, --cache display routing cache instead of FIB
=Use '-A ' or '--'; default: inet
List of possible address families (which support routing):
inet (DARPA Internet) inet6 (IPv6) ax25 (AMPR AX.25)
netrom (AMPR NET/ROM) ipx (Novell IPX) ddp (Appletalk DDP)
x25 (CCITT X.25)
我想如果我能解决这个/sbin/route
问题,情况就会按预期进行,但我不明白为什么会失败。
客户端通常会获得这样的地址:
tun0: flags=8951 mtu 1500
inet 10.77.22.6 --> 10.77.22.5 netmask 0xffffffff
open (pid 5142)
答案1
配置文件中的语句route
需要引用网络 ID 192.168.128.0
,而不是192.168.154.0
。route
这是错误的,因为您给了它一个网络 ID 和子网掩码,而当把它们放在一起时,主机 ID 部分为 1。
192.168.154.0 的二进制表示为:
11000000.10101000.10011010.00000000
子网掩码 255.255.128.0 如下所示:
11111111.11111111.10000000.00000000
应用于 192.168.154.0“网络 ID”的子网掩码如下所示:
11000000.10101000.10011010.00000000
AND 11111111.11111111.10000000.00000000
---------------------------------------
11000000.10101000.10000000.00000000 = 192.168.128.0
您可以看到,192.168.154.0 被 /17 子网掩码屏蔽后,子网掩码末尾会显示 1。192.168.154.0/17“网络”的网络 ID 实际上是 192.168.128.0/17。更改route
配置文件中的语句,route
命令将停止出错。
答案2
需要启用ip_forward
。除非启用,否则 Linux 机器不会路由。在 Ubuntu 上,解决这个问题的一个简单方法是调整 /etc/sysctl.conf,只需取消注释 ip_forward 行。然后重新启动系统或运行sysctl -p
。