问题描述
我正在尝试找出一种同时转换IP和端口的方法。
场景:
在其中运行两个进程的容器。
进程B应该拦截/代理进程A对7.0.0.0/8的调用。
进程A正在侦听端口99,并且也建立了到端口99的传出连接。
进程B需要能够计算由进程A启动的连接的目标IP。
这种用例通常可以用TPROXY或REDIRECT解决,但是不幸的是IP_TRANSPARENT和SO_ORIGINAL_DST不可用。
设置大致如下:
# docker run -it --rm --privileged Nginx:alpine sh
#> apk add iproute2 iptables
#> Nginx
在另一个窗口中,可以执行到容器中并运行以查看数据包:
tcpdump -qnn -i any
我的第一个想法是添加一个假的本地/ 8并将流量重定向到该本地。在Nginx在端口80上侦听的情况下,我将看到它是否可以与curl配合使用。
ip route add local 244.0.0.0/8 dev eth0
iptables -t nat -A OUTPUT -p tcp --dport 99 -j NETMAP --to 244.0.0.0/8
iptables -t nat -A OUTPUT -p tcp --dport 99 -j DNAT --to-destination :80
curl 7.1.2.3:99
如果我们可以同时匹配以上两个规则,则上面的方法应该起作用,但据我所知,只能匹配一个规则。
所以接下来我尝试的是无状态的nat而不是iptables NETMAP,但似乎无法使其正常工作:
ip route add local 244.0.0.0/8 dev eth0
tc qdisc add dev eth0 root handle 1: htb
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip dst 7.0.0.0/8 action nat ingress 7.0.0.0/8 244.0.0.0/8
curl 7.1.2.3:80
运行上面的卷曲,我可以在tcpdump中看到数据包的目标已从7.1.2.3更改为244.1.2.3,但从未返回任何数据包,所以我想知道这些数据包是否不会分发给Nginx侦听80端口由于某种原因?我可能需要一个return nat规则来匹配上面的规则,但是我认为至少应该没有它才能看到一些数据包返回。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)