在宿主节点上:找到envoy在宿主上的PID。

~]# ps -ef | grep envoy
1337      8558  8526  0 15:38 ?        00:00:26 /usr/local/bin/envoy -c etc/istio/proxy/envoy-rev0.json

然后查看规则:

~]# nsenter -t 8558 -n iptables -t nat -S

# 四个内置链设置成accept
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT

# 添加新的自定义链
-N ISTIO_INBOUND # 两个入站规则
-N ISTIO_IN_REDIRECT
-N ISTIO_OUTPUT # 两个出站规则
-N ISTIO_REDIRECT


# 入向流量肯定会先到达 PREROUTING ,这条规则将所有tcp的流量跳转给 ISTIO_INBOUND链,也就是所有的禄流量都由链来处理。
-A PREROUTING -p tcp -j ISTIO_INBOUND

# 出向流量会先到达OUTPUT,这条规则将所有tcp的出向流量跳转到ISTIO_OUTPUT链。
-A OUTPUT -p tcp -j ISTIO_OUTPUT


# 入向流量处理
-A ISTIO_INBOUND -p tcp -m tcp --dport 15008 -j RETURN # 15008端口的流量是envoy在使用,不需要代理,直接return回到主链上。
-A ISTIO_INBOUND -p tcp -m tcp --dport 22 -j RETURN # 22端口也不会进行代理
-A ISTIO_INBOUND -p tcp -m tcp --dport 15090 -j RETURN
-A ISTIO_INBOUND -p tcp -m tcp --dport 15021 -j RETURN
-A ISTIO_INBOUND -p tcp -m tcp --dport 15020 -j RETURN # 15090 15021 15020 这三个端口是envoy的端口,不需要进行代理
-A ISTIO_INBOUND -p tcp -j ISTIO_IN_REDIRECT # 其余流量重定向到 ISTIO_IN_REDIRECT链中。

# 将tcp的流量全部重定向到envoy的15006端口(REDIRECT是iptables内置的端口重定向target),15006是入向流量端口。
-A ISTIO_IN_REDIRECT -p tcp -j REDIRECT --to-ports 15006


# 出向流量处理
# 下面的规则就是envoy自己发出的流量那些是需要代理那些是不需要代理直接发的进行处理。
-A ISTIO_OUTPUT -s 127.0.0.6/32 -o lo -j RETURN # 程序自己访问自己的流量不进行代理,直接return
-A ISTIO_OUTPUT ! -d 127.0.0.1/32 -o lo -m owner --uid-owner 1337 -j ISTIO_IN_REDIRECT # 将envoy访问本地应用程序的流量交给ISTIO_IN_REDIRECT链(envoy是以1337这个用户id来运行的),也就是交给入向流量入口15006这个端口。
-A ISTIO_OUTPUT -o lo -m owner ! --uid-owner 1337 -j RETURN # 本地的程序1访问本地的程序2直接return不进行代理,也就是上一条的第二种情况,不是envoy访问本地程序的流量处理。
-A ISTIO_OUTPUT -m owner --uid-owner 1337 -j RETURN # envoy发出的流量不进行代理(类似第二条但是目标地址不是本地)
-A ISTIO_OUTPUT ! -d 127.0.0.1/32 -o lo -m owner --gid-owner 1337 -j ISTIO_IN_REDIRECT # envoy组内的其他程序的流量要进行代理,走15006端口。
-A ISTIO_OUTPUT -o lo -m owner ! --gid-owner 1337 -j RETURN # 访问本地但不是envoy的流量不进行代理。
-A ISTIO_OUTPUT -m owner --gid-owner 1337 -j RETURN # 是envoy发出但不是本地lo流出的流量不进行代理。
-A ISTIO_OUTPUT -d 127.0.0.1/32 -j RETURN # 目标地址是127.0.0.1的流量不进行代理。

-A ISTIO_OUTPUT -j ISTIO_REDIRECT # 剩下的流量全部给 ISTIO_REDIRECT链。
-A ISTIO_REDIRECT -p tcp -j REDIRECT --to-ports 15001 # 也就是剩下的出流量全部交给15001端口,15001是出向流量端口。

入向流量:

PREROUTING -> ISTIO_INBOUND

出向流量:

OUTPUT -> ISTIO_OUTPUT

Envoy使用的端口:

15000:管理端口

15001:流量出口

15004:debug端口

15006:入口端口

16008:HBONE mtls tunnel port

15009:HBONE portforsecure networks

15020:merged prometheus telemetry from istio agent, envoy and application

15021:健康检查

15053:dns端口

15090:prometheus指标端口