最終的mesh

OUTPUT--只攔截?zé)omark進(jìn)程發(fā)出的流量,sidecar通過socket添加mark,java目前還不支持 需要寫jni

1.對(duì)于非mark進(jìn)程發(fā)出的output且dst目標(biāo)不是local的添加一個(gè)remark1(觸發(fā)reroute check,同時(shí)讓流量通過lo走到prerouting鏈)

//1.添加一個(gè)out的自定義鏈,符合策略路由的都進(jìn)這個(gè)子鏈
iptables -t mangle -N DIVERTOUT
//2.不攔截22的端口
iptables -t mangle -A OUTPUT -p tcp --sport 22 -j ACCEPT
//gitee的不攔截
iptables -t mangle -I OUTPUT -p tcp -d 212.64.62.183 -j ACCEPT
iptables -t mangle -I OUTPUT -p tcp -d 10.0.2.2 -j ACCEPT
//2.不是envoy(root用戶啟動(dòng))進(jìn)程發(fā)出來的則直接走策略路由--檢測(cè)xujie是否也在root組


cca744a6-0e5a-49f4-b4fe-2b01de926ac8.png

iptables -t mangle -A OUTPUT -p tcp -m owner --gid-owner xujie -j LOG --log-prefix "outboud:xujie mark" --log-tcp-sequence --log-uid
iptables -t mangle -A OUTPUT -p tcp -m owner --gid-owner xujie -j DIVERTOUT

iptables -t mangle -A OUTPUT -p tcp -m owner --gid-owner root -j LOG --log-prefix "outboud:root accept" --log-tcp-sequence --log-uid
iptables -t mangle -A OUTPUT -p tcp -m owner --gid-owner root -j ACCEPT
iptables -t mangle -A OUTPUT -p tcp -j LOG --log-prefix "outboud:not xujie not root accept" --log-tcp-sequence --log-uid
iptables -t mangle -A DIVERTOUT -j MARK --set-mark 1
iptables -t mangle -A DIVERTOUT -j LOG --log-prefix "outbound:not root be marked: " --log-tcp-sequence --log-uid
iptables -t mangle -A DIVERTOUT -j ACCEPT

PREROUTING的流量(來自外部的流量)

初始的操作

iptables -t mangle -N DIVERTIN

//gitee的不攔截
iptables -t mangle -I PREROUTING -p tcp -s 212.64.62.183 -j ACCEPT
//22的端口不攔截
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j ACCEPT

2.不攔截socket已經(jīng)存在的包,只打標(biāo)記

iptables -t mangle -A PREROUTING -p tcp -m socket -j LOG --log-prefix "inbound already socke: " --log-tcp-sequence --log-uid
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERTIN
iptables -t mangle -A DIVERTIN -j MARK --set-mark 1
iptables -t mangle -A DIVERTIN -j ACCEPT

3.下面代表的都是沒有已經(jīng)建立連接的,則尋找到需要攔截的走tproxy

//不攔截本機(jī)訪問本機(jī)的,根據(jù)in 來自loop且不包含remark可以判斷--默認(rèn) 包就在本地的mark不會(huì)被剔除
//從lo進(jìn)來且有mark的1的代表是從output被攔截過來的,則進(jìn)入tproxy
iptables -t mangle -A PREROUTING -i lo -p tcp -m mark --mark 1 -j LOG --log-prefix "inbound mark tproxy" --log-tcp-sequence --log-uid

iptables -t mangle -A PREROUTING -i lo -p tcp -m mark --mark 1 -j TPROXY --tproxy-mark 1 --on-port 9300

// 其他的從loopback進(jìn)來的都不攔截正常走
iptables -t mangle -A PREROUTING -i lo -p tcp -j ACCEPT

//不攔截目的端口是proxy的,相當(dāng)于外面直接請(qǐng)求proxy--對(duì)于不是來自loopback的直接走tproxy
iptables -t mangle -A PREROUTING -p tcp ! --dport 9300 -j LOG --log-prefix "inbound not 9300 tproxy" --log-tcp-sequence --log-uid
iptables -t mangle -A PREROUTING -p tcp ! --dport 9300 -j TPROXY --tproxy-mark 1 --on-port 9300

策略路由

ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100

ipforward要開啟


查看iptables的日志

問題

1.前幾次請(qǐng)求時(shí)候output會(huì)攔截root(sidecar)的請(qǐng)求,導(dǎo)致rst
2.還有一只有10.0.2.2請(qǐng)求
3.一直有postman的ack發(fā)送給mesh---代表啥意思?--難道是一直收到了已經(jīng)收到的包?--是因?yàn)閙ac一直發(fā)送keepalive
為啥mac一直不停的發(fā)tcp的keepalive虛擬機(jī)


istio之前說tproxy 不適應(yīng)output只能使用hook connect
是因?yàn)閛utput在路由之后,所以需要在output鏈里面設(shè)置更改包的屬性,比如remark會(huì)觸發(fā)reroute check 重新路由,這個(gè)時(shí)候包的remark可以讓路由走lo,進(jìn)而從新走prerouting


tproxy的原理是在設(shè)置iptables tproxy的時(shí)候還未走路由,就把sk_buffer里面的socket替換為監(jiān)聽的透明代理的socket,進(jìn)而后面路由后,在傳輸層判斷socket是ok的 然后就接受了

iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
對(duì)于外部請(qǐng)求進(jìn)來的檢查這個(gè)skb_buffer里面的socket是否存在于本地,如果存在代表已經(jīng)建立過連接了
這就意味著sidecar發(fā)往外部的包里面的sock 本地肯定沒有,因?yàn)閟kb_buffer里面的socket 是接受socket,但是代理對(duì)象本身,或者外部請(qǐng)求進(jìn)入的socket都在sidecar里面
問題就是skb_buffer里面的sock難道是在路由前就已經(jīng)可以獲取到了?


在iptables 中 這個(gè)規(guī)則怎么理解
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
我的問題:
1.上面的規(guī)則可以這么理解嗎:檢測(cè)到skb_buffer里面的socket存在與本地則直接轉(zhuǎn)發(fā)到DIVERT?
2.如果1是對(duì)的,那么skb_buffer里面的sockt是什么時(shí)候設(shè)置的?難道是觸發(fā)這條規(guī)則的時(shí)候現(xiàn)場(chǎng)根據(jù)sip,sport,dip,dport搜索的?
3.有兩種情況sk天生就存在這種是從output--》lo-->prerouting,還有一種就是在preroute的時(shí)候根據(jù)五元組去尋找是否存在

outbound:not root be marked: IN= OUT=enp0s3 SRC=10.0.2.15 DST=36.152.44.95 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=19958 DF PROTO=TCP SPT=56682 DPT=80 SEQ=1544995998 ACK=0 WINDOW=64240 RES=0x00 SYN URGP=0 UID=1000 GID=1000 MARK=0x1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容