OpenVPN クライアントにパブリック IP を割り当てます。そのためには iptables、ルート、または何を使用しますか?

OpenVPN クライアントにパブリック IP を割り当てます。そのためには iptables、ルート、または何を使用しますか?

Pi-Hole が広告とトラッカーをブロックするように設定されたサーバーがあります。クライアントは OpenVPN 経由で接続され、10.8.0.0/24 からアドレスを取得します。OpenVPN は DNS をクライアントにプッシュするだけで、トラフィックはローカル ゲートウェイ経由でルーティングされますが、もちろん、VPN 上のすべてのクライアントは 10.8.0.x アドレス経由で他のすべてのクライアントにアクセスできます。

クライアント 10.8.0.4 専用に使用したい 2 番目の ipv4 を注文しました。パブリック IP にアクセスし、そのクライアントをインターネットに直接公開して、ローカルにホストされている Nextcloud を使用できるようにしたいと考えています。

Server Fault を検索したところ、似たような問題がいくつか見つかりました。POSTROUTING および PREROUTING ルールを iptables に追加しようとしましたが、うまくいきませんでした。ipv4 は現在、tun0 ではなく 'ip addr add xx.xx.xx.xx. dev eth0' によって eth0 に一時的に追加されています (正しいですか?)。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 に正しくルーティングされていることを確認しました。しかし、応答はタイムアウトします...

現在の 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

もう一つの編集: tcpdump に 'src server.vpn' を追加すると、ローカル サーバーからの送信トラフィックがないことがわかります。したがって、ローカル サーバーの構成またはポストルーティング ルールのいずれかに問題があるはずです。私の考えは正しいでしょうか?

server.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 からルーティングされた接続にも応答できるようにしたいだけです。

関連情報