目标
我们有一个正常运行的 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
因此,如果有人有更好的想法,我很乐意将他们的答案标记为正确。
谢谢你的阅读。