@
bingfengfeifei 是的,可以视作 FNAT(full nat)(疑似)
"""
入站先使用 DNAT 变成 127.0.0.1:12345->192.168.1.2:80
出站使用 SNAT 变成 192.168.1.1:12345->192.168.1.2:80
"""
这个入站是指其他机器发给本机的包吗?
如果是,实际上入站需要 SNAT ,将其他机器的 IP 改成 127.0.0.1 ;因为从本机的 client 看来,他是与本机(127.0.0.1)的进程通信,如果收到的包 src_ip 不是 127.0.0.1 就会发 RST 。这个我通过 epbf 做 NAT 时遇到过这个问题。
出站需要 DNAT ,将本地 server 从 127.0.0.1:80 改成 192.168.1.2:80
"""
iptables 拦截不太清楚能不能走到 PREROUTING 和 POSTROUTING 链
"""
lo 和 eth0 的出入流量均需要经过协议栈,理论上应该会经过,不过我没弄明白经过这两个链时可以做啥处理吗?
"""
可能要开个 route_localnet 的选项
"""
目前,我正在使用 tc-nat 尝试,目前我的思路是:
当前本地通信的数据包流转是这样子的:
client -> netfilter -> lo -> tc(egress) -> ... -> tc(ingress) -> netfilter -> server
我在 netfilter 的(OUTPUT)链中给流量打标记,然后在 ingress 处执行 DNAT ,试图通过 forward 链后发到 eth0 。
不过目前 ingress 处执行 DNAT 后,数据包并没有进入 eth0 ,而是被奇怪的丢掉了
route_localnet 这个参数大佬可以详细讲讲使用场景吗?