我有一个在 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 以使其永久化。