iptables
개요
iptables는 리눅스에서 사용되는 네트워크 패킷 조작 테이블을 작성하는 명령어이다.
패킷을 필터링하고, 라우팅하고, 드랍하거나 마스크를 붙이는 등 다양한 규칙을 설정해서 넣을 수 있다.
이를 기반으로 방화벽을 구성하거나, 서비스 메시에서는 사이드카 프록시로 트래픽을 전담하는 식으로 활용한다.
특히 쿠버네티스에서는 kube-proxy가 기본적으로 이 iptables를 통해 서비스를 향하는 트래픽을 실제 파드로 전달한다.
실제 동작은 넷필터(NetFilter)라는 커널 단의 네트워크 프레임워크를 활용한다.
달리 말해, iptables가 네트워크 조작의 대명사로 활용되지만 사실 넷필터를 활용하는 다른 툴들도 있다!
iptables를 보완하고 더 효율적으로 트래픽을 처리하는 ipvs도 있고, 최근에는 nftables라는 더 효율적이고 범용적인 기능을 가진 툴이 나왔다.
그래서 iptables가 점차 사라질 것이라는 이야기가 많다.
근데 nftables도 나온지 한참 지났는데 그다지 많이 사용되지도 않고..
내 생각에는 그냥 eBPF를 활용하는 방식이 더 발전해버려서 nftables는 주류를 차지할 기회도 앞으로 없지 않을까..
다른 툴들에 대해서는 아래에서 조금 더 자세히 다루겠다.
NetFilter란
먼저 근간이 되는 넷필터에 대해서 알아보자.
넷필터는 리눅스 커널에 있는 프레임워크로[1] iptables, nftables는 사실 이걸 다루는 명령어이다.
넷필터는 커널 모듈에 콜백 함수를 넣어주는 기능을 가지고 있다.
그래서 OS에 들어온 패킷이 거쳐갈 기본 네트워크 스택에 대해 사용자가 각종 규칙과 설정을 넣을 수 있는 것이다.
netfilter에는 몇 개의 훅이 있어서, 이 훅에 대해 우리가 여러가지 규칙들을 지정하면 네트워크 패킷이 오가는 와중에 중간 중간 끼어서 각종 동작을 하게 된다.
이렇게 네트워크 스택을 도식화 했을 때 ip, tcp, arp 관련 층에서 동작하는 거라고 보면 될 것 같다.
참고로 넷필터를 전문으로 다루는 오픈소스 커뮤니티 그룹이 있다.
이 그룹에서 iptables와 nftables도 관리하고 있다.
넷필터 기능
대충 말했지만 넷필터의 기능은 간단하게 패킷 조작질로 요약할 수 있다.
조금 더 상세하게 풀어보자면..
패킷 필터링, napt(network address and port translation),패킷 로깅, 사용자공간 패킷 큐 처리 등의 일을 할 수 있다.
또 패킷 맹글링도 할 수 있는데, 이게 뭔 말인가 했더니 패킷을 갈아끼우는 행위를 말한다.
대체로 헤더를 바꿔치는 행위를 말하는 것 같다.
홈페이지에서 나오는 내용을 그대로 베끼자면,
- 스테이트리스, 스테이트풀한 패킷에 대한 필터링으로 인터넷 방화벽을 세울 수 있다.
- 고가용성 있는 스테이트리스, 스테이트풀한 방화벽을 배포할 수 있다.
- 충분한 공인 IP 주소가 없을 때 인터넷 접근을 공유하기 위해 nat나 마스커레이딩할 수 있다.
- 마스커레이딩이 뭔가 싶었는데, nat와 조금의 차이는 있다.
- 투명한 프록시를 실현하는 nat를 만들 수 있다.
- 투명성은 사용자 입장에서는 모른다는 것을 말한다.
- 복잡한 qos, 정책 라우터를 만들 때 트래픽 제어, 라우팅 시스템을 도와줄 수 있다..
- ip 헤더의 TOS/DSCP/ECN 비트를 변환하는 조작(맹글링)등을 할 수 있다.
넷필터 동작 구조
넷필터 컴포넌트는 이렇게 구성돼있다.[2]
이것들은 리눅스 커널에 위치한 넷필터 모듈로 보다시피 ip_tables, arp_tables 등으로 구성된다.
이 놈들은 각각 테이블 기반으로 이뤄져 있으며, 패킷을 전송하고 변환하는 규칙(rule)이 담긴다.
이때 규칙은 전부 넷필터가 노출하는 훅 api에 호환되도록 작성돼있다.
즉 넷필터 프레임워크라는 것은 크게는 이렇게 정리할 수 있을 것 같다.
- 커널 단에 패킷 관련 조작을 할 수 있는 훅에 대한 엔드포인트를 노출한다.
- 해당 엔드포인트에 적용될 수 있는 규칙들을 테이블 형태로 사용자가 입력할 수 있도록 노출한다.
사용자는 iptables 명령어를 이용해 어떤 규칙들을 작성한다.
이 규칙들은 테이블 형태로 관리되며 커널 단의 훅으로 주입될 수 있는 형식을 가지고 있다.
넷필터는 이 모듈들을 활용할 수 있는 훅을 만들어서 사용자에게 제공한다는 것이다.
코드에 대한 이해가 없어서 표현이 조금 애매한 것 같기도 한데, 세부적인 넷필터의 코드는 여기에서 볼 수 있다.[3]
모듈 이름들이 죄 tables인데, 이것들을 관리할 수 있도록 유저 공간에 제공되는 명령어 이름도 똑같이 tables이다.
그래서 iptables라고 하면 명령어 자체를 말하기도 하지만 사실 넷필터의 코어 모듈을 말하는 것이기도 하다.
그래서 넷필터랑 iptables를 따로 떼어놓고 생각하기가 어려운 지점이 있기도 하다.
아무튼 사용하는 입장에서 모듈 이름이 이렇다 정도까지 알 필요는 없고, 넷필터에는 여러 테이블이 있어 규칙을 나열하여 적용할 수 있다 정도만 알면 될 것 같다.
원래 iptables, arptables 등 tables 시리즈가 있어 각각을 관리하는 식으로 운용했다.
그러나 방식 자체도 비효율적이고 낡았다고 해서 통합 개선돼 나온 것이 nftables 모듈이며, 이를 조작하는 툴이 nftables 명령어이다.
넷필터 훅
넷필터의 동작 구조는 훨 복잡하지만, 지금부터는 iptables 설명에 초점을 맞춰 내용을 정리하겠다.
넷필터의 핵심은 결국 커널 단의 패킷 조작이 가능하도록 하는 훅을 노출하는 것이다.
이때 넷필터는 딱 5개의 훅을 노출한다.[4]
이 훅에 위 모듈 테이블에 적힌 규칙이 들어가서 트래픽이 패킷이 조작되는 것이다.
각 훅이 무엇인지 간략하게 알아볼 텐데, 그전에 먼저 OS가 받아들이는 네트워크 흐름도를 먼저 살펴보자.
이걸 처음에 빠르게 캐치 못해서 이해하는데 조금 난항이 있었다..
우리의 운영체제는 네트워크 데이터를 어떻게 주고받는가? [5]
일단 네트워크 인터페이스 카드, 혹은 장치(net_device)가 있다.
1계층에 해당하는 물리적 장치(가상 인터페이스도 있긴 한데 결국 물리적인 영역을 한 단계 추상화시켰으니 근본은 물리적 장치라 하겠다)를 말하며, 실제로 네트워크 비트를 받고 변환하는 역할을 한다.
이 장치를 통해 들어온 패킷은 두 가지 방향으로 나아갈 수 있다.
- 시스템으로 인입
- 우리 시스템으로 들어오는 패킷으로, 우리가 어떤 서버를 실행하고 있을 때 이 서버로 들어가는 패킷이 이런 케이스이다.
- 이렇게 프로세스까지 전달되는 일련의 과정을 네트워크 스택에 들어간다고 표현한다.
- 포워딩
- 우리 장치에 들어오기는 했으나 전송 대상이 우리가 아닌 패킷도 있다.
- 이런 패킷은 시스템에 들어가지 않고 다른 곳으로 포워딩(forward)된다고 표현한다.
- 오버레이 네트워크를 구성하거나 라우터에서 보게 되는 케이스라 할 수 있겠다.
- 일반 로컬 컴퓨터는 포워딩하지 않고 드롭하도록 기본 설정돼있어 일반 사용자가 보는 상황은 흔치 않다.
(엄밀하게는 컴퓨터에 들어오는 순간 네트워크 스택에 들어왔다고 봐야 하는 게 아닌가 싶었는데 여태 본 글들은 다 이리 표현하더라.)
라우팅 단계에서 해당 패킷이 어디로 나아갈지 결정될 것이다.
반대로 나가는 패킷 역시 두 가지 출발지를 가질 것이다!
하나는 시스템에서 나가는 패킷이 있을 것이고, 포워딩되어 그대로 나가버리는 패킷도 나가는 패킷에 해당한다.
이러한 전반적인 흐름 속에서, 넷필터는 5가지의 단계 포인트를 지정한다.
위 그림의 파란색 박스가 바로 그 포인트이다.
그리고 넷필터는 이 포인트들에 대해 조작을 가할 수 있는 훅을 노출하고 있는 것이다.
NF_IP_PRE_ROUTING
- 패킷이 리눅스 네트워크 스택으로 들어가기 전 발동되는 훅
- 패킷이 시스템으로 들어가든, 다른 컴퓨터로 라우팅되든 간에 어딘가로 가기 이전 무조건 발동된다.
NF_IP_LOCAL_IN
- 패킷이 로컬 시스템으로 들어오는 순간 발동되는 훅
NF_IP_FORWARD
- 패킷이 다른 호스트로 보내질(forward) 때 발동되는 훅
NF_IP_LOCAL_OUt
- 패킷이 로컬 시스템에서 나가는 순간 발동되는 훅
NF_IP_POST_ROUTING
- 패킷이 정말 와이어 타고 바깥으로 나가기 직전 발동되는 훅
iptables 툴은 이 훅들에 원하는 규칙(rule)을 넣는 식으로 동작하게 된다는 것이다.
이제 본격적으로 iptables를 다루는 방법에 대해 알아보자.
체인
계속 말하지만, iptables는 결국 어떤 규칙들을 테이블 형태로 만드는 툴이다.
iptables에서는 이 규칙들을 체인이라는 개념으로 한 번 더 구조화시킨다.
체인은 규칙들의 집합으로, 보통 규칙의 체인(chains of rules)라고 부른다.
체인의 필요성
왜 체인이라는 개념이 필요한가?
이건 규칙이 테이블 형태로 설정된다는 것에 그 이유가 있다.
패킷이 들어오면 규칙 테이블에 의해 순차적으로 검사와 조작을 받게 된다.
말 그대로 테이블이에 순서는 엄격하게 지켜진다.
그런데 이런 상황을 생각해보자.
간략하게 a로 들어온 패킷을 b라는 곳으로 보내는 규칙을 쓰고 싶다고 해보겠다.
- a로 들어온 패킷은 출처 주소가 localhost면 드랍한다.(!)
- a로 들어온 패킷은 목적지 포트가 53이면 출처 주소를 c로 바꿔서 b로 보낸다.
- a로 들어온 패킷은 목적지 주소가 172.172.172.172이면 d로 보낸다.
- a로 들어온 패킷은 위 조건에 해당하지 않으면 그냥 b로 보낸다.
- a로 들어오지 않은 패킷은 드랍한다.
그냥 예시로 아무렇게나 쓴 규칙이니 예시로만 참고하자.
체인이란 개념이 없으면 모든 트래픽은 이 규칙들을 순차적으로 적용 받는다.
그럼 a로 들어오지 않은 패킷은 자신과 관련도 없는 규칙을 4번이나 검사받아야 한다!
여기에 체인 개념을 도입하면 이런 식으로 수정할 수 있다.
- a로 들어온 패킷은 다음의 규칙이 작성된 zz 체인으로 보낸다.
- 출처 주소가 localhost면 드랍
- 목적지 포트가 53이면 출처 주소를 c로 바꿔서 b로 보낸다.
- 목적지 주소가 172.172.172.172이면 d로 보낸다.
- 위 조건에 해당하지 않으면 그냥 b로 보낸다.
- a로 들어오지 않은 패킷은 드랍한다.
이제 a로 들어오지 않은 패킷은 하나의 규칙만 검사를 받으면 맘 편히 드랍될 수 있게 된다!
a로 들어온 패킷은 zz 체인의 규칙들의 검사를 받게 될 것이다.
이렇게 체인이란 것은 각종 규칙들을 그룹화시키는 역할을 한다.
그리고 규칙들은 이 체인을 대상으로 삼음으로서 트래픽에 적용될 규칙들을 분기시켜서 다양한 로직을 구성할 수 있게 된다.
이는 세밀한 네트워크 규칙을 구성할 수 있게 돕는 한편 패킷이 불필요한 규칙의 적용을 받지 않게 함으로서 처리 효율을 증가시킨다.
내장 체인
위 예시에서 내가 마음대로 zz라는 체인을 만들었듯이 체인은 사용자가 다양하게 구성할 수 있다.
여기에서 체인의 진입점이 어떻게 되는가에 대한 의문이 생겼다면 체인을 제대로 이해한 것이다.
기본적으로 패킷은 어떤 규칙의 적용을 받는가?
iptables에는 사전 정의된(pre-defined), 내장된(built-in) 5개의 체인을 가지고 있다.
이름만 봐도 알겠지만, 이 체인들은 각각 넷필터의 훅과 1:1 매핑된다.[6]
이제 넷필터의 개념과 더불어서 각 체인이 언제 발동되는지 명확하게 알 수 있다.
일단 전체 순서나 발동 시기는 이렇게 보면 이해가 편할 듯 싶다.
- PREROUTING -
NF_IP_PRE_ROUTING
훅에 발동되는 체인 - INPUT -
NF_IP_LOCAL_IN
훅에 발동되는 체인 - FORWARD -
NF_IP_FORWARD
훅에 발동되는 체인 - OUTPUT -
NF_IP_LOCAL_OUt
훅에 발동되는 체인 - POSTROUTING -
NF_IP_POST_ROUTING
훅에 발동되는 체인
zz 체인 예시의 규칙들을 INPUT 체인에 넣어놨다면, NF_IP_LOCAL_IN
훅을 발동시키는 패킷에 대해 해당 규칙들이 적용될 것이다.
체인은 규칙이 적용되는 시기를 정한다.
달리 말하자면 관리자가 패킷 전달이 되는 과정에서 어디에다 규칙을 박을지를 정할 때 원하는 위치의 체인을 쓰면 된다는 것이다.
가령 일단 패킷이 들어온 순간 어떤 규칙을 발동하고 싶다? 그럼 PREROUTING
체인을 활용해야 할 것이다.
테이블
이 개념을 이해하는데 가장 오래 걸렸던 것 같은데, iptables에서는 테이블이란 개념으로 체인들을 다시 한 번 그룹화시킨다...
개념만 보면 어렵진 않은 게, 여러 규칙과 체인을 작성하는데 있어서 사용 목적에 맞게 사용하라고 iptables에서 제공하는 그룹이라고 보면 된다.
예를 들어 방화벽처럼 패킷을 드랍시키는 동작을 하는 규칙은 filter라는 테이블에 넣고, 패킷의 출처 주소를 조작하는 규칙은 nat 테이블에 넣는 식이다.
다양한 체인들을 작성하는데 있어서 이들을 목적에 맞게 더 구조화시키라고 제공해주는 단위가 테이블인 것이다.
정의로 보자면 테이블은 체인들을 가지고 있는 집합체이다.
iptables에서는 기본 5개의 테이블을 제공하는데, 커스텀이 가능한 체인과 다르게 이건 완전히 못박아버렸다.
그래서 관리자는 본인이 만드려는 규칙의 용도를 생각하고 각 테이블에 넣는 방식으로 설정하면 된다.
유의해야 할 테이블의 특징은,
- 각 테이블이 가지고 있는 내장 체인이 다르다.
- 예를 들면 filter라는 테이블은 INPUT, FORWARD, OUTPUT 체인만 가지고 있다.
- filter 테이블에서는 PRE_ROUTING 관련 체인을 사용할 수 없다!
- 생각해보면 filter는 방화벽 용도로 사용되는 테이블로 포워딩되는 패킷에 관여할 필요가 없기에 당연하다.
- 테이블마다 우선순위가 존재한다.
- 즉 같은 체인이라도 테이블마다 우선 적용이 되는 게 있다.
- raw 테이블은 filter 테이블보다 우선 순위가 높다.
테이블 종류
그럼 각 테이블이 어떤 역할을 하는지 구체적으로 보자.
filter table
패킷 필터링을 하는, 패킷이 원하는 요청대로 가도될지 말지를 결정하는 테이블.
그냥 흔히 이야기하는 방화벽 관련 규칙이라 하면 이 테이블을 사용하는 것이다.
nat table
이름 그대로 nat 규칙을 구현하는 테이블.
네트워크 스택에 패킷이 들어오면, 패킷의 소스나 목적지 주소를 바꾼다.
이를 통해 패킷, 트래픽이 라우팅되는 경로에 영향을 준다.
대체로 직접적 접근이 안되는 트래픽을 라우팅할 때 사용한다.
mangle table
패킷 헤더를 조작할 때 사용하는 테이블.
예를 들면 패킷의 ttl 값을 싹 바꿔서, 패킷이 더 오래 네트워크를 타고 다니게 할 수도 있다.
다른 네트워크 툴이나 테이블의 조작을 위해, 내부적인 커널 마크를 남기는 일도 할 수 있다고 한다.
이 부분은 소켓에 대한 이해를 필요로 한다.
주의할 점으로, 여기에서 말하는 패킷 조작은 실제 패킷을 조작하는 게 아니다.
커널에 들어온 패킷은 하나의 구조체로 타입으로 추상화되는데, 이때 IP 패킷 구조체의 헤더 정보를 조작한다는 것이다.
이것이 중요한 이유는 패킷을 조작한다고 해도 해당 내용은 한 노드 내에서만 인식될 수 있기 때문이다.
raw table
굉장히 제한적인 목적을 가지고 있는 테이블.
연결 추적(connection tracking)을 거부하기 위해 패킷에 마킹하는 매커니즘을 제공하기 위해 존재한다.
넷필터에는 conntrack, 즉 연결을 추적하는 기능이 있다.
L7의 HTTP 요청은 사실 저수준 계층에서 보면 여러 개의 패킷으로 쪼개져 있다.
이때 분절되어 날아오는 여러 패킷을 파편이 아닌, 세션이나 지속적인 연결로 인식하게 돕는 것이 바로 컨트랙이다.
(tcp 단위로 컨트랙하는 게 기본)
참고로 이 기능은 네트워크 인터페이스에 접촉한 시점에 거의 즉시 추적이 시작된다고 한다.
패킷이 이전 패킷과의 관계에 따라 평가될 수 있도록 한다는 점에서 iptables는 stateful하다고 흔히 이야기한다.
security table
SELinux의 보안 컨텍스트 마킹을 매기기 위해 존재한다.
그래서 SELinux나 관련 툴들이 패킷을 다룰 때 도움을 준다고 한다.
커넥션 별, 패킷 별 적용할 수 있다.
사용해본 적도 없고 여기에 규칙 쓰인 걸 본 적이 없어서 잘 모르겠다.
테이블과 체인의 관계
테이블은 우선순위가 있다고 했다.
그리고 체인들도, 네트워크 흐름따라 당연히 먼저 적용되는 놈들이 있다.
그래서 이게 순서를 나타내는 표이다.
위쪽부터 아래로 테이블이 적용되고, 왼쪽부터 오른쪽으로 체인이 발동된다.
여기에서 nat는 두 개로 나뉘었는데, snat와 dnat를 나눴다.
라우팅 결정이 내려지고, 연결 트래킹이 일어나는 시점에 행으로 기입됐다.
이걸 토대로 예시를 들어보겠다.
혼자 웹서버를 띄우고 localhost에 curl 요청을 날린다고 쳐보겠다.
그럼 여기에서 두 가지 네트워크 흐름이 생성된다.
- curl 요청이 날아가는 과정
- curl 요청이 날아가며 일단 output 체인을 거친다.
- 그럼 위에서부터 순서대로, raw-mangle-nat-filter-security 테이블에 있는 output 체인들 속 규칙을 거친다.
- localhost는 가상 인터페이스를 가진 루프백 주소라 여기에서 다시 돌아가기 때문에 postrouting 체인에는 걸리지 않는다.
- 다시 네트워크 스택으로 돌아가는, input 체인을 거친다.
- 이것도 위에서부터 순서대로, mangle-filter-security-nat 테이블에 있는 input 체인들 속 규칙을 거친다.
- curl 요청이 날아가며 일단 output 체인을 거친다.
- 요청에 대한 웹 서버의 응답이 돌아오는 과정
- 웹 서버의 응답도 당연히 프로세스에서 나가는 output 체인을 거친다.
- raw-mangle-nat-filter-security 테이블에 있는 output 체인들 속 규칙을 거친다.
- 그리고 curl을 날린 곳으로 돌아가는 input 체인을 거친다.
- mangle-filter-security-nat 테이블에 있는 input 체인들 속 규칙을 거친다.
- 웹 서버의 응답도 당연히 프로세스에서 나가는 output 체인을 거친다.
이렇게 이해를 하면 된다.
다시 말해 이 표를 볼 때는 열 순서대로, 그리고 그 내부에서는 행 순서대로 보면 된다는 것이다.
(아니 이렇게 보니까, 조금 더 개발자적으로 보려면 행렬을 뒤집는 게 나았겠다.)
참고로 연결을 추적되고 있다면, 첫 패킷의 결과가 정해지면 다른 패킷들은 추가적인 평가 없이 바로 바로 적용된다.
규칙
그래서 체인을 구성한다는 그 규칙들은 어떻게 생긴 놈들인가?
룰은 구체적으로 조건과, 실행으로 이뤄진다.
어떤 ip에서 왔다면(조건), 그 패킷을 버려라!(실행)
당연한 말이다..ㅋㅋ
근데 iptables는 이걸 또 뭔가 참 안 와닿는 표현으로 표현한다.
매칭
이게 조건에 해당하는 표현이다.
규칙은 어떤 패킷을 대상으로 하는지 기준이 필요하다.
프로토콜 타입, 아니면 목적지나 소스 주소나 포트, 헤더 등.. 매칭 조건은 정말 유연하고 확장 가능하다.
어떻게 잘 설정할지는.. 사용자 마음! 이러니 안 어려울 수가 있나
타겟
기준에 맞는 대상이 나왔다면 어떤 동작을 할지도 정해야 한다.
크게는 두 가지 동작이 있다.
- 종료
- 여기에서 종료는 평가 종료이다.
- 그러니까, 그냥 네트워크 흐름을 탈 패킷을 훔쳐와가지고는 평가를 매기고 있는 상황인데, 이걸 그대로 돌려보낸다는 것을 말한다.
- 여기에서 종료 값에 따라서 다음 순서로 패킷이 갈지 버려질 지가 결정된다.
- 가령 prerouting 체인인데, mangle 테이블에서 종료가 결정되면 nat테이블의 체인에 가지 않고 패킷이 원래 흐름으로 돌아간다는 말이다.
- 비 종료
- 평가를 이어나간다.
- 위의 prerouting 단계 예시라면 mangle에서 비종료로 결정되어 nat의 룰까지 가서 또 종료할지 비종료할지 정하게 된다.
- 각 체인은 어느 단계에서는 무조건 종료를 하도록, 기본 정책이 세팅돼 있어서 언젠가는 종료된다.
근데 솔직히 이렇게만 개념을 이해하면 오히려 iptables를 사용하는데 더 헷갈리기만 한다.
한 테이블 내에서 적용할 수 있는 동작이 뭐가 있는지도 알 필요가 있다.
다음이 기본으로 제공되는 동작 타겟의 예시로, 적용할 수 있는 체인, 테이블에 제한이 있다는 것에 유의하자.
- ACCEPT -패킷 허용
- DROP - 패킷 폐기
- RETURN - 현재 체인 종료 후 이전 체인으로 복귀
- REJECT - DROP과 유사하되, 응답 메시지를 보냄
- LOG - 커널 로그에 기록
- DNAT - 목적지 IP/포트를 변경
- SNAT - 출발지 IP/포트를 변경
- MASQUERADE - SNAT 변형, 동적 IP에 적합
- REDIRECT - 로컬 머신 포트로 리다이렉트
- MARK - 패킷에 마킹값 설정
- QUEUE - 사용자 공간으로 패킷 전달 (NFQUEUE)
근데 왜 동작(action)이라 부르지 않고 타겟이라 부르는가?
위에서 체인 개념을 볼 때 커스텀 체인을 만들어서 해당 체인으로 패킷을 넘길 수 있다(점핑이라고 표현한다)고 했다.
규칙에는 조건에 매칭되는 패킷에 대해 타겟으로 체인을 지정할 수도 있다.
어떤 동작들에 대한 설정만이 아니라 어떤 체인으로 가야할지 대상을 정하기 때문에 Target이라고 부르는 것이다.
정리
이게 지금까지 말한 과정을 조금 더 자세하게 도식화한 그림이다.
처음에는 이게 뭔 소리인가 싶었는데, 조금 더 이해를 하고 보니 잘 보이는 것 같다.
이건 LoxiLB에 나온 iptables의 흐름 사진이다.
kube-proxy에서 어떻게 iptables 룰을 설정하고, 트래픽이 흐르는지에 대한 내용인데, 직관적이라 가져와봤다.
다른 툴
관련 문서
이름 | noteType | created |
---|---|---|
iptables | knowledge | 2024-12-30 |
kube-proxy | knowledge | 2025-02-12 |
2주차 - 네트워크 | project | 2025-02-25 |
8W - 가상머신 통합하기 | published | 2025-06-01 |
8W - 엔보이와 iptables 뜯어먹기 | published | 2025-06-01 |
9W - 앰비언트 모드 구조, 원리 | published | 2025-06-07 |
9W - 앰비언트 헬름 설치, 각종 리소스 실습 | published | 2025-06-07 |
E-iptables와 nftables의 차이 | topic/explain | 2024-12-30 |
E-이스티오의 데이터 플레인 트래픽 세팅 원리 | topic/explain | 2025-05-27 |
E-이스티오 DNS 프록시 동작 | topic/explain | 2025-06-01 |
E-이스티오 가상머신 통합 | topic/explain | 2025-06-01 |
E-앰비언트 ztunnel 트래픽 경로 분석 | topic/explain | 2025-06-07 |
참고
https://pr0gr4m.github.io/linux/kernel/netfilter/ 이 블로그 대박이다.. ↩︎
https://www.digitalocean.com/community/tutorials/a-deep-dive-into-iptables-and-netfilter-architecture ↩︎
https://thermalcircle.de/doku.php?id=blog:linux:nftables_packet_flow_netfilter_hooks_detail ↩︎
https://hayz.tistory.com/entry/번역-Iptables-및-Netfilter-구조에-대한-심층분석 ↩︎