traffic.sidecar.istio.io/excludeOutboundIPRanges の挙動について
概要
istio-proxy では特定の IP レンジへの通信に対して istio-proxy を経由しないためのオプションである traffic.sidecar.istio.io/excludeOutboundIPRanges
を設定することが出来ます。
このオプション設定時になぜ該当の IP レンジへの通信が istio-proxy を経由しないようになるかを確認します。
環境
istio-proxy
docker.io/istio/proxyv2:1.15.0
マニフェスト
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo
namespace: demo
spec:
selector:
matchLabels:
app: demo
replicas: 1
template:
metadata:
annotations:
sidecar.istio.io/enableCoreDump: "true" # iptables を取得するためのおまじない
traffic.sidecar.istio.io/excludeOutboundIPRanges: 10.245.0.0/16 # ここで該当の IP レンジを exclude する
labels:
app: demo
spec:
containers:
- name: demo
image: curlimages/curl
command: ["sleep", "9999999"]
Istio の挙動
traffic.sidecar.istio.io/excludeOutboundIPRanges
が設定されている場合 initContainer の引数は以下のようになります。
-x 10.245.0.0/16
が追加されています。
initContainers:
- args:
- istio-iptables
- -p
- "15001"
- -z
- "15006"
- -u
- "1337"
- -m
- REDIRECT
- -i
- '*'
- -x
- 10.245.0.0/16
- -b
- '*'
- -d
- 15090,15021,15020
- --log_output_level=default:info
この引数は実際には以下のような NAT ルールへと変換されています。
-A ISTIO_OUTPUT -d 10.245.0.0/16 -j RETURN
において ISTIO_OUTPUT
Chain に設定が追加されています。
-N ISTIO_INBOUND
-N ISTIO_REDIRECT
-N ISTIO_IN_REDIRECT
-N ISTIO_OUTPUT
-A ISTIO_INBOUND -p tcp --dport 15008 -j RETURN
-A ISTIO_REDIRECT -p tcp -j REDIRECT --to-ports 15001
-A ISTIO_IN_REDIRECT -p tcp -j REDIRECT --to-ports 15006
-A PREROUTING -p tcp -j ISTIO_INBOUND
-A ISTIO_INBOUND -p tcp --dport 15090 -j RETURN
-A ISTIO_INBOUND -p tcp --dport 15021 -j RETURN
-A ISTIO_INBOUND -p tcp --dport 15020 -j RETURN
-A ISTIO_INBOUND -p tcp -j ISTIO_IN_REDIRECT
-A OUTPUT -p tcp -j ISTIO_OUTPUT
-A ISTIO_OUTPUT -o lo -s 127.0.0.6/32 -j RETURN
-A ISTIO_OUTPUT -o lo ! -d 127.0.0.1/32 -m owner --uid-owner 1337 -j ISTIO_IN_REDIRECT
-A ISTIO_OUTPUT -o lo -m owner ! --uid-owner 1337 -j RETURN
-A ISTIO_OUTPUT -m owner --uid-owner 1337 -j RETURN
-A ISTIO_OUTPUT -o lo ! -d 127.0.0.1/32 -m owner --gid-owner 1337 -j ISTIO_IN_REDIRECT
-A ISTIO_OUTPUT -o lo -m owner ! --gid-owner 1337 -j RETURN
-A ISTIO_OUTPUT -m owner --gid-owner 1337 -j RETURN
-A ISTIO_OUTPUT -d 127.0.0.1/32 -j RETURN
-A ISTIO_OUTPUT -d 10.245.0.0/16 -j RETURN
-A ISTIO_OUTPUT -j ISTIO_REDIRECT
COMMIT
動作確認
上記マニフェストを適用したのち、 istio-proxy にて iptables を確認します。
ISTIO_OUTPUT
に RETURN all -- anywhere 10.245.0.0/16
が追加されていることが確認出来ます。
istio-proxy@demo-7856c68ff6-l2fqg:/$ sudo iptables -L -t nat -v
Chain PREROUTING (policy ACCEPT 603 packets, 36180 bytes)
pkts bytes target prot opt in out source destination
603 36180 ISTIO_INBOUND tcp -- any any anywhere anywhere
Chain INPUT (policy ACCEPT 603 packets, 36180 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 73 packets, 6300 bytes)
pkts bytes target prot opt in out source destination
8 480 ISTIO_OUTPUT tcp -- any any anywhere anywhere
Chain POSTROUTING (policy ACCEPT 73 packets, 6300 bytes)
pkts bytes target prot opt in out source destination
Chain ISTIO_INBOUND (1 references)
pkts bytes target prot opt in out source destination
0 0 RETURN tcp -- any any anywhere anywhere tcp dpt:15008
0 0 RETURN tcp -- any any anywhere anywhere tcp dpt:15090
603 36180 RETURN tcp -- any any anywhere anywhere tcp dpt:15021
0 0 RETURN tcp -- any any anywhere anywhere tcp dpt:15020
0 0 ISTIO_IN_REDIRECT tcp -- any any anywhere anywhere
Chain ISTIO_IN_REDIRECT (3 references)
pkts bytes target prot opt in out source destination
0 0 REDIRECT tcp -- any any anywhere anywhere redir ports 15006
Chain ISTIO_OUTPUT (1 references)
pkts bytes target prot opt in out source destination
0 0 RETURN all -- any lo 127.0.0.6 anywhere
0 0 ISTIO_IN_REDIRECT all -- any lo anywhere !localhost owner UID match istio-proxy
0 0 RETURN all -- any lo anywhere anywhere ! owner UID match istio-proxy
8 480 RETURN all -- any any anywhere anywhere owner UID match istio-proxy
0 0 ISTIO_IN_REDIRECT all -- any lo anywhere !localhost owner GID match istio-proxy
0 0 RETURN all -- any lo anywhere anywhere ! owner GID match istio-proxy
0 0 RETURN all -- any any anywhere anywhere owner GID match istio-proxy
0 0 RETURN all -- any any anywhere localhost
0 0 RETURN all -- any any anywhere 10.245.0.0/16
0 0 ISTIO_REDIRECT all -- any any anywhere anywhere
Chain ISTIO_REDIRECT (1 references)
pkts bytes target prot opt in out source destination
0 0 REDIRECT tcp -- any any anywhere anywhere redir ports 15001
traffic.sidecar.istio.io/excludeOutboundIPRanges
を追加しない場合は ISTIO_OUTPUT
Chain において外向きの通信は最終的には ISTIO_REDIRECT all -- anywhere anywhere
にマッチし、 ISTIO_REDIRECT
を経由し Istio outbound port である 15001 port[1] を経由し外部へ通信します。
traffic.sidecar.istio.io/excludeOutboundIPRanges
が設定してある場合は ISTIO_OUTPUT
Chain において destination が設定してあるため ISTIO_REDIRECT
を経由せずに即座に外部へと通信するため istio-proxy を通らない通信となります。
Discussion