我有以下设置:
应用 A- 对某些 API 发出 HTTP 请求,运行于http://本地主机:8090。
应用 B- 拦截来自 A 的 HTTP 请求,A 是运行在http://本地主机:8080。
是否可以强制 HTTP 流量从一个应用程序传输到在同一主机上运行的另一个应用程序?
我一直在尝试类似的事情:
iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 8080
但似乎只有当 HTTP 请求的目标是一些外部 API 时它才有效,如果 API 资源服务器也部署在本地主机上,它就不起作用(我怀疑这是由于--dport 80)。我对 iptables 了解不多,但这样的事情真的可能吗?如果可以,我该如何实现?
答案1
iptables 规则可以工作,但是你必须激活路由在机器上,这才能在本地传送的数据包上工作。还要注意,在较新的机器上,“localhost”通常解析为 IPv6 环回 (::1),因此您需要相应的 ip6tables 规则。IPv6 上的初始连接失败可能会被屏蔽,并在测试客户端中自动回退到 IPv4 后再次困扰您(例如,如果您未在命令行上指定 -6,则 curl 会执行此操作)
如果数据包来自外部,则需要在PREROUTING链中设置相同的规则。
# Activate forwarding
# Note: These forward settings are not reboot persistent
# Note: Putting your machine in router mode resets a lot of IP stack parameters
sysctl -w net.ipv6.conf.all.forwarding=1
sysctl -w net.ipv4.ip_forward=1