為 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 Failure,發現了一些類似的問題。我嘗試在 iptables 中新增 POSTROUTING 和 PREROUTING 規則,但沒有成功。 ipv4 目前透過 'ip addr add xx.xx.xx.xx 暫時加入到 eth0。 dev eth0',而不是 tun0 (正確嗎?)。 OpenVPN 伺服器的配置與 Pi-Hole 文件中提到的完全一致(https://docs.pi-hole.net/guides/vpn/openvpn/only-dns-via-vpn/)。 net.ipv4.ip_forward 已啟用。

我甚至必須使用 iptables 嗎?是否可以或建議將公共IP新增至路由之類的?抱歉,如果這個問題聽起來很愚蠢。我對 OpenVPN 和 Route/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 監控Web 流量,確認從eth0 到pi.hole.http 的傳入流量正確路由到我的本機伺服器server.vpn. http。但答案超時...

我目前的 na 規則是:

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 時,我可以看到本機伺服器沒有出站流量。所以要嘛本地伺服器設定有問題,要嘛後路由規則有問題。我對麼?

變更 server.vpn 上的路由後,連線即可正常運作。 '路線-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 路由的連接。

相關內容