我有一个连接到 OpenVPN 服务器的 OpenVPN 客户端。
服务器有以下路由:
default via 10.109.185.65 dev eth0 proto dhcp src 10.109.185.84 metric 100
10.8.0.0/24 dev tun0 proto kernel scope link src 10.8.0.1
10.109.185.64/27 dev eth0 proto kernel scope link src 10.109.185.84
10.109.185.65 dev eth0 proto dhcp scope link src 10.109.185.84 metric 100
tun0
客户端在OpenVPN 创建的虚拟接口上具有以下地址:
11: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
link/none
inet 10.8.0.3/24 brd 10.8.0.255 scope global tun0
valid_lft forever preferred_lft forever
inet6 fe80::3c55:91d1:e8cf:7c55/64 scope link flags 800
valid_lft forever preferred_lft forever
从服务器上,我可以通过执行 ping 操作来 ping 客户端,ping 10.8.0.3
并且工作正常。
tun0
然后我通过执行以下操作在客户端上添加了第二个 IP 地址ip addr add 10.100.1.2/24 dev tun0
。在界面上显示tun0
为:
inet 10.100.1.2/24 scope global tun0
valid_lft forever preferred_lft forever
在服务器上,我通过执行以下操作添加了该子网的路由ip route add 10.100.1.0/24 dev tun0
。它在路由列表中显示为:
10.100.1.0/24 dev tun0 scope link
ping 10.100.1.2
但在服务器上尝试失败。
然后我注意到服务器和客户端都有以下 iptables FORWARD 规则:
ACCEPT all -- 10.8.0.0/24 anywhere
iptables -A FORWARD -s 10.100.1.0/24
因此,我通过在服务器和客户端上执行此操作,为 10.100.1.0 子网添加了另一个 FORWARD 规则。
ping 10.100.1.2
但在服务器上尝试仍然失败。
为了能够从服务器 ping 通 10.100.1.2,我还需要做什么吗?
答案1
需要考虑三件事:
1. 路由
第二个 IP 范围 ( 10.100.1.0/24
) 将直接附加到tun0
接口。因此,您的机器将知道如何访问10.100.1.0/24
网络,而无需注入任何静态路由语句。添加第二个IP后不久,执行以下命令,您将看到路由已动态添加到表中。
$ sudo ip route show
2. 点对点网络
tun0
创建 VPN 隧道时,您可以使用VPN 服务器和客户端之间的虚拟网络适配器(在本例中)创建点对点网络。向此接口分配第二个或第三个或更多 IP 地址会使点对点变得复杂。
3、解决方案
创建一个新的虚拟网络适配器,您将为其分配所选的第二个 IP 地址。除非需要,否则不需要路由声明。此外,不需要进一步的iptables
规则。 (您必须删除之前创建的静态路由,并删除附加的 iptables 规则。您不需要任何这些来使您的东西正常工作)
从 VPN 服务器:
$ lsmod | grep dummy
上面的命令检查内核中是否加载了“虚拟”网络驱动程序(模块)。如果没有加载,请检查文档这里
$ sudo ip link add tun99 type dummy
$ sudo ip link set dev tun99 up
上面的命令将创建一个名为的新虚拟网络适配器tun99
$ sudo ip address change dev tun99 10.100.1.1
10.100.1.1/32
上面的命令将为新创建的网络适配器 分配一个 IP 地址tun99
由于它是点对点网络,因此不需要路由声明
从 VPN 客户端:
$ sudo ip link add tun99 type dummy
$ sudo ip link set dev tun99 up
$ sudo ip address change dev tun99 10.100.1.2
通过从 VPN 客户端向 VPN 服务器的 IP 发送 ping 请求来测试连接 10.100.1.1
$ ping 10.100.1.1
答案2
iptables -A FORWARD -s 10.100.1.0/24
如果此命令不包含-j ACCEPT
,您所做的就是添加一个流量计数器来测量与 10.100.1.0/24 网络匹配的到达规则集中该点的数据包+字节数。如果您指定一个没有任何操作的规则,它将只是坐在那里,计算与该规则匹配的数据包,而不执行任何其他操作。
另外,-A
选项追加将新规则添加到表中现有规则集的末尾;规则按顺序处理,如果表的最后一条规则有“拒绝所有”规则(这是通常推荐的做法),则其后的任何规则都不会产生任何影响。如果是这样,您应该将新规则插入到更合适的位置。