允许 OpenVPN 中特定 IP 范围内的客户端与客户端进行通信

允许 OpenVPN 中特定 IP 范围内的客户端与客户端进行通信

目标

我们有一个正常运行的 OpenVPN 服务器 (10.8.0.0/16)。还有一些客户端。客户端可以分为两个特定组:人类和非人类。非人类只能通过 VPN 访问 VPN 服务器和几个外部 IP 地址。另一方面,人类可以访问所有内容 - 尤其是非人类(非人类客户端有一个人类可以访问的 Web 界面)。

什么有效

人类和非人类均可连接到 VPN。非人类访问已成功限制。

问题

当与人类客户端连接时,我无法 ping 非人类客户端,也无法访问非人类客户端的 Web 界面。

~ ping 10.8.0.2
PING 10.8.0.2 (10.8.0.2) 56(84) bytes of data.
From 10.8.0.1 icmp_seq=2 Redirect Host(New nexthop: 2.0.8.10)
From 10.8.0.1 icmp_seq=3 Redirect Host(New nexthop: 2.0.8.10)
From 10.8.0.1 icmp_seq=4 Redirect Host(New nexthop: 2.0.8.10)

配置

服务器配置文件

local 192.168.12.152
port 1194
proto udp
dev tun0
ca ca.crt
cert server.crt
key server.key
dh dh.pem
auth SHA512
tls-crypt tc.key
topology subnet
server 10.8.0.0 255.255.0.0
client-config-dir /etc/openvpn/ccd
push "redirect-gateway def1 bypass-dhcp"
ifconfig-pool-persist ipp.txt
push "dhcp-option DNS 1.1.1.1"
push "dhcp-option DNS 8.8.8.8"
keepalive 10 120
cipher AES-256-CBC
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3
crl-verify crl.pem
explicit-exit-notify
management 127.0.0.1 5555

sample_client.ovpn(人类与非人类之间的区别是由 ccd 造成的,其中客户端获得静态 IP 地址。人类从 10.8.255.0/24 获取 IP 地址,而非人类从 10.8.xy [x != 255] 获取 - 因此在 ccd 中只有“ifconfig-push 10.8.yy 255.255.0.0”)。

client
dev tun
proto udp
remote some-vpn-dyndns.net 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA512
cipher AES-256-CBC
ignore-unknown-option block-outside-dns
block-outside-dns
verb 3
<ca>[...]</ca>
<cert>[...]</cert>
<key>[...]</key>
<tls-crypt>[...]</tls-crypt>

Iptable 变化:

iptables -t nat -A POSTROUTING -s 10.8.0.0/16 ! -d 10.8.0.0/16 -j SNAT --to 192.168.12.152
iptables -I INPUT -p udp --dport 1194 -j ACCEPT
iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -I FORWARD -s 10.8.0.0/16 -j DROP
iptables -I FORWARD -s 10.8.0.0/16 -d 1.1.1.1 -j ACCEPT    <---for DNS
iptables -I FORWARD -s 10.8.0.0/16 -d 8.8.8.8 -j ACCEPT    <---for DNS
iptables -I FORWARD -s 10.8.0.0/16 -d 213.187.93.146 -j ACCEPT   <--- special (dummy) server that non-humans have to reach
iptables -I FORWARD -s 10.8.255.0/24 -j ACCEPT

这将添加到 iptables -L:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:1194

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  10.8.255.0/24        0.0.0.0/0           
ACCEPT     all  --  10.8.0.0/16          213.187.93.146       
ACCEPT     all  --  10.8.0.0/16          8.8.8.8             
ACCEPT     all  --  10.8.0.0/16          1.1.1.1             
DROP       all  --  10.8.0.0/16          0.0.0.0/0           

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0  

tl;dr 如果有人能告诉我为什么我无法从人类客户端 (10.8.255.1) ping 非人类客户端 (10.8.0.2) - 那就太好了。(其他一切都正常)

提前致谢!

答案1

所以我找到了一种可行的解决方案。

我做了什么?我更改了一些 FORWARD 规则。

Chain FORWARD (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  10.8.255.0/24        anywhere            
ACCEPT     all  --  10.8.0.0/16          some-dummy-server 
ACCEPT     all  --  10.8.0.0/16          dns.google          
ACCEPT     all  --  10.8.0.0/16          one.one.one.one     
ACCEPT     all  --  one.one.one.one      10.8.0.0/16         
ACCEPT     all  --  dns.google           10.8.0.0/16         
ACCEPT     all  --  some-dummy-server    10.8.0.0/16         
ACCEPT     all  --  anywhere             10.8.255.0/24 

首先:FORWARD 的默认策略设置为 DROP。其次:允许与我所有 VPN 范围的默认 DNS 服务器进行通信,允许与我的特殊虚拟服务器进行通信。第三:我允许与我的人类客户端 IP 范围内的所有内容进行通信。

为什么我说它有点用呢?因为如果我从人类客户端向非人类客户端 ping 消息,我仍然会得到以下信息:

~ ping 10.8.0.2
PING 10.8.0.2 (10.8.0.2) 56(84) bytes of data.
64 bytes from 10.8.0.2: icmp_seq=1 ttl=63 time=120 ms
From 10.8.0.1 icmp_seq=2 Redirect Host(New nexthop: 2.0.8.10)
64 bytes from 10.8.0.2: icmp_seq=2 ttl=63 time=132 ms
From 10.8.0.1 icmp_seq=3 Redirect Host(New nexthop: 2.0.8.10)
64 bytes from 10.8.0.2: icmp_seq=3 ttl=63 time=108 ms
From 10.8.0.1 icmp_seq=4 Redirect Host(New nexthop: 2.0.8.10)
64 bytes from 10.8.0.2: icmp_seq=4 ttl=63 time=102 ms

我猜这是因为我的(人类)客户端的路由表:

~ sudo route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         _gateway        0.0.0.0         UG    50     0        0 tun0
default         _gateway        0.0.0.0         UG    600    0        0 wlp0s20f3
10.8.0.0        0.0.0.0         255.255.0.0     U     50     0        0 tun0
ip5b426419.dyna _gateway        255.255.255.255 UGH   600    0        0 wlp0s20f3
link-local      0.0.0.0         255.255.0.0     U     1000   0        0 wlp0s20f3
192.168.42.0    0.0.0.0         255.255.255.0   U     600    0        0 wlp0s20f3
_gateway        0.0.0.0         255.255.255.255 UH    600    0        0 wlp0s20f3

因此,如果有人有更好的想法,我很乐意将他们的答案标记为正确。

谢谢你的阅读。

相关内容