我正在尝试对 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
与上面完全相同。看来是楼主出了问题。
问题在于如何测试。
在主机上运行
nmap $public_ip -p $port
与在网络上的另一台计算机上运行不同。最重要的是,SYN 数据包不会通过 PREROUTING 挂钩,该挂钩将数据包定向到客户机。它只会按顺序通过 OUTPUT 和 POSTROUTING 挂钩。根据记录,第一组线路不起作用。第二组线确实如此。