iptables란 프로토콜 상태 추적, 패킷 검사, 속도 제한, 필터링 정책 등을 리눅스에서 기본적으로 제공하는 기능이다.
주로 패킷 필터링
과 NAT
역할을 수행한다.
Docker에서 외부 네트워크와 통신하는데 중요한 역할을 한다.
Docker0가 여기에 등록되며 외부 네트워크가 Docker0로 찾아갈 수 있도록 iptables에 데몬을 등록한다.
패킷은 먼저 외부 네트워크에서 우리 리눅스 서버 라우터에 도달한다. 이 구간에서 공인IP를 사설IP로 바꾸어 주어 패킷을 우리 서버 내부에서 사용할 수 있도록 한다.
NAT란 IP 패킷에 적힌 소켓 주소의 포트 숫자와 소스 및 목적지의 IP 주소등을 재기록하면서 라우터를 통해 네트워크 트래픽을 주고 받는 기술이다.
NAT를 쓰는 이유는 여러 대의 호스트가 하나의 공인 IP 주소를 사용해 인터넷에 접속하기 위한 경우가 첫 번째이다.
외부에서 사설 네트워크의 IP주소를 모르기 때문에 직접적인 네트워크 공격을 하기 어려워진다.
두 번째는 첫 번째와 비슷한 이유로 부족한 IPv4주소 체계에서 다양한 노드를 네트워크에 연결하기 위해 사설망을 사용할 때 게이트웨이로 사용하기 위함이다.
iptables <-t 테이블이름> 명령어 룰 <타켓>
filter
: 기본으로 적용되는 테이블로 INPUT, OUTPUT, FORWARD라는 세가지 체인을 가지는데, 모든 패킷은 이 세가지 체인을 통과한다.
INPUT
: 외부에서 방화벽으로 들어오는 모든 패킷. inboud
OUTPUT
: 방화벽에서 나가는 모든 패킷. outboud
FORWARD
: 방화벽내의 다른 서버로 패킷을 전달
nat
: NAT에는 POSTROUTING과 PREROUTING이라는 두 가지 체인을 사용한다.
POSTROUTIN
: 방화벽 내부의 사설 IP를 사용하는 호스트의 패킷을 공인 IP 주소로 변 환하여 외부로 전달하는 공유기 역할
PREROUTING
: 외부에서 방화벽으로 들어오는 패킷을 내부네트워크의 사설IP 주소를 사용하는 서버로 전달. 사설망에서 인터넷 서버를 운영할 경우 사용.
-p : protocol, tcp, udp, icmp 등을 지정. !를 이용해 특정 프로토콜을 제외
-s : source IP 주소나 네트워크의 IP 대역
-d : destination IP 주소나 네트워크의 IP 대역
-i : 패킷을 받는 네트워크 인터페이스
-o : 패킷이 나가는 네트워크 인터페이스
--{s,d} port : 패킷의 source port 또는 destination port --icmp-type : ICMP 패킷의 type을 설정
--limit : DoS 공격을 차단할 목적으로 사용되며 특정 시간동안 최대 미칭 회수를 정의함. 지정시간 은 second, minute, hour, day등이 있으며 10/minute인 경우 분당 최대 10회의 매칭을 의미
-m state : 상태추적을 할 때 사용. state에는 NEW ,ESTABLISHED, RELATED, INVALID를 지정할 수 있음.
- NEW : 새롭게 연결을 설정할 때의 상태
- ESTABLISHED : 이미 연결되어 있는 상태
- RELATED : 연결은 되었으나 중간에 포트가 바뀌는 상태(FTP)
- INVALID : 연결이 설정되지 않는 상태