为 OpenVPN 客户端分配公共 IP。iptables、路由或者用什么来实现?

为 OpenVPN 客户端分配公共 IP。iptables、路由或者用什么来实现?

我有一台配置了 Pi-Hole 的服务器,用于屏蔽广告和跟踪器。客户端通过 OpenVPN 连接,并从 10.8.0.0/24 获取地址。OpenVPN 仅将 DNS 推送到客户端,流量通过本地网关路由,但当然,VPN 上的每个客户端都可以通过其 10.8.0.x 地址联系其他每个客户端。

我已订购第二个 ipv4,专门用于客户端 10.8.0.4。我希望能够访问公共 IP 并将该客户端直接暴露给互联网以使用本地托管的 Nextcloud。

我搜索了 Server Fault,发现了一些类似的问题。我尝试将 POSTROUTING 和 PREROUTING 规则添加到 iptables,但没有成功。ipv4 目前通过“ip addr add xx.xx.xx.xx. dev eth0”临时添加到 eth0,而不是 tun0(对吗?)。OpenVPN 服务器的配置与 Pi-Hole 文档中提到的完全一致(https://docs.pi-hole.net/guides/vpn/openvpn/only-dns-via-vpn/).net.ipv4.ip_forward 已启用。

我是否必须使用 iptables?是否可以或建议将公共 IP 添加到路由或其他内容?如果问题听起来很愚蠢,请见谅。我对 OpenVPN 和路由/iptables 配置还很陌生。

这是我尝试的第一件事:使用 iptables 将所有传入流量从辅助公共 IP 重定向到内部 IP 地址

我当前的 iptables 规则是:

# Generated by xtables-save v1.8.2 on Thu Dec 12 14:37:26 2019
*nat
:PREROUTING ACCEPT [329:28209]
:INPUT ACCEPT [281:25114]
:POSTROUTING ACCEPT [17:1423]
:OUTPUT ACCEPT [245:22126]
-A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to-source xx.xx.xx.xx
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Thu Dec 12 14:37:26 2019
# Generated by xtables-save v1.8.2 on Thu Dec 12 14:37:26 2019
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i tun0 -j ACCEPT
-A INPUT -i tun0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i tun0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i tun0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i tun0 -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 2202 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 1194 -j ACCEPT
-A INPUT -p udp -m udp --dport 1194 -j ACCEPT
-A INPUT -p udp -m udp --dport 80 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p udp -m udp --dport 443 -j REJECT --reject-with icmp-port-unreachable
COMMIT
# Completed on Thu Dec 12 14:37:26 2019

iptables NAT 规则:

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
SNAT       all  --  10.8.0.0/24         !10.8.0.0/24          to:xx.xx.xx.xx
MASQUERADE  all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

在 NiKiZe 发表评论后,我通过以下方式临时添加了公共 IP 地址

ip addr add xx.xx.xx.xx dev eth0

并输入了两个规则(澄清一下:我通过 iptables-save 导出了工作规则集,编辑了两个命令并通过 iptables-restore 恢复了它)

-A PREROUTING -d xx.xx.xx.xx -j DNAT --to-destination 10.8.0.4
-A POSTROUTING -s 10.8.0.4 ! -d 10.8.0.4 -j SNAT --to-source xx.xx.xx.xx

然后我打开了几个终端会话,并在 OpenVPN 服务器和本地服务器上使用 tcpdump 监控网络流量,确认从 eth0 到 pi.hole.http 的传入流量已正确路由到我的本地服务器 server.vpn.http。但答案超时了...

我当前的 nat 规则是:

user@dns:~# iptables -t nat -vL --line-numbers
Chain PREROUTING (policy ACCEPT 1 packets, 52 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 DNAT       all  --  any    any     anywhere             pi.hole              to:10.8.0.4

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 1 packets, 60 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 SNAT       all  --  any    any     server.vpn        !server.vpn         to:xx.xx.xx.xx <- temporarily added ip address
2        0     0 SNAT       all  --  any    any     10.8.0.0/24         !10.8.0.0/24          to:xx.xx.xx.xx <- main ip address, statically entered
3        0     0 MASQUERADE  all  --  any    eth0    anywhere             anywhere

Chain OUTPUT (policy ACCEPT 1 packets, 60 bytes)
num   pkts bytes target     prot opt in     out     source               destination

另一处编辑:当我将“src server.vpn”添加到 tcpdump 时,我可以看到本地服务器没有出站流量。因此,本地服务器配置或后路由规则肯定存在问题。我说得对吗?

更改服务器上的路由后,vpn 连接就可以正常工作了。'route -n' 之前:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.178.1   0.0.0.0         UG    0      0        0 eth0
10.8.0.0        0.0.0.0         255.255.255.0   U     0      0        0 tun0
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth3
169.254.160.0   169.254.160.1   255.255.248.0   UG    0      0        0 tun1000
169.254.160.0   0.0.0.0         255.255.248.0   U     0      0        0 tun1000
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.178.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0

之后:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.8.0.1        0.0.0.0         UG    0      0        0 tun0
10.8.0.0        0.0.0.0         255.255.255.0   U     0      0        0 tun0
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth3
169.254.160.0   169.254.160.1   255.255.248.0   UG    0      0        0 tun1000
169.254.160.0   0.0.0.0         255.255.248.0   U     0      0        0 tun1000
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.178.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0

如果我理解正确的话,这意味着每个网络连接,即使是由 server.vpn 发起的,也会通过 VPN 路由。这不是预期的行为。我只是希望服务器可以在本地访问,并使用常规的本地路由互联网,并应答从 OpenVPN 服务器上的公共 IP 路由的连接。

相关内容