我正在嘗試對 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 掛鉤。
根據記錄,第一組線路不起作用。第二組線確實如此。