我有一个 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"