本質的にはルーティングの問題があり、ルーティングと 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 に追加して完全なソリューションを実現できます。