将流量重新路由到备用出站 IP 地址

将流量重新路由到备用出站 IP 地址

我有一个在 Alpine 上运行的应用程序,它向特定的 IP 地址/端口发出请求,例如 127.1.1.1:10000。我无法更改该特定 IP 地址/端口。它尝试访问的服务位于另一个 IP 地址/端口,例如 216.58.193.64:80(Google 主页的地址)。

我正在寻找一种将流量出站请求从 127.1.1.1:10000 重定向到实际地址 216.58.193.64:80 的方法。此重定向是双向的 - 即应用程序发出请求并期望响应。

从图形上看,我有

 Alpine (with --cap-add=NET_ADMIN)
 IP assigned
 ╔════════════════════════════════════╗             ╔══════════════════╗
 ║                                    ║             ║                  ║
 ║  ┌──────────────────────────────┐  ║  -request-> ║ Remote           ║
 ║  │ Application                  │  ║             ║ service          ║
 ║  │ requests at 127.1.1.1:10000  |  ║             ║ at               ║
 ║  └──────────────────────────────┘  ║  <-reply-   ║ 216.58.193.64:80 ║
 ║                                    ║             ║                  ║
 ╚════════════════════════════════════╝             ╚══════════════════╝

我尝试使用 iptables:

iptables -t nat -I OUTPUT --destination 127.1.1.1 -j DNAT --to-destination 216.58.193.64

iptables,查询时仅包含 OUTPUT

Chain OUTPUT (policy ACCEPT 7 packets, 345 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1       10   586 DNAT       all  --  *      *       0.0.0.0/0            127.1.1.1            to:216.58.193.64

然后我尝试作为基线

curl 216.58.193.64

其回复为

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>

然而,当我尝试

curl -v 127.1.1.1

然后curl不会返回并且没有输出。报告后停止:

curl -v 127.1.1.1
*   Trying 127.1.1.1:80...
* TCP_NODELAY set

我也尝试过 POSTROUTING

iptables -t nat -A POSTROUTING --destination 127.1.1.1 -j SNAT --to-source 216.58.193.164

但我得到同样的结果。

答案1

@ibrahim 部分正确,但显然不完整。

https://serverfault.com/questions/247623/iptables-redirect-local-connections-to-remote-system-port,以下作品

iptables -t nat -A OUTPUT -m addrtype --src-type LOCAL --dst-type LOCAL -p tcp --dport 10000 -j DNAT --to-destination 216.58.193.164
iptables -t nat -A POSTROUTING -m addrtype --src-type LOCAL --dst-type UNICAST -j MASQUERADE

sysctl -w net.ipv4.conf.all.route_localnet=1

然后我可以运行:

curl 216.58.193.164:10000

并得到正确的结果。

还需要注意的是,在容器中运行时,需要使用以下命令启动容器--privileged

答案2

默认情况下,对于 lo 地址禁用 Nat。您需要通过以下方式启用它

sudo sysctl net.ipv4.conf.all.route_localnet=1

还将其添加到 /etc/sysctl.conf 以使其永久化。

相关内容