この問題を解決するのに役立ちますか? tun0インターフェイス(OpenVPNトンネル)のすべてのトラフィックをeth1インターフェイスにリダイレクトする必要があります。 eth1はこのシステムの背後にある内部ネットワークであり、特別なファイアウォールとして使用されます。
iptables -t nat -A PREROUTING -i tun0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.199.115.146
VPN のトラフィックが正しく転送されます。 iptables統計(iptables -L -v)で見ることができますが、逆方向トラフィックは通過しません。 iptablesに次のエラーが表示されます。
99689.703349 x_tables: ip_tables: tcp match: only valid for protocol 6
ファイアウォールの背後にあるコンピュータからのすべてのトラフィックは、ton0インターフェイスを介してのみリダイレクトする必要があります。私もこのルールを使います:
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
私はそれを活性化しました。ルールなしでip_forward
ルールを使用すると、ルールのiptables統計アクティビティで表示できます。-p tcp
-m tcp
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
相互作用
VPNサーバー(A):
eth0 Link encap:Ethernet HWaddr 00:...
inet addr:MY_PUBLIC_IP Bcast:MY_PUBLIC_IP.255 Mask:255.255.255.0
inet6 addr: .../64 Scope:Global
inet6 addr: .../64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:41909528 errors:0 dropped:0 overruns:0 frame:0
TX packets:373639 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2150448064 (2.1 GB) TX bytes:185713075 (185.7 MB)
Interrupt:10
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.1.1.1 P-t-P:10.1.1.2 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:82014 errors:0 dropped:0 overruns:0 frame:0
TX packets:164251 errors:0 dropped:24 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:5945388 (5.9 MB) TX bytes:147587733 (147.5 MB)
ファイアウォールマシンで:
eth0 Link encap:Ethernet HWaddr 08:...
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:189399 errors:0 dropped:0 overruns:0 frame:0
TX packets:103528 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:180399131 (180.3 MB) TX bytes:14844868 (14.8 MB)
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.1.1.2 P-t-P:10.1.1.1 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:153314 errors:0 dropped:0 overruns:0 frame:0
TX packets:80986 errors:0 dropped:8 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:145341797 (145.3 MB) TX bytes:5818996 (5.8 MB)
eth1 Link encap:Ethernet HWaddr 08:...
inet addr:10.199.115.1 Bcast:10.199.115.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:6890 errors:0 dropped:0 overruns:0 frame:0
TX packets:23022 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:710721 (710.7 KB) TX bytes:43966879 (43.9 MB)
機械B:
eth0 Link encap:Ethernet HWaddr 08:...
inet addr:10.199.115.146 Bcast:10.199.155.255 Mask:255.255.255.0
inet6 addr: .../64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:24185 errors:0 dropped:0 overruns:0 frame:0
TX packets:8044 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:29645960 (28.2 MiB) TX bytes:842414 (822.6 KiB)
建築学:
VPN server (A) /eth0 - public IP, tun0 VPN/ <-> Firewall (F) /tun0 VPN, eth1 - internal network/ <-> Server (B) (eth0 - internal network)
ファイアウォールの背後にあるコンピュータから開始された通信が正しく機能します。助けてくれてありがとう。
ルーティングテーブル:
VPNサーバーA: - VPSサーバー。
10.1.1.2 dev tun0 proto kernel scope link src 10.1.1.1
MY_PUBLIC_IP.0/24 dev eth0 proto kernel scope link src MY_PUBLIC_IP
10.199.115.0/24 via 10.1.1.2 dev tun0
default via MY_PUBLIC_IP.1 dev eth0 metric 100
///物理サーバー
ファイアウォールF:仮想マシンVirtualBox Ubuntu - eth0はVirtualBox NATですが、tun0を使用する必要があり、eth1はBのローカルネットワークです。
0.0.0.0/1 via 10.1.1.1 dev tun0
default via 10.0.2.2 dev eth0 metric 100
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15
10.1.1.1 dev tun0 proto kernel scope link src 10.1.1.2
10.199.115.0/24 dev eth1 proto kernel scope link src 10.199.115.1
MY_PUBLIC_IP via 10.0.2.2 dev eth0
128.0.0.0/1 via 10.1.1.1 dev tun0
eth1側のマシンB(eth0なし)は仮想マシンDebian 7です。
default via 10.199.115.1 dev eth0 proto static
10.199.115.0/24 dev eth0 proto kernel scope link src 10.199.115.146
パケットルーティングはできるだけ透明または見えてはいけません。
iptablesルール:
VPNサーバー(A)から:
テーブルNATのみ:
-P PREROUTING ACCEPT
-P POSTROUTING ACCEPT
-P OUTPUT ACCEPT
-A PREROUTING -i eth0 -p tcp -m tcp --dport 0:1192 -j DNAT --to-destination 10.1.1.2
-A PREROUTING -i eth0 -p tcp -m tcp --dport 1195:65535 -j DNAT --to-destination 10.1.1.2
-A PREROUTING -i eth0 -p udp -m udp --dport 0:1192 -j DNAT --to-destination 10.1.1.2
-A PREROUTING -i eth0 -p udp -m udp --dport 1195:65535 -j DNAT --to-destination 10.1.1.2
-A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE
フィルタテーブル
is empty
マンゲルテーブル
is empty
ファイアウォール(F)から:
現在の最後の修正後
NATテーブル:
none
フィルタテーブル
contains many specific rules for mitigation etc...
マンゲルテーブル
is empty
マシンBで
without iptables rules
答え1
サーバーAにはVPNを介してネットワークに接続するための推奨パスがない10.199.115.0/24
ため、デフォルトのパスを使用します(たとえば、パブリックIPを介してBに接続しようとします)。
動作していることを確認してください。
ip route add 10.199.115.0/24 via 10.1.1.2
AからBへの接続はサーバーAで許可されています(ファイアウォールFにはNATルールはありません)。
これがうまくいけば、Aで接続を開始したときに自動的にパスを生成するようにopenvpnを設定できます。
構成で発生する状況の説明です。
3つのシナリオでルーティング/ NATが発生する方法は次のとおりです。
ケース 1: B ping PUBLIC_IP
- パケットは
default
一致する唯一のパケットであるため、そのルートを使用してBを残しますPUBLIC_IP
。10.199.115.1
最終宛先PUBLIC_IP
と送信元アドレスを含むルーティング用のIPアドレスに送信されます10.199.115.146
。 - パケットは F によってルーティングされます。多くのパスが適用されます。最も具体的な方法は、
PUBLIC_IP/32
マシンA(デフォルトのopenvpn接続)であるマシンからルーティングするパケットを送信することです。10.0.2.2
eth0
- マシンAはパケットを受信し、送信元アドレスで応答します
10.199.115.146
。私が示すルールがない場合、これはインターネットアドレスとして解釈され、応答がインターネットを介して送信されます。 - 私が提案したルートを使用して、パケットは
tun0
システムFを介して返されます。マシンFは、それをeth1
マシンBが応答パケットを受信した場所に再ルーティングします。ただし、10.1.1.1
送信元パケットに応答して認識されないように送信元がタグ付けされています。 pingに失敗しました。
ケース2:Bping 10.1.1.1
- 以前と同様に、パケットは B を出て F にルーティングされます。
- 今回は、宛先アドレスが規則10.1.1.1/32と一致するため、パケットは通過します。
tun0
- ルールはパケットの送信時に適用され、
tun0
パケットMASQUERADE
の送信元をに変更します10.1.1.2
。 (私が提案したルーティングルールを使用している場合は、これを行う必要はありません。以下を参照してください。) - マシンAはパケットを受信して応答します
10.1.1.2
(マシンF)。これがなければMASQUERADE
返送されます10.199.115.146
。私が提案したルートテーブルエントリを使用すると、パッケージはまだルートに送信されるため、あまり変わりませんがエントリが10.1.1.2
ない場合、ターゲットは10.199.115.146
インターネット経由でルーティングされます。 - 応答パケットはシステムFによって受信される。マスカレーディングが実行されると、パケットは応答として認識され、宛先アドレスが再び変更されます
10.199.115.146
。パケットはeth1
最終宛先にルーティングされます。 - マシンBはそれを応答パケットとして認識します。 pingの成功。
ケース3:ping 10.199.115.146
- 私が提案したルールがない場合、元のパケットはインターネットに送信され、失われます。それ以外の場合は、
10.1.1.2
送信元アドレス=のパスに送信されます10.1.1.1
。 - Fマシンはパケットを受信し、それを介してルーティングします
eth1
。 - Bはパケットを受信し、応答を送信します
10.1.1.1
。 - 返信はを介してルーティングされます
tun0
。このMASQUERADE
ルールはソースアドレスをに変更します10.1.1.2
。 10.1.1.2
機械Aは(元の宛先ではなく)から応答を受け取り、無関係と見なして捨てます。 ping失敗
ご覧のとおり、内部ネットワークからVPNにコンピュータを接続する方法は2つあります。
- パブリックルーティング:両方のネットワークは互いにIPアドレスを知っており、それらを照会するための特定のルーティングテーブルエントリがあります(私が示したように)。
- SNAT / MASQUERADE:1つのネットワークだけが別のネットワークに到達する方法を知っており、ファイアウォールはそのネットワークから送信されるパケットの送信元IPアドレスをファイアウォール自体のIP(別のネットワークに知られている)に変更します。
どちらかを使用しないでください。 SNAT / MASQUERADEが使用されている場合、プライベートネットワークのパケットは元のアドレスを送信元として使用しないため、外部ホストのルーティングテーブルは適用されません。
PUBLIC_IP
10.1.1.1
BからシステムAにアクセスできるかどうかを使用または選択できます。どちらも機能するようにファイアウォールを設定することが可能かもしれませんが、努力する価値はありません。