OpenVPN 客户端是否可以更改“tun”设备的 IP 地址而忽略“ifconfig-push”?

Irf*_*tif 1 routing openvpn static-ip

我已经为连接到在 AWS EC2 (CentOS) 实例上运行的 OpenVPN 服务器的客户端设置了静态 IP 配置。分配静态 IP 的目的是将QUOTA使用分配iptables给每个客户端,以便控制带宽使用。

以下是我的配置:

服务器.conf:

mode server
tls-server
dev tun

topology subnet
push "topology subnet"

ifconfig 10.8.1.1 255.255.255.0
push "route-gateway 10.8.1.1"

port 443
proto tcp-server

push "redirect-gateway def1 bypass-dhcp"

ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
tls-crypt tc.key
cipher AES-256-CBC

user nobody
group nobody
persist-key
persist-tun

client-config-dir /etc/openvpn/ccd/

management localhost 7505
Run Code Online (Sandbox Code Playgroud)

/etc/openvpn/ccd/client:

ifconfig-push 10.8.1.2 255.255.255.0
Run Code Online (Sandbox Code Playgroud)

iptables 规则:

-P FORWARD DROP
-A FORWARD -d 10.8.1.2/32 -g client
-A FORWARD -s 10.8.1.2/32 -g client
-A client -m quota --quota 10000000000 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

客户端.ovpn:

client
dev tun

remote-cert-tls server
cipher AES-256-CBC

pull
resolv-retry infinite

remote xyz.dynu.net 443 tcp-client
nobind

<ca> ... </ca>
<cert> ... </cert>
<key> ... </key>
<tls-crypt> ... </tls-crypt>
Run Code Online (Sandbox Code Playgroud)

客户包括 Windows、Linux 和 Android 用户。

我的问题是:

  • 是否可以client(通过手动配置 IP 地址和路由)使用 IP10.8.1.3而不是10.8.1.2从服务器推送的IP ?
  • 如果是,我们如何防止这种情况发生?

我不喜欢,topology net30因为这已经过时了,并且为客户端留下了更小的 IP 池。

这里提出了一个类似的问题:防止 openvpn 客户端更改 tap 设备的 ip但这不适用于tun设备。

一个旧线程缺少链接 强制客户端接受 ifconfig-push状态:

当它(OpenVPN 服务器)收到来自特定客户端的数据包时,它会进行反向路径检查以确认它是否正在发送到源 IP 地址,它将发送到该客户端。如果没有,它会丢弃数据包。

因此,如果客户端选择不同的 IP 地址,数据包将无法通过。

这种行为是否记录在某处并且这是否适用于最新的 OpenVPN 版本(2.4.6)?

Kar*_*Vlk 5

您发布的旧线程中 Neil Brown 的引用后面是对源代码的引用:

请参阅 multi.c 和周围代码第 1605 行的注释。

我认为他指的是现在第 2569 行的评论:

/* make sure that source address is associated with this client */
Run Code Online (Sandbox Code Playgroud)

稍后,在第 2580 和 2690 行,您可以看到这可能会导致以下日志消息:

“MULTI:来自客户端 [%s] 的错误源地址,数据包丢失”

所以我的猜测是它今天仍然适用。

为了将来参考,“今天”指的是 2.4.7 版。

编辑:

我今天设置了一个测试 OpenVPN 服务器。我还在机器的防火墙中设置了一个规则来计算来自虚拟接口的所有传入数据包。从客户端连接后,我能够 ping 另一个可通过服务器访问的地址,并且计数器正在增加(即使对于不存在的主机)。然后我更改了客户端界面上的地址:

ip a add 192.168.1.3/24 dev tun0
ip a del 192.168.1.2/24 dev tun0
Run Code Online (Sandbox Code Playgroud)

我无法再通过该接口 ping 任何东西,计数器也没有增加。看起来客户端仍在通过隧道发送数据包,因为当我在客户端上将详细程度设置为 5 时,rW对于发送的每个 ping 数据包,我都会得到一个。r表示从tun接口接收到的数据包(从openvpn进程的角度来看),并且W是该数据包被封装并发送到服务器。(通常,Rw如果有回复,我也会收到。)这表明数据包正在服务器端丢弃,这很好。

我没有看到包在服务器被丢弃openvpn的日志,但可能是因为我的详细程度设置为3,并根据这个D_MULTI_DROPPED在4只显示了以上。

然后我将地址改回最初分配的地址(无需重新启动连接):

ip a add 192.168.1.2/24 dev tun0
ip a del 192.168.1.3/24 dev tun0
Run Code Online (Sandbox Code Playgroud)

一切又开始工作了,计数器在增加,现有的主机也在回复。