どのインターフェイスにも属さないIPからパケットをリダイレクトするようにブリッジをだます方法

どのインターフェイスにも属さないIPからパケットをリダイレクトするようにブリッジをだます方法

特定のIPとポートが一致するときに、仮想ブリッジを介してインターフェイス間のトラフィックをリダイレクトしたいと思います。

たとえば、仮想ブリッジを介して物理インターフェイスに移動する仮想インターフェイスを介してゲスト内部ポートに接続するときは、トラフィックを傍受して10.20.30.40インターネットにアクセスするのではなく、ホストのポートにリダイレクトしたいとします。簡単です。まず、ホストシステムでサーバーを開きます。2222tun127.0.0.13333

nc -vkl 127.0.0.1 3333

次に、iptablesホストにルールを適用します。

sudo iptables \
  -t nat -A OUTPUT -p tcp \
  -d 10.20.30.40 --dport 2222 \
  -j DNAT --to-destination 127.0.0.1:3333

次に、ホストで実行できるかどうかをテストします。

nc -vzw5 10.20.30.40 2222

いいですね。ホストではローカルで実行されているようですが、ゲストでは実行に問題があります。

docker run --rm -it alpine:3.9 nc -vzw5 10.20.30.40 2222

重要なのは、dockerトラフィックがホストからローカルにならないように仮想ブリッジを作成することです。私の研究では、ホストに適用できるいくつかの規則を見つけました。

sudo iptables -t nat -A PREROUTING -p tcp \
  -d 10.20.30.40 --dport 2222 -j DNAT --to-destination 127.0.0.1:3333
sudo iptables -t nat -A POSTROUTING -p tcp \
  -d 127.0.0.1 --dport 3333 -j SNAT --to-source 10.20.30.40:2222

しかし、うまくいきません...特定のルールが一致したときにブリッジを介してホストのインターフェイスにトラフィックをdocker0リダイレクトするにはどうすればよいですか?lo

任意の場所:

  • 宛先 IP はインターフェイスサブネットに属しません。
  • このソリューションには、DNSの使用やdockerホストのオン/オフ変更を含めることはできません/etc/hosts
  • これらのiptablesルールはホストにのみ適用する必要があります。
  • サーバーはローカルシステムに割り当てる必要があり、トラフィックはネットワークに漏れてはいけません。この場合、ポートのホストIPを介してゲストが直接アクセスしたり、3333物理インターフェイスを介して外部システムからサーバーにアクセスしたりすることはできません。

関連情報