我正在尝试对到 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 钩子。
需要说明的是,第一组线路不起作用。第二组线路起作用。