如何使用 iptables 将 HTTP 请求路由到专用网络

How to use iptables to route an HTTP request to a private network

首先我想说明一下,我是计算机网络的十足菜鸟,所以如果我使用不正确的术语或胡说八道,我提前道歉。话虽如此,我会尽可能清楚地解释我的问题。假设我有两台Linux台服务器(ubuntu),服务器A和服务器B连接如图:

两台服务器都有 3 个网络接口,每个接口都有图中列出的 IP 地址,两台服务器都有两个彼此通用的网络:

172.16.0.0/24
10.20.0.0/24

服务器 B 在以下网络中有一个端点的应用程序

192.168.0.1/24 

哪个服务器B可以访问但是服务器A不能访问。该应用程序具有以下端点

http://192.168.0.1:35357

有没有一种方法可以从服务器 A 到达应用程序端点,以便我可以使用 POST 对服务器 A 的端点进行 curl,然后到达服务器 B 中的应用程序?也许通过 iptables 或类似的东西? 我还希望能够从服务器 A 中的应用程序获得响应。

终于搞定了,最后还是很简单的,两步就搞定了。如果它对某人有帮助,我会更新答案。我所做的是以下内容:

第 1 步:在服务器 A 中,我通过 vboxnet1 接口添加了到 192.168.0.0/24 网络的路由:

ip route add 192.168.0.0/24 dev vboxnet1

在 运行 执行上面的命令后,您应该能够使用 ip route show 命令看到您的新路线,该命令应该显示您的路线:

$ sudo ip route show
...
192.168.0.0/24 dev vboxnet1  scope link
...

您还可以 运行 ip route get <IP> 命令加上您尝试访问的 IP 地址,以查看系统发送数据包以到达该 IP 地址的路由。就我而言,我想到达 192.168.0.1:

$ ip route get 192.168.0.1
192.168.0.1 dev vboxnet1  src 172.16.0.1

第 2 步:因为我要访问的实际上是服务器 B 中的一项服务,而不是另一台机器,所以我还需要更改数据包的目的地,以便使用它发送到服务器 B 192.168.0.0/24 网络中的 IP 地址。该网络中服务器 B 的 IP 地址为 192.168.0.2:

$ iptables -t nat -A OUTPUT -p tcp -d 192.168.0.1 -j DNAT --to-destination 192.168.0.2

就是这样!这样做之后,我可以通过 cURL 运行 我的 HTTP 请求,它成功到达我的端点。

curl -v -k -X 'POST' http://192.168.0.1:35357/my_REST_resource -H 'Content-Type:application/json' -H 'Accept:application/json'