LANからVPNへのiptablesネットワークアドレス変換[閉じる]

LANからVPNへのiptablesネットワークアドレス変換[閉じる]

2018年6月13日:誰かに役立つ解決策を見つけて、この投稿を編集しました。

まず、元の投稿は次のとおりです。

ポータルがあり、TCPおよびUDPトラフィックだけでなく、RTSPのネットワークアドレスをパブリックIPアドレスと特定のパブリックポート番号から特定のVPN IPアドレスと特定のVPNポート番号に変換したいと思います。 HTTPトンネルを介したRTP。問題は、パケットが通過できないことです。ポータルには、openvpnを実行することに加えて、LANとVPN間のトラフィックのルーティングを可能にするProxypassおよびProxypassreverseステートメントを持つapache2サーバーがありますが、TCPトラフィックに固有のものです。 apache2はUDPトラフィックを処理できないため、これを行うためにiptablesを設定してみました。イーサネットインターフェイスは1つだけです。 VPN のデバイスはインターネット上にあるため、eth0 トラフィックと tun0 トラフィックは両方とも eth0 を通過します。

iptablesにルールを設定し、eth0(/proc/sys/net/ipv4/conf/eth0/forwarding = 1)、tun0(/proc/sys/net/ipv4/conf/tun0/forwarding = 1)、およびすべて( '/proc/sys/net/ipv4/ip_forward = 1')の転送を有効にしましたが、何も起こりません。

デフォルトのiptablesルールに次のルールを追加しました。

-A PREROUTING -d 192.168.192.203/32 -p udp -m udp --dport 10073 -j DNAT --to-destination 10.221.0.73:80
-A PREROUTING -d 192.168.192.203/32 -p tcp -m tcp --dport 10073 -j DNAT --to-destination 10.221.0.73:80
-A POSTROUTING -s 10.221.0.73/32 -p udp -m udp --sport 80 -j SNAT --to-source 192.168.192.203
-A POSTROUTING -s 10.221.0.73/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.192.203

そして

-A FORWARD -d 10.221.0.73/32 -p udp -m state --state NEW,RELATED,ESTABLISHED -m udp --dport 80 -j ACCEPT
-A FORWARD -d 10.221.0.73/32 -p tcp -m state --state NEW,RELATED,ESTABLISHED -m tcp --dport 80 -j ACCEPT

これらの規則に従って、インターネットからポート10073へのUDPおよびTCPトラフィックを取得し(この場合は192.168.192.203を使用)、VPN IPアドレス10.221.0.73およびポート80に転送しようとします。

完全なルールセットは次のとおりです。

# Generated by iptables-save v1.4.14 on Thu Jun  7 16:52:00 2018
*raw
:PREROUTING ACCEPT [1930:216976]
:OUTPUT ACCEPT [1477:229328]
-A PREROUTING -p udp -m udp --dport 8073 -j TRACE
-A OUTPUT -p udp -m udp --sport 8073 -j TRACE
COMMIT
# Completed on Thu Jun  7 16:52:00 2018

# Generated by iptables-save v1.4.14 on Thu Jun  7 16:52:00 2018
*nat
:PREROUTING ACCEPT [462:32832]
:INPUT ACCEPT [462:32832]
:OUTPUT ACCEPT [98:6069]
:POSTROUTING ACCEPT [98:6069]
-A PREROUTING -d 192.168.192.203/32 -p udp -m udp --dport 10073 -j DNAT --to-destination 10.221.0.73:80
-A PREROUTING -d 192.168.192.203/32 -p tcp -m tcp --dport 10073 -j DNAT --to-destination 10.221.0.73:80
-A POSTROUTING -s 10.221.0.73/32 -p udp -m udp --sport 80 -j SNAT --to-source 192.168.192.203
-A POSTROUTING -s 10.221.0.73/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.192.203
COMMIT
# Completed on Thu Jun  7 16:52:00 2018

# Generated by iptables-save v1.4.14 on Thu Jun  7 16:52:00 2018
*filter
:INPUT ACCEPT [1738:195868]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1333:210602]
:ufw-after-forward - [0:0]
:ufw-after-input - [0:0]
:ufw-after-logging-forward - [0:0]
:ufw-after-logging-input - [0:0]
:ufw-after-logging-output - [0:0]
:ufw-after-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-before-input - [0:0]
:ufw-before-logging-forward - [0:0]
:ufw-before-logging-input - [0:0]
:ufw-before-logging-output - [0:0]
:ufw-before-output - [0:0]
:ufw-reject-forward - [0:0]
:ufw-reject-input - [0:0]
:ufw-reject-output - [0:0]
:ufw-track-input - [0:0]
:ufw-track-output - [0:0]
-A INPUT -j ufw-before-logging-input
-A INPUT -j ufw-before-input
-A INPUT -j ufw-after-input
-A INPUT -j ufw-after-logging-input
-A INPUT -j ufw-reject-input
-A INPUT -j ufw-track-input
-A FORWARD -j ufw-before-logging-forward
-A FORWARD -j ufw-before-forward
-A FORWARD -j ufw-after-forward
-A FORWARD -j ufw-after-logging-forward
-A FORWARD -j ufw-reject-forward
-A FORWARD -d 10.221.0.73/32 -p udp -m state --state NEW,RELATED,ESTABLISHED -m udp --dport 80 -j ACCEPT
-A FORWARD -d 10.221.0.73/32 -p tcp -m state --state NEW,RELATED,ESTABLISHED -m tcp --dport 80 -j ACCEPT
-A OUTPUT -j ufw-before-logging-output
-A OUTPUT -j ufw-before-output
-A OUTPUT -j ufw-after-output
-A OUTPUT -j ufw-after-logging-output
-A OUTPUT -j ufw-reject-output
-A OUTPUT -j ufw-track-output
COMMIT
# Completed on Thu Jun  7 16:52:00 2018

この問題をどのように解決できますか?よろしくお願いします。

第二に、私が解決した方法は次のとおりです。

ルータとして使用するコンピュータとトラフィックを転送するコンピュータに tcpdump を設定しました。重要なのは、他のトラフィックが両方のシステムを通過するときに報告する関連パケットを選択し、十分に詳細な方法で報告するのに十分な広範な規則を確立することです。そして、作業を簡単にするために、ルータシステムをOpenVPNクライアントではなくOpenVPNホストでもあるシステムに変更しました。

これは、LAN IPアドレスが192.168.192.166でVPN IPアドレスが10.254.0.1のルータシステムで使用されるコマンドです。

tcpdump -n -vv -c 5000 "port 80 or port 10073 or host 10.254.0.1 or host 10.254.0.73 or (host 192.168.192.166 and port 80) or (host 192.168.192.166 and port 10073)" -i any

10.254.0.73 はポート 80 を使用してパケットを転送するシステムです。ルータのポート 10073 にパケットを送信します。

以下は、パケットを転送するマシンへのコマンドです。

tcpdump -vv -n -c 5000 "port 80 or port 10073 or host 192.168.192.166 or host 10.254.0.1" -i any

「-i any」は、「パブリック」ポートeth0と「プライベート」ポートtun0からトラフィックを取得します。

私に適したルーティングルールは次のとおりです。

root@B16:~# iptables-save
# Generated by iptables-save v1.3.8 on Wed Jun 13 14:52:56 2018
*mangle
:PREROUTING ACCEPT [73673:9416551]
:INPUT ACCEPT [71740:8067234]
:FORWARD ACCEPT [1933:1349317]
:OUTPUT ACCEPT [120157:14972014]
:POSTROUTING ACCEPT [122090:16321331]
COMMIT
# Completed on Wed Jun 13 14:52:56 2018
# Generated by iptables-save v1.3.8 on Wed Jun 13 14:52:56 2018
*nat
:PREROUTING ACCEPT [12313:867446]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [11426:951748]
-A PREROUTING -i eth0 -p udp -m udp --dport 10073 -j DNAT --to-destination 10.254.0.73:80
-A PREROUTING -i eth0 -p tcp -m tcp --dport 10073 -j DNAT --to-destination 10.254.0.73:80
-A POSTROUTING -j MASQUERADE
COMMIT
# Completed on Wed Jun 13 14:52:56 2018
# Generated by iptables-save v1.3.8 on Wed Jun 13 14:52:56 2018
*filter
:INPUT ACCEPT [71741:8067274]
:FORWARD ACCEPT [1250:1319002]
:OUTPUT ACCEPT [120162:14973202]
:INBOUND - [0:0]
:LOG_FILTER - [0:0]
:LSI - [0:0]
:LSO - [0:0]
:OUTBOUND - [0:0]
-A FORWARD -d 10.254.0.73 -p tcp -m tcp --dport 80 -j ACCEPT
-A FORWARD -d 10.254.0.73 -p udp -m udp --dport 80 -j ACCEPT
COMMIT
# Completed on Wed Jun 13 14:52:56 2018

ルールを正しく適用するのは難しいので、iptablesのTRACEは役に立たないと思います。 tcpdumpを使用すると、ルールと詳細が正確になりました。転送がいつ開始されたかがわかりましたが、パケットはルータに返されず、メッセージを転送しようとしたときにラップトップに返されました。ルーター。また、まったく予期しないチェックサムエラーが発生する可能性があります。

私は「これが私にはうまくいきました」と言う矛盾する記事をたくさん読んでいましたが、彼らは私にはうまくいきませんでした。 1つの問題は、iptablesのルールが明らかにOSによって異なることです。私はDebianを使用していますが、これによりルールが変更されます。理由は誰が知っていますか?私はiptablesルールを書く方法の完全な説明を見つけることができず、ほんの数例が見つかりました。

乾杯。

ベストアンサー1

おすすめ記事