Kubernetes/Network Study

iptables 이해하기

백곰곰 2024. 8. 31. 17:10
728x90
반응형

가시다님의 Kubernetes Advanced Networking Study에 참여하게 되어, 스터디 때 다룬 주제를 정리하려고 합니다.
1주차는 컨테이너 격리 & 네트워크 및 보안이 진행되었으며, 이번 글에서는 iptables 관련된 개념을 포함하고 있습니다.

 

들어가며

kubernetes의 주요 구성요소 중 하나인 kube-proxy는 클러스터 내부의 서비스간 통신을 가능하게 하기 위해서 iptables를 사용하고 있습니다(iptables 모드인 경우).

이번 글에서는 kubernetes 서비스의 통신 방식을 알아보기 전에 iptables의 개념과 동작 방식을 정리해보려 합니다.

 

iptables 개념

iptables는 방화벽으로 네트워크 필터링(허용/차단)과 제어를 수행합니다. 커널 모듈인 netfilter hook과 상호 작용하며, 여러개의 테이블(table), 체인(chain), 규칙(rule)으로 구성되어 있습니다.

 

Table

테이블은 특정한 네트워크 작업을 처리하기 위한 규칙들의 모음입니다. 역할이 다른 총 5개의 테이블이 있으며, 각 테이블에는 체인과 규칙이 포함됩니다.

  • Filter 테이블 : 패킷 필터링(허용/차단), 가장 기본 테이블(iptables 명령어에 -t 옵션 미정의시 기본으로 사용)
  • NAT 테이블 : 패킷의 src/dst ip 및 포트 변경
  • Mangle 테이블 : ip 헤더 변조(예시 - TTL값 조정, 네트워크 홉 수 조정 등)
  • Raw 테이블 : 연결 추적(Connection Tracking) 시스템에 의해서 처리되지 않아야 하는 패킷에 마킹
  • Security 테이블 : 패킷에 SELinux의 보안 context를 설정

Chain

체인은 패킷에 대해 언제 규칙을 평가할 지 결정합니다. 기본적인 체인이 있으며, 이는 netfilter hook을 대표합니다.

이 외에도 커스텀한 체인을 직접 추가할수도 있습니다.

  • PREROUTING
    • 패킷 라우팅 결정 전에 적용
    • NF_IP_PRE_ROUTING hook
      • incoming 패킷이 network stack에 진입하자마자 트리거
      • 라우팅 전에 처리
  • INPUT:
    • 시스템으로 들어오는 패킷에 대해 적용
    • NF_IP_LOCAL_IN hook
      • incoming 패킷의 목적지가 로컬일때 라우팅 이후 트리거
  • FORWARD
    • 시스템을 통과하여 다른 네트워크로 전달되는 패킷에 대해 적용
    • NF_IP_FORWARD hook
      • incoming 패킷이 다른 호스트로 포워딩될 때 해당 호스트로 라우팅 이후 트리거
  • OUTPUT
    • 시스템에서 나가는 패킷에 대해 적용
    • NF_IP_LOCAL_OUT hook
      • 로컬에서 생성된 Outbound 트래픽에 의해 트리거
  • POSTROUTING
    • 패킷이 라우팅 이후에 적용(Outbound, Forward에 대해)
    • NF_IP_POST_ROUTING hook
      • 라우팅 이후 Outbound or 포워딩 트래픽에 의해 트리거
      • 패킷이 최종적으로 전송되기 직전에 마지막으로 적용할 수 있는 규칙 정의

Rule

패킷을 검사하고, 조건에 맞는 패킷에 대해 action을 수행하도록 정의합니다.

  • Matching
    • 패킷이 조건에 맞는지 확인
    • 설정 가능 항목
      • 프로토콜 타입
      • src/dst 주소/포트
      • input/output 인터페이스
      • ...
  • Targets(Action)
    • 패킷이 조건에 맞을 때 수행하는 것 
    • 종류
      • Terminating targets : 체인 내에서의 평가를 종료하고, netfilter hook에 제어를 넘기면 패킷 드롭 또는 다음 단계를 진행
      • Non-terminating targets : 액션 수행 후 체인 내에서의 평가를 계속 진행하며, 최종 결정을 내리기 전까지 여러 Non-termitating 타겟이 실행될 수 있음
      • 사용 가능한 옵션
        • ACCEPT : 패킷 허용
        • DROP : 패킷 차단
        • RETURN : 현재 체인에서의 평가를 끝내고, 이전에 호출한 체인의 다음 규칙으로 돌아가며, 만약 기본 체인의 끝에 도달했거나, RETURN 타겟을 가진 규칙이 일치하면, 체인 정책에 의해 패킷 처리 결정
        • 그 외 사용 가능한 옵션(LOG, DNAT ...)

Table과 Chain

테이블은 아래와 같이 여러 개의 체인으로 구성되어 있습니다.

Table / Chains PREROUTING INPUT FORWARD OUTPUT POSTROUTING
(routing decision)       O  
raw O     O  
(connection
tracking enabled)
O     O  
mangle O O O O O
nat (DNAT) O     O  
(routing decision) O     O  
filter   O O O  
security   O O O  
nat (SNAT)   O     O

 

각 테이블 내에서 체인 평가 순서는 왼쪽에서 오른쪽으로 진행됩니다.

ex) mangle 테이블 : PREROUTING -> INPUT -> FORWARD -> OUTPUT -> POSTROUTING

raw 테이블 : PREROUTING -> OUTPUT

 

또한, 체인은 테이블 별로 위에서 아래 방향으로 평가합니다.

ex) PREROUTING : raw -> mangle -> nat

 

아래 그림은 패킷 평가 순서 예시를 보여줍니다.

 

1) 외부에서 들어온 패킷

-> PREROUTING (raw -> mangle -> nat)

                             1) 목적지가 로컬

                               -> INPUT (mangle -> filter -> security)

                             2) 목적지가 다른 호스트

                               -> FORWARD(mangle -> filter -> security) -> POSTROUTING (mangle -> nat)

2) 내부에서 발생한 패킷

-> OUTPUT(raw -> mangle -> filter -> security) -> POSTROUTING

 


Connection Tracking(연결 추적)

Netfilter 프레임워크 위에 구축된 connection tracking 시스템은 iptables가 지속적인 연결의 맥락에서 패킷을 보고 결정을 내릴 수 있게 해줍니다(stateful). 패킷이 네트워크 스택에 진입한 직후 연결 추적이 실작됩니다. 그러나 raw 테이블의 체인에서 NOTRACK 으로 마킹된 패킷은 connection tracking 시스템을 우회합니다.

  • 상태 종류
    • NEW : 패킷이 기존 연결과 관련이 없지만, 첫 패킷으로서 유효한 경우 시스템에 새로운 연결이 추가(TCP, UDP 모두 해당)
    • ESTABLISHED : 반대 방향에서 유효한 응답을 받은 경우 NEW -> ESTABLISHED로 변경되며, TCP의 경우 SYN/ACK를, UDP 및 ICMP의 경우 원래 패킷의 소스와 목적지가 바뀐 응답을 받은 것
    • RELATED : 기존 연결과 관련이 있지만 직접적이지 않은 경우로, FTP 데이터 전송 및 다른 프로토콜의 연결 시도에 대한 ICMP 응답이 해당
    • INVALID : 패킷이 기존 연결과 관련이 없고 새로운 연결을 여는 데 적절하지 않거나, 식별할 수 없거나, 라우팅할 수 없는 경우 
    • UNTRACKED : 패킷이 연결 추적을 우회하도록 raw 테이블 체인에서 타겟으로 지정된 경우
    • SNAT : NAT 작업에 의해 소스 주소가 변경된 경우 설정되는 상태이며,응답 패킷에서 소스 주소를 다시 변경해야 함을 알기 위해 사용
    • DNAT :NAT 작업에 의해 목적지 주소가 변경된 경우 설정되는 상태이며, 응답 패킷을 라우팅할 때 목적지 주소를 다시 변경해야 함을 알기 위해 사용
  • 확인 방법
    • conntrack -L 명령어를 통해 현재 추적 중인 모든 연결을 확인할 수 있음

사용 예시

iptables 명령어를 사용해서 여러가지 설정을 추가해보겠습니다.

## 출발지 ip가 192.168.0.111인 패킷 차단
iptables -A INPUT -s 192.168.0.111 -j DROP
## tcp이며 목적지 port가 3000d인 패킷 차단
iptables -A INPUT --dport 3000 -p tcp -j DROP
## 목적지 ip가 11.11.11.0/24 대역인 경우 forward 허용
iptables -A FORWARD -d 11.11.11.0/24 -j ACCEPT
## ESTABLISH,RELATED 상태인 패킷 허용
iptables -A INPUT -m state --state ESTABLISH,RELATED -j ACCEPT
root@MyServer:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       tcp  --  anywhere             anywhere             tcp dpt:3000
DROP       all  --  ip-192-168-0-111.ap-northeast-2.compute.internal  anywhere
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED

Chain FORWARD (policy DROP)
target     prot opt source               destination
DOCKER-USER  all  --  anywhere             anywhere
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             11.11.11.0/24

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain DOCKER (1 references)
target     prot opt source               destination

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

Chain DOCKER-USER (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

iptables에 기본 체인 외에 DOCKER로 시작하는 체인들을 확인할 수 있습니다. 이는 docker를 설치하며 자동으로 추가된 체인입니다.

이러한 유저 정의 체인은 jump를 통해서만 평가될 수 있습니다.

 


Kubernetes 노드의 iptables 설정 이해하기

아래와 같은 Service가 있는 노드의 iptables 설정을 살펴보겠습니다.

## Service ip 확인
$ k get svc -A | grep 172.30.165.244
kube-system           kube-dns-upstream                                                 ClusterIP   172.30.165.244   <none>        53/UDP,53/TCP                  39d
$ k get svc -A | grep 172.30.0.10
kube-system           kube-dns                                                          ClusterIP   172.30.0.10      <none>        53/UDP,53/TCP                  39d
$ k get svc -A | grep 172.30.191.111
test                  svc-nginx                                                         ClusterIP   172.30.191.111   <none>        80/TCP                         121d

## pod ip 확인 - svc-nginx에 연결
NAME                                  READY   STATUS    RESTARTS   AGE   IP              NODE                                              NOMINATED NODE   READINESS GATES
nginx-deployment-1-764d858646-c9v6j   1/1     Running   0          75m   10.56.135.64    ip-10-56-128-40.ap-northeast-2.compute.internal   <none>           <none>
nginx-deployment-1-764d858646-hzzh7   1/1     Running   0          75m   10.56.143.55    ip-10-56-128-40.ap-northeast-2.compute.internal   <none>           <none>
nginx-deployment-1-764d858646-s7wpt   1/1     Running   0          75m   10.56.115.164   ip-10-56-113-33.ap-northeast-2.compute.internal   <none>           <none>
nginx-deployment-1-764d858646-zzwtx   1/1     Running   0          75m   10.56.120.51    ip-10-56-113-33.ap-northeast-2.compute.internal   <none>           <none>

 

filter 테이블

[root@ip-10-56-128-40 /]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     udp  --  anywhere             ip-172-30-0-10.ap-northeast-2.compute.internal  udp dpt:domain /* NodeLocal DNS Cache: allow DNS traffic */
ACCEPT     tcp  --  anywhere             ip-172-30-0-10.ap-northeast-2.compute.internal  tcp dpt:domain /* NodeLocal DNS Cache: allow DNS traffic */
ACCEPT     udp  --  anywhere             ip-10-56-128-40.ap-northeast-2.compute.internal  udp dpt:domain /* NodeLocal DNS Cache: allow DNS traffic */
ACCEPT     tcp  --  anywhere             ip-10-56-128-40.ap-northeast-2.compute.internal  tcp dpt:domain /* NodeLocal DNS Cache: allow DNS traffic */
KUBE-PROXY-FIREWALL  all  --  anywhere             anywhere             ctstate NEW /* kubernetes load balancer firewall */
KUBE-NODEPORTS  all  --  anywhere             anywhere             /* kubernetes health check service ports */
KUBE-EXTERNAL-SERVICES  all  --  anywhere             anywhere             ctstate NEW /* kubernetes externally-visible service portals */
KUBE-FIREWALL  all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
KUBE-PROXY-FIREWALL  all  --  anywhere             anywhere             ctstate NEW /* kubernetes load balancer firewall */
KUBE-FORWARD  all  --  anywhere             anywhere             /* kubernetes forwarding rules */
KUBE-SERVICES  all  --  anywhere             anywhere             ctstate NEW /* kubernetes service portals */
KUBE-EXTERNAL-SERVICES  all  --  anywhere             anywhere             ctstate NEW /* kubernetes externally-visible service portals */

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     udp  --  ip-172-30-0-10.ap-northeast-2.compute.internal  anywhere             udp spt:domain /* NodeLocal DNS Cache: allow DNS traffic */
ACCEPT     tcp  --  ip-172-30-0-10.ap-northeast-2.compute.internal  anywhere             tcp spt:domain /* NodeLocal DNS Cache: allow DNS traffic */
ACCEPT     udp  --  ip-10-56-128-40.ap-northeast-2.compute.internal  anywhere             udp spt:domain /* NodeLocal DNS Cache: allow DNS traffic */
ACCEPT     tcp  --  ip-10-56-128-40.ap-northeast-2.compute.internal  anywhere             tcp spt:domain /* NodeLocal DNS Cache: allow DNS traffic */
KUBE-PROXY-FIREWALL  all  --  anywhere             anywhere             ctstate NEW /* kubernetes load balancer firewall */
KUBE-SERVICES  all  --  anywhere             anywhere             ctstate NEW /* kubernetes service portals */
KUBE-FIREWALL  all  --  anywhere             anywhere

Chain KUBE-EXTERNAL-SERVICES (2 references)
target     prot opt source               destination

Chain KUBE-FIREWALL (2 references)
target     prot opt source               destination
DROP       all  -- !ip-127-0-0-0.ap-northeast-2.compute.internal/8  ip-127-0-0-0.ap-northeast-2.compute.internal/8  /* block incoming localnet connections */ ! ctstate RELATED,ESTABLISHED,DNAT

Chain KUBE-FORWARD (1 references)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere             ctstate INVALID
ACCEPT     all  --  anywhere             anywhere             /* kubernetes forwarding rules */ mark match 0x4000/0x4000
ACCEPT     all  --  anywhere             anywhere             /* kubernetes forwarding conntrack rule */ ctstate RELATED,ESTABLISHED

Chain KUBE-KUBELET-CANARY (0 references)
target     prot opt source               destination

Chain KUBE-NODEPORTS (1 references)
target     prot opt source               destination

Chain KUBE-PROXY-CANARY (0 references)
target     prot opt source               destination

Chain KUBE-PROXY-FIREWALL (3 references)
target     prot opt source               destination

Chain KUBE-SERVICES (2 references)
target     prot opt source               destination
...
  • INPUT
    • 목적지 IP가 노드 IP 또는 CoreDNS 서비스 IP이고, 목적지 포트가 53(dpt:domain)인 TCP/UDP 패킷 허용
  • KUBE-FIREWALL
    • 로컬 네트워크 범위가 아닌 모든 소스 IP로부터 127.0.0.0/8 네트워크로 들어오는 패킷을 차단하며, RELATED, ESTABLISHED, DNAT 상태가 아닌 패킷에 적용
  • KUBE-FORWARD
    • INVALID 상태의 패킷 차단

nat 테이블

[root@ip-10-56-128-40 /]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
KUBE-SERVICES  all  --  anywhere             anywhere             /* kubernetes service portals */

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
KUBE-SERVICES  all  --  anywhere             anywhere             /* kubernetes service portals */

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
KUBE-POSTROUTING  all  --  anywhere             anywhere             /* kubernetes postrouting rules */

Chain AWS-CONNMARK-CHAIN-0 (0 references)
target     prot opt source               destination

Chain AWS-CONNMARK-CHAIN-1 (0 references)
target     prot opt source               destination

Chain AWS-SNAT-CHAIN-0 (0 references)
target     prot opt source               destination

Chain AWS-SNAT-CHAIN-1 (0 references)
target     prot opt source               destination

Chain KUBE-KUBELET-CANARY (0 references)
target     prot opt source               destination

Chain KUBE-MARK-MASQ (76 references)
target     prot opt source               destination
MARK       all  --  anywhere             anywhere             MARK or 0x4000

Chain KUBE-NODEPORTS (1 references)
target     prot opt source               destination

Chain KUBE-POSTROUTING (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere             mark match ! 0x4000/0x4000
MARK       all  --  anywhere             anywhere             MARK xor 0x4000
MASQUERADE  all  --  anywhere             anywhere             /* kubernetes service traffic requiring SNAT */ random-fully

Chain KUBE-PROXY-CANARY (0 references)
target     prot opt source               destination

Chain KUBE-SEP-OUJNVWUPANHJ5D7L (1 references)
target     prot opt source               destination
KUBE-MARK-MASQ  all  --  ip-10-56-110-113.ap-northeast-2.compute.internal  anywhere             /* kube-system/kube-dns:dns */
DNAT       udp  --  anywhere             anywhere             /* kube-system/kube-dns:dns */ udp to:10.56.110.113:53

Chain KUBE-SEP-4TRZVTDX7JGP665D (1 references)
target     prot opt source               destination
KUBE-MARK-MASQ  all  --  ip-10-56-97-75.ap-northeast-2.compute.internal  anywhere             /* default/kubernetes:https */
DNAT       tcp  --  anywhere             anywhere             /* default/kubernetes:https */ tcp to:10.56.97.75:443

Chain KUBE-SEP-BDXXJQVH7SOZ6AOC (1 references)
target     prot opt source               destination
KUBE-MARK-MASQ  all  --  ip-10-56-110-113.ap-northeast-2.compute.internal  anywhere             /* kube-system/kube-dns:dns-tcp */
DNAT       tcp  --  anywhere             anywhere             /* kube-system/kube-dns:dns-tcp */ tcp to:10.56.110.113:53

Chain KUBE-SEP-DSEZEV5X6SMTL566 (1 references)
target     prot opt source               destination
KUBE-MARK-MASQ  all  --  ip-10-56-136-22.ap-northeast-2.compute.internal  anywhere             /* kube-system/kube-dns-upstream:dns */
DNAT       udp  --  anywhere             anywhere             /* kube-system/kube-dns-upstream:dns */ udp to:10.56.136.22:53

Chain KUBE-SEP-E3EVNX3IJVRRVQYB (1 references)
target     prot opt source               destination
KUBE-MARK-MASQ  all  --  ip-10-56-110-113.ap-northeast-2.compute.internal  anywhere             /* kube-system/kube-dns-upstream:dns */
DNAT       udp  --  anywhere             anywhere             /* kube-system/kube-dns-upstream:dns */ udp to:10.56.110.113:53

Chain KUBE-SEP-FEAN3PXQ3RVOJ7A6 (1 references)
target     prot opt source               destination
KUBE-MARK-MASQ  all  --  ip-10-56-115-164.ap-northeast-2.compute.internal  anywhere             /* test/svc-nginx */
DNAT       tcp  --  anywhere             anywhere             /* test/svc-nginx */ tcp to:10.56.115.164:80

Chain KUBE-SEP-H66XNUFOXCNKCG5F (1 references)
target     prot opt source               destination
KUBE-MARK-MASQ  all  --  ip-10-56-110-113.ap-northeast-2.compute.internal  anywhere             /* kube-system/kube-dns-upstream:dns-tcp */
DNAT       tcp  --  anywhere             anywhere             /* kube-system/kube-dns-upstream:dns-tcp */ tcp to:10.56.110.113:53

Chain KUBE-SEP-JAHXFXMKFBHSMIBA (1 references)
target     prot opt source               destination
KUBE-MARK-MASQ  all  --  ip-10-56-135-64.ap-northeast-2.compute.internal  anywhere             /* test/svc-nginx */
DNAT       tcp  --  anywhere             anywhere             /* test/svc-nginx */ tcp to:10.56.135.64:80

Chain KUBE-SEP-NWGFNYPQVHMB27ML (1 references)
target     prot opt source               destination
KUBE-MARK-MASQ  all  --  ip-10-56-136-22.ap-northeast-2.compute.internal  anywhere             /* kube-system/kube-dns-upstream:dns-tcp */
DNAT       tcp  --  anywhere             anywhere             /* kube-system/kube-dns-upstream:dns-tcp */ tcp to:10.56.136.22:53

Chain KUBE-SEP-VSZSDJYX2QIYQA45 (1 references)
target     prot opt source               destination
KUBE-MARK-MASQ  all  --  ip-10-56-143-55.ap-northeast-2.compute.internal  anywhere             /* test/svc-nginx */
DNAT       tcp  --  anywhere             anywhere             /* test/svc-nginx */ tcp to:10.56.143.55:80

Chain KUBE-SEP-VTEPO2XBDJA72UOF (1 references)
target     prot opt source               destination
KUBE-MARK-MASQ  all  --  ip-10-56-129-252.ap-northeast-2.compute.internal  anywhere             /* default/kubernetes:https */
DNAT       tcp  --  anywhere             anywhere             /* default/kubernetes:https */ tcp to:10.56.129.252:443

Chain KUBE-SEP-WRP72UEH3UKKF7H5 (1 references)
target     prot opt source               destination
KUBE-MARK-MASQ  all  --  ip-10-56-136-22.ap-northeast-2.compute.internal  anywhere             /* kube-system/kube-dns:dns */
DNAT       udp  --  anywhere             anywhere             /* kube-system/kube-dns:dns */ udp to:10.56.136.22:53

Chain KUBE-SEP-XX2VRC25EQBIFPHV (1 references)
target     prot opt source               destination
KUBE-MARK-MASQ  all  --  ip-10-56-120-51.ap-northeast-2.compute.internal  anywhere             /* test/svc-nginx */
DNAT       tcp  --  anywhere             anywhere             /* test/svc-nginx */ tcp to:10.56.120.51:80

Chain KUBE-SEP-YWW7WJ6QBALFMODO (1 references)
target     prot opt source               destination
KUBE-MARK-MASQ  all  --  ip-10-56-136-22.ap-northeast-2.compute.internal  anywhere             /* kube-system/kube-dns:dns-tcp */
DNAT       tcp  --  anywhere             anywhere             /* kube-system/kube-dns:dns-tcp */ tcp to:10.56.136.22:53


Chain KUBE-SERVICES (2 references)
target     prot opt source               destination
KUBE-SVC-BRK3P4PPQWCLKOAN  tcp  --  anywhere             ip-172-30-165-244.ap-northeast-2.compute.internal  /* kube-system/kube-dns-upstream:dns-tcp cluster IP */ tcp dpt:domain
KUBE-SVC-ERIFXISQEP7F7OF4  tcp  --  anywhere             ip-172-30-0-10.ap-northeast-2.compute.internal  /* kube-system/kube-dns:dns-tcp cluster IP */ tcp dpt:domain
KUBE-SVC-MRW7XFPFSYA2VFWG  tcp  --  anywhere             ip-172-30-191-111.ap-northeast-2.compute.internal  /* test/svc-nginx cluster IP */ tcp dpt:http

...
KUBE-NODEPORTS  all  --  anywhere             anywhere             /* kubernetes service nodeports; NOTE: this must be the last rule in this chain */ ADDRTYPE match dst-type LOCAL

...

Chain KUBE-SVC-ERIFXISQEP7F7OF4 (1 references)
target     prot opt source               destination
KUBE-SEP-BDXXJQVH7SOZ6AOC  all  --  anywhere             anywhere             /* kube-system/kube-dns:dns-tcp -> 10.56.110.113:53 */ statistic mode random probability 0.50000000000
KUBE-SEP-YWW7WJ6QBALFMODO  all  --  anywhere             anywhere             /* kube-system/kube-dns:dns-tcp -> 10.56.136.22:53 */

Chain KUBE-SVC-MRW7XFPFSYA2VFWG (1 references)
target     prot opt source               destination
KUBE-SEP-FEAN3PXQ3RVOJ7A6  all  --  anywhere             anywhere             /* test/svc-nginx -> 10.56.115.164:80 */ statistic mode random probability 0.25000000000
KUBE-SEP-XX2VRC25EQBIFPHV  all  --  anywhere             anywhere             /* test/svc-nginx -> 10.56.120.51:80 */ statistic mode random probability 0.33333333349
KUBE-SEP-JAHXFXMKFBHSMIBA  all  --  anywhere             anywhere             /* test/svc-nginx -> 10.56.135.64:80 */ statistic mode random probability 0.50000000000
KUBE-SEP-VSZSDJYX2QIYQA45  all  --  anywhere             anywhere             /* test/svc-nginx -> 10.56.143.55:80 */

Chain KUBE-SVC-NPX46M4PTMTKRN6Y (1 references)
target     prot opt source               destination
KUBE-SEP-VTEPO2XBDJA72UOF  all  --  anywhere             anywhere             /* default/kubernetes:https -> 10.56.129.252:443 */ statistic mode random probability 0.50000000000
KUBE-SEP-4TRZVTDX7JGP665D  all  --  anywhere             anywhere             /* default/kubernetes:https -> 10.56.97.75:443 */

Chain KUBE-SVC-TCOU7JCQXEZGVUNU (1 references)
target     prot opt source               destination
KUBE-SEP-OUJNVWUPANHJ5D7L  all  --  anywhere             anywhere             /* kube-system/kube-dns:dns -> 10.56.110.113:53 */ statistic mode random probability 0.50000000000
KUBE-SEP-WRP72UEH3UKKF7H5  all  --  anywhere             anywhere             /* kube-system/kube-dns:dns -> 10.56.136.22:53 */
  • KUBE-SERVICES
    • 목적지 IP가 Kubernetes Service IP인 패킷에 대한 rule 정의
    • -> KUBE-SVC-MRW7XFPFSYA2VFWG
      • 목적지 IP가 svc-nginx의 Service IP인 패킷에 대한 rule 정의
      • Service에 연결된 여러 개의 파드(endpoint)에 대한 트래픽을 균등한 확률로 분산
      • -> KUBE-SEP-FEAN3PXQ3RVOJ7A6
        • 목적지 IP를 파드 IP(10.56.115.164)로 변경(DNAT)

지금까지 iptables 개념을 알아보고 이를 기반으로 kubernetes 노드의 iptables에 설정된 내용을 확인해 봤습니다. iptables를 통해 Service ip를 기반으로 통신이 가능하며, 트래픽이 여러 파드로 분산되는 것을 확인할 수 있었습니다.

 

 

참고)

728x90

'Kubernetes > Network Study' 카테고리의 다른 글

Kubernetes Service 분석 - ClusterIP, NodePort  (3) 2024.09.28
Calico 개념 및 실습  (3) 2024.09.21
Flannel CNI 실습  (3) 2024.09.07
Pause Container 이해하기  (11) 2024.09.02
도커 없이 컨테이너 만들기  (1) 2024.08.28