traffic.sidecar.istio.io/excludeOutboundIPRanges の挙動について

2023/10/07に公開

概要

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_OUTPUTRETURN 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 を通らない通信となります。

images

脚注
  1. Istio / Application Requirements ↩︎

Discussion