如何使用 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 钩子。

需要说明的是,第一组线路不起作用。第二组线路起作用。

相关内容