iptables: VPNサーバーを使用してLANから接続されたopenvpnクライアントにアクセスする

iptables: VPNサーバーを使用してLANから接続されたopenvpnクライアントにアクセスする

本質的にはルーティングの問題があり、ルーティングと iptables に十分精通していないため、ネットワークのニーズを効果的にトラブルシューティングして設定することができません。

何が機能しているか

私は OpenVPN ネットワークをセットアップして動作させており、クライアントはインターネット経由で LAN に接続できます。

私が望むこと

...クライアントが特定のサブネット上の VPN に接続するとき。

  • クライアントはVPNネットワークからアクセスできる必要があります

ルールが以下の 1 つ以上を実行できる場合はボーナス ポイントが付与されます。

  • クライアントはVPNへの接続を開始できないようにする必要があります
  • クライアントはDNSに表示されるはずです

トポロジー

私たちのネットワーク トポロジは次のようになります。

   ______        ____________________
 /        \     /                    \
| internet |---| client (10.8.8.0/24) |
 \________/     \____________________/
     |
   ______
 /        \
| gateway  |
 \________/
     |
-----LAN------ (10.10.10.0/24)
|    |   |   |
             L_____VPN Server `VPN1` 10.10.10.2 (fictional name/subnet)

現在の設定

ゲートウェイには次のルートが定義されています。

10.8.8.0    255.255.255.0   10.10.10.2  LAN & WLAN

ではVPN1、iptablesには次のルールがあります

# Flush the filter and nat tables
iptables -t filter -F
iptables -t nat -F

iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT

iptables -A INPUT -i eth0 -j ACCEPT -d 10.8.8.0/24
iptables -A FORWARD -i eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.10.10.0/16 -d 10.8.8.0/24 -o tun+ -j MASQUERADE

現在何が起こっているのか

コマンドmtr 10.8.8.1(VPN 上の接続されたクライアントの IP) を実行すると、現在のルートが VPN1 とゲートウェイの間を行き来していることがわかります。

答え1

もう一度、iptables のオンライン学習に熱中した後、私は解決策を見つけました。

しかし、まず、iptables に関して誤った仮定があります。ルールに対する私の最初のアプローチは、パケットが受信されると、INPUT チェーンと OUTPUT チェーンを通過するというものでした。しかし、そうではありません。ルールがパケットに一致すると、そのパケットはテーブルから出ます。指定されない限り (例: "-t nat")、フィルター テーブルが想定されるため、リストされているルールのほとんどはフィルター テーブルで実行されます。

チェーンについて

  • 入力: サーバー宛のパケットに対して実行
  • 出力: サーバーから発信されたパケットに対して実行
  • フォワード: その他すべて - ここでルールが一致し、「ジャンプ」(私は-j「job」がACCEPTの場合、パケットは適切にルーティングされます。

ルールの詳細

これは以下の規則の説明です現在の設定その上

iptables -t filter -F
iptables -t nat -F

これらのルールは、フィルターそしてナットテーブル。テーブルがさらに多くあり、iptables ルールをクリアする方法がより徹底していることに注意してください。

iptables -A INPUT -i tun+ -j ACCEPT

このルールは、以下の理由により何も行いません。

  • これは別のネットワークではなく、VPN1宛のトラフィックで実行されます。
  • 受信トラフィックにはポリシーが設定されていないため、デフォルトで許可されます。

次へ進みます...

iptables -A FORWARD -i tun+ -j ACCEPT

このルールは、10.8.8.0/24からのトラフィックをルーティングすることを可能にします。ナットこのルールに一致するパケットに対してテーブルが実行されます。

iptables -A INPUT -i eth0 -j ACCEPT -d 10.8.8.0/24

10.8.8.0/24 トラフィックは VPN1 サーバー宛ではないため、このルールは目的のルーティングにも影響しません。

iptables -A FORWARD -i eth0 -j ACCEPT

このルールにより、10.10.10.0/16 からのトラフィックをルーティングできるようになります。

iptables -t nat -A POSTROUTING -s 10.10.10.0/16 -d 10.8.8.0/24 -o tun+ -j MASQUERADE

このルールにより、10.10.10.0/16 から VPN 宛てのトラフィックが VPN1 から送信されたように見えるようになり、実質的に VPN1 がゲートウェイのように見えます。

どうしたの?

ルールは、あるネットワークから次のネットワークにトラフィックを転送する場合、そのままで「OK」のはずです。デフォルトの「DROP」ポリシーなど、実際の保護は実施されていませんが、それは質問の要点ではありません。

iptablesがVPN経由でトラフィックをルーティングできるように設定されている場合、トラフィックがVPN経由で送り返される原因は何でしょうか?eth0ゲートウェイに?VPN1 が 10.8.8.0/24 を認識していない場合。VPN サーバーがそのネットワークを認識していない場合、インターネット トラフィックとして扱われ、ゲートウェイに送り返されます。

修正方法

解決策は、VPN サーバーにネットワークについて伝えることでした (これは openvpn サーバーです)。これを行うには 2 つの方法があります。サーバーが 1 つのネットワークのみにサービスを提供している場合は、構成設定は簡単です。

server 10.8.8.0 255.255.255.0

私の場合、サーバー ルートを設定していたので、追加のネットワークについて知る必要がありました。構成は次のようになります。

server 10.5.5.0 255.255.255.0
route 10.8.8.0 255.255.255.0

これで完了です。VPN1 がネットワークへのルートを取得すると、FORWARD チェーンはトラフィックをルーティングできるようになります。

より良いiptablesの設定

Iptables をフラッシュした後、より良い構成は次のようになります。

# Forward established traffic so that (in the above case) VPN1 doesn't
# drop responses from the client, A.K.A. "the magic"
iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -t filter -A FORWARD     -s 10.10.10.0/16 -d 10.8.8.0/24  -j ACCEPT
iptables -t nat    -A POSTROUTING -s 10.10.10.0/16 -d 10.8.8.0/24  -j MASQUERADE

# Drop everything else that wants to be forwarded
iptables -P FORWARD DROP

10.8.8.0/24 からのトラフィックには明示的なルールがないことに注目してください。つまり、デフォルトでは、トラフィックは 10.10.10.0/16 ネットワークに到達しません (10.10.10.0/16 から送信されたトラフィックに応答するトラフィックを除く)。iptables がセットアップされたので、VPN 構成でクライアントに IP を割り当て、DNS に追加して完全なソリューションを実現できます。

関連情報