Iptables を使用してゲスト VM へのポート転送を設定する方法

Iptables を使用してゲスト VM へのポート転送を設定する方法

libvirt ゲスト サーバーへのポート転送の概念実証を行おうとしています。

一般化のために使用する変数は次のとおりです。

port=500                    # Arbitrary port, for proof of concept
public_if=wlp0s20f3         # My public interface, connected to the internet.
private_if=virbr0           # My private interface, through which the guest OS communicates
public_ip=192.168.0.11      # public interface's IP
private_ip=192.168.122.1    # private interface's IP
guest_ip=192.168.122.175    # Guest's IP

ゲストは、sudo nc -l 500 -kターミナルでコマンドが実行される Ubuntu ライブ CD です。 を実行してセットアップをテストしますnmap $public_ip -p $port。 を実行するとnmap $guest_ip -p $port、ポートが「開いている」と表示されます。

もちろん、これは比較的単純で、十分に文書化されたタスクのように思えますが、私が試したチュートリアルはどれも機能しないようです。

まず、すべてのケースで以下を実行します。echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

次に、以下のコマンドを試しました。このチュートリアル:

sudo iptables -A FORWARD -i $public_if -o $private_if -p tcp --syn --dport $port -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -i $public_if -o $private_if -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A FORWARD -i $private_if -o $public_if -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -P FORWARD DROP
sudo iptables -t nat -A PREROUTING -i $public_if -p tcp --dport $port -j DNAT --to-destination $guest_ip
sudo iptables -t nat -A POSTROUTING -o $private_if -p tcp --dport $port -d $guest_ip -j SNAT --to-source $private_ip

これはうまくいきません。その後sudo iptables -F、次のコマンドも試しました。この答え:

sudo iptables -t nat -I PREROUTING -p tcp -d $public_ip --dport $port -j DNAT --to-destination $guest_ip:$port
sudo iptables -I FORWARD -m state -d $private_ip/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT

そして、それも機能しませんでした。ポートは閉じられたままです$public_ip

詳しいコンテキストについては、ゲストを起動した後、ゲスト上でモック サーバーを起動した後に、これらのルールを実行しています。

何が間違っているのでしょうか? これをデバッグする方法について何かアドバイスはありますか?

アップデート:

ホストとゲストの両方でパケットキャプチャを実行してみました。

ホスト側:

sudo tcpdump -i $private_if

では全く出力されませんnmap $public_ip -p $portが、 の場合には出力がありますnmap $guest_ip -p $port

ゲストについて:

sudo tcpdump

上記とまったく同じです。ホストに問題があるようです。

答え1

問題はそれがどのようにテストされるかです。

ホストで実行することはnmap $public_ip -p $port、ネットワーク上の別のマシンで実行することとは異なります。ここで最も重要なのは、SYN パケットが、パケットをゲストに向ける PREROUTING フックを通過しないことです。パケットは、OUTPUT フックと POSTROUTING フックをこの順序でのみ通過します。

ちなみに、最初の行セットは機能しません。2 番目の行セットは機能します。

関連情報