使用 Iptables 将请求转发到本地主机

使用 Iptables 将请求转发到本地主机

我有一个 Ubuntu VM(在 Virtualbox 中)和一个 Win11 本地机器。

我想向虚拟机发送 HTTP 请求(例如 127.0.0.1:{PORT}/api/1/)。VM 正在运行一个应用程序,该应用程序仅接受对本地主机的请求,因此我需要将请求从本地发送到客户机,并将 VM 中的请求重定向到其本地主机。我还需要使用 Iptables 来实现这一点。

我尝试了很多 iptables 命令,但都没有成功。我收到“请求超时”或“connrefused”错误。同时,我能够在两台机器上运行简单的 python 服务器,并且能够从本地和虚拟机对它们进行 curl 操作。

据我所知,我需要在虚拟机内配置 Iptables 以接受对其 IP 和某些端口的请求,但将它们转发到本地主机和所需端口。但无论如何我都很难实现这一点。

我尝试过这个命令的不同版本,但是我相信这更接近它应该的样子(首先我启用端口转发):

sysctl net.ipv4.ip_forward=1 

iptables -t nat -A PREROUTING -p tcp 80 -j DNAT --to-destination 
127.0.0.1:4040 

据我所知,如果我现在像这样从我的主机发送请求,那么虚拟机应该会收到此请求并将其重新路由到其本地主机端口 4040,并且我应该收到来自 API 的响应:curl 172.20.10.4:80/api/v1/... 但什么也没发生,我收到“请求超时”。如果我 curl “172.20.10.4:80”,什么也没发生

先感谢您!

答案1

PREROUTING将负责处理进来的数据包。

您还必须处理发出的数据包POSTROUTING

这是根据我的脚本改编的可能有效的东西iptables——相应地替换变量。($I只是/sbin/iptables

  "$I" -A PREROUTING -t nat \
   --protocol "$PROTOCOL" \
   --destination-port "$OUTSIDE_PORT" \
    --jump DNAT --to-destination "127.0.0.1:$INSIDE_PORT"

  "$I" -A POSTROUTING -t nat \
   --protocol "$PROTOCOL" \
   --source "$INSIDE_IP" --source-port "$INSIDE_PORT" \
    --jump SNAT --to-source "$VM_EXTERNAL_IP"

相关内容