我正在尝试在我的主机上设置透明代理网络。
真正的客户端和代理目标是容器,但在这个实验中,我使用 netns(网络命名空间)分隔的环境。
为了透明地将客户端流量重定向到代理,我使用策略路由。
Client (C) Proxy (P)
10.10.1.1/24 10.10.2.1/24
veth0 veth0
| |
veth pair veth pair
| |
-----------(HOST)--------------
client-veth0 proxy-veth0
10.10.1.2/24 10.10.2.2/24
| | 172.16.202.30
+-----------------+-------------- enp4s0 ---- INTERNET
# Policy Routing on Host
# [Client->Proxy]
# ip rule: from 10.10.1.0/24 iif client-veth0 lookup 100
# ip route: (100) default via 10.10.2.1 dev proxy-veth0
# [Proxy->Internet]
# ip route: (master) default via 172.16.202.1 dev enp4s0 proto static metric 100
# iptables: -t nat -A POSTROUTING -s 10.10.1.1/32 -o enp4s0 -j MASQUERADE
# [Internet->Proxy]
# ip rule: from all to 10.10.1.0/24 iif enp4s0 lookup 100
# ip route: (100) default via 10.10.2.1 dev proxy-veth0
# [Proxy->Client]
# ip rule: from all to 10.10.1.0/24 iif proxy-veth0 lookup 101
# ip route: (101) default via 10.10.1.1 dev client-veth0
问题是,当我从客户端 ping 8.8.8.8 时,在客户端 netns 中,源 IP 伪装不会发生。
iptables 伪装规则不匹配,默认为 ACCEPT 。我希望 enp4s0 上的 tcpdump 显示172.16.202.30 --> 8.8.8.8
,但它显示10.10.1.1 --> 8.8.8.8
,没有源 IP 伪装。
我在互联网线路上记录了 pcap 以澄清 SNAT 不会发生。client_to_goolge
从 enp4s0 之外的单独机器记录:
$ tcpdump -r client_to_google -n
reading from file client_to_google, link-type EN10MB (Ethernet)
23:35:40.852257 IP 10.10.1.1 > 8.8.8.8: ICMP echo request, id 14867, seq 1, length 64
23:35:41.865269 IP 10.10.1.1 > 8.8.8.8: ICMP echo request, id 14867, seq 2, length 64
当我检查 iptables mangle 表时,数据包按给定策略流动:
PREROUTING: client-veth0, 10.10.1.1 --> 8.8.8.8
POSTROUTING: proxy-veth0, 10.10.1.1 --> 8.8.8.8
PREROUTING: proxy-veth0, 10.10.1.1 --> 8.8.8.8
POSTROUTING: enp4s0, 10.10.1.1 --> 8.8.8.8
proxy-veth0
但是,当我在输出界面上更改伪装规则时,像这样iptables: -t nat -A POSTROUTING -s 10.10.10.1/32 -o proxy-veth0 -j MASQUERADE
,伪装发生了。即
10.10.2.2 --> 8.8.8.8
数据包被捕获。
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
...
11 0 0 MASQUERADE all -- * enp4s0 10.10.1.1 0.0.0.0/0
12 1 84 MASQUERADE all -- * proxy-veth0 10.10.1.1 0.0.0.0/0
上表显示规则#11enp4s0
输出条件未触发。在使用规则#11 进行多次测试后插入规则#12。规则 #12 表明proxy-veth0
输出条件确实触发了。enp4s0
主网卡和proxy-veth0
使用 iptables 的虚拟接口之间有什么区别吗?
任何意见将不胜感激,谢谢。