![OpenVPN 客户端是否可以忽略“ifconfig-push”来更改“tun”设备的 IP 地址?](https://linux22.com/image/731878/OpenVPN%20%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E5%BF%BD%E7%95%A5%E2%80%9Cifconfig-push%E2%80%9D%E6%9D%A5%E6%9B%B4%E6%94%B9%E2%80%9Ctun%E2%80%9D%E8%AE%BE%E5%A4%87%E7%9A%84%20IP%20%E5%9C%B0%E5%9D%80%EF%BC%9F.png)
我为连接到在 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
在/etc/openvpn/ccd/客户端:
ifconfig-push 10.8.1.2 255.255.255.0
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
客户端.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>
客户端包括 Windows、Linux 和 Android 用户。
我的问题是:
- 是否可以
client
通过手动配置 IP 地址和路由来使用从服务器推送的IP10.8.1.3
来代替?10.8.1.2
- 如果是,我们该如何防止这种情况发生?
我不喜欢它,topology net30
因为它已经过时了,并且会给客户端留下更小的 IP 池。
这里有一个类似的问题:防止 openvpn 客户端更改 tap 设备的 ip但这不适用于tun
设备。
一个老话题缺失环节 强制客户端接受 ifconfig-push状态:
当它(OpenVPN 服务器)收到来自特定客户端的数据包时,它会进行反向路径检查,以确认如果要发送到源 IP 地址,它会发送到该客户端。如果不是,它会丢弃数据包。
因此,如果客户端选择不同的 IP 地址,数据包将无法通过。
这种行为是否有记录在某处?这是否适用于最新的 OpenVPN 版本(2.4.6)?
答案1
您发布的旧帖子中 Neil Brown 的引言后面是源代码的引用:
参见multi.c第1605行的注释及其周围的代码。
我认为他指的是现在的评论2569 行:
/* make sure that source address is associated with this client */
稍后,在第 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
我无法再通过该接口 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
一切又恢复正常,计数器不断增加,现有主机正在响应。