2021-06-17

整体流程
1.对于outflow和inflow先打上mark标签
2.两者的标签分别在OUTPUT和PREROUTING 的规则加上打标签的逻辑
3.在2中继续添加tproxy转发的规则,即加上要转发哦的端口(因为肯定是本地的ip)
4.添加策略路由,有对应remark的都走lo路由

在out那边打上mark

---只要不是root进程sidecar发出的流量则都被拦截到sidecar
iptables -t mangle -A OUTPUT -p tcp -m owner ! --uid-owner 0 -j LOG --log-prefix "outFlow" --log-tcp-sequence --log-uid

iptables -t mangle -A OUTPUT -p tcp -m owner ! --uid-owner 0 -j DIVERT

iptables -t mangle -A DIVERT -j MARK --set-mark 1

//这边是直接给sk_buffer 里面的socket替换为要连接的listener socket 或者已经establishede的socket
iptables -t mangle -A DIVERT -j TPROXY --tproxy-mark 1 --on-port 9300

iptables -t mangle -A DIVERT -j ACCEPT

在input那边打上mark

1.如果是已经建立了tproxy的socket则直接打上标签然后开始路由

iptables -t mangle -N DIVERT #在nat表上新建名为DIVERT自定义链

已建立的socket且被tproxy标记过的数据包执行DIVERT--即是socket 且有transparent属性的直接进入divert

这个代表这个tcp实际上已经通过tproxy的设置变为了真正的tproxy的socket了所以 不需要在进入到tproxy的转发里面了

iptables -t mangle -A PREROUTING -p tcp -m socket --transparent -j DIVERT
iptables -t mangle -A DIVERT -j MARK --set-xmark 0x10000000/0xf0000000 #进入DIVERT设置标记
iptables -t mangle -A DIVERT -j ACCEPT

2.只要是tcp的都走MYMANGLE,其内部直接判断目标端口是80的就走MY_TCP
iptables -t mangle -N MYMANGLE
iptables -t mangle -A PREROUTING -p tcp -j MYMANGLE #MYMANGLE链加入到PREROUTING

对目标端口是80的的tcp协议直接走MY_TCP

iptables -t mangle -A MYMANGLE -p tcp -m multiport --dports 80 -j MY_TCP #80端口的包执行MY_TCP

3.MY_TCP内部直接设置转向的本机端口,并且带上标签
iptables -t mangle -N MY_TCP
iptables -t mangle -p tcp -A MY_TCP -j TPROXY --on-port 8081 --tproxy-mark 0x10000000/0xf0000000

MY_TCP执行TPROXY转发为8081端口并进行标记

iptables -t mangle -A MY_TCP -j ACCEPT

策略路由

方法1
ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100
方法2
ip rule add fwmark 0x10000000/0xf0000000 table 200 pref 200 #对标记过的数据包执行序号为200的规则
ip route add local default dev lo table 200 #200规则:数据包发送到本地回环

你可能感兴趣的:(2021-06-17)