如何使用 iptables 設定到來賓虛擬機器的連接埠轉發

如何使用 iptables 設定到來賓虛擬機器的連接埠轉發

我正在嘗試對 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

來賓只是一張 Ubuntu Live CD,指令sudo nc -l 500 -k在終端機中執行。我透過運行來測試我的設定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 掛鉤。

根據記錄,第一組線路不起作用。第二組線確實如此。

相關內容