本地主机上的无状态nat

问题描述

我正在尝试找出一种同时转换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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...