次のように、デフォルトのネームスペースとRoutableNSという別のネームスペースの間に仮想イーサネット(veth)ペアを設定しました。
-------------- --------------
- veth0 - -------------- veth1 -
- 10.5.1.1 - - 10.5.1.2 -
-------------- --------------
default NS RoutableNS
インターフェイスを介してRoutableNS名前空間の外部世界にpingを送信できますが、着信veth1
トラフィックを10.5.1.1(または10.5.1.2)にSNAT(またはMASQUERADE)すると、何もvethインターフェイスに到達できないことがわかりました。
私はtun
デバイスに対して同じことを試み、IPが外部の世界(デフォルトの名前空間から)にルーティングできない場合、偽装してデバイスを調整できないことを確認しました。
だから、2つの質問があります。
- SNAT(MASQUERADE)のこの動作はどこかに文書化されていますか?私は、新しいソースIPが現在の名前空間から外部世界にルーティング可能でなければならないということです。
- これを行うためのネットワークオプション(sysctls)はありますか?
ベストアンサー1
IPが外部世界にルーティングできないデバイスを偽装またはSNATすることは完全に可能です。ネットワークネームスペースにあるかどうかには違いはありません。
正確に何を試したかを知らせることを忘れていましたが、SNATとMASQUERADEはPOSTROUTINGテーブルでのみ機能し、DNATはPREROUTINGテーブルでのみ機能するという事実がよく文書化されていることを覚えておいてください。注文するiptable
。
すなわち、SNATは、パケットがインターフェイスを出る前の最後のステップとして実行され、DNATは、パケットが外部からインターフェイスに入る前の初期ステップとして実行される。
したがって、一般的な設定は、ルーター(ホストまたは名前空間)が一方のIPアドレスを他方のすべてのエントリにマッピングすることです。
+---------------+
| |
masq'ed IP --<--| eth0 eth1 |--<-- original IP
10.0.0.99 | | 10.0.0.1
+---------------+
Host or Namespace
そして、着信接続に対応するDNATが必要なので、
iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.1/32 -j SNAT --to 10.0.0.99
iptables -t nat -A PREROUTING -i eth0 -d 10.0.0.99/32 -j DNAT --to 10.0.0.1
偽装したいIPが何であるか正確には言っていませんが、メインネームスペースがそのようなルーターとして機能し、「RouteableNS」を10.5.1.2
外部の世界から保護したい場合は、メインネームスペースのIPを使用してこれを実行できます。 IFを通過します。