特定のIPとポートが一致するときに、仮想ブリッジを介してインターフェイス間のトラフィックをリダイレクトしたいと思います。
たとえば、仮想ブリッジを介して物理インターフェイスに移動する仮想インターフェイスを介してゲスト内部ポートに接続するときは、トラフィックを傍受して10.20.30.40
インターネットにアクセスするのではなく、ホストのポートにリダイレクトしたいとします。簡単です。まず、ホストシステムでサーバーを開きます。2222
tun
127.0.0.1
3333
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
物理インターフェイスを介して外部システムからサーバーにアクセスしたりすることはできません。