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 番目の行セットは機能します。