IPTABLES 옵션 정리

 

하기와 같이 -h 옵션을 주면 설정방법이 자세히 나와있습니다. 양이 좀 많지만 자주 사용하는 옵션으로 iptables 의 설정방법을 알아보겠습니다.

$ iptables -h
iptables v1.4.7

Usage: iptables -[ACD] chain rule-specification [options]
       iptables -I chain [rulenum] rule-specification [options]
       iptables -R chain rulenum rule-specification [options]
       iptables -D chain rulenum [options]
       iptables -[LS] [chain [rulenum]] [options]
       iptables -[FZ] [chain] [options]
       iptables -[NX] chain
       iptables -E old-chain-name new-chain-name
       iptables -P chain target [options]
       iptables -h (print this help information)

Commands:
Either long or short options are allowed.
  --append  -A chain            Append to chain
  --check   -C chain            Check for the existence of a rule
  --delete  -D chain            Delete matching rule from chain
  --delete  -D chain rulenum
                                Delete rule rulenum (1 = first) from chain
  --insert  -I chain [rulenum]
                                Insert in chain as rulenum (default 1=first)
  --replace -R chain rulenum
                                Replace rule rulenum (1 = first) in chain
  --list    -L [chain [rulenum]]
                                List the rules in a chain or all chains
  --list-rules -S [chain [rulenum]]
                                Print the rules in a chain or all chains
  --flush   -F [chain]          Delete all rules in  chain or all chains
  --zero    -Z [chain [rulenum]]
                                Zero counters in chain or all chains
  --new     -N chain            Create a new user-defined chain
  --delete-chain
            -X [chain]          Delete a user-defined chain
  --policy  -P chain target
                                Change policy on chain to target
  --rename-chain
            -E old-chain new-chain
                                Change chain name, (moving any references)
Options:
[!] --proto     -p proto        protocol: by number or name, eg. `tcp'
[!] --source    -s address[/mask][...]
                                source specification
[!] --destination -d address[/mask][...]
                                destination specification
[!] --in-interface -i input name[+]
                                network interface name ([+] for wildcard)
 --jump -j target
                                target for rule (may load target extension)
  --goto      -g chain
                              jump to chain with no return
  --match       -m match
                                extended match (may load extension)
  --numeric     -n              numeric output of addresses and ports
[!] --out-interface -o output name[+]
                                network interface name ([+] for wildcard)
  --table       -t table        table to manipulate (default: `filter')
  --verbose     -v              verbose mode
  --line-numbers                print line numbers when listing
  --exact       -x              expand numbers (display exact values)
[!] --fragment  -f              match second or further fragments only
  --modprobe=<command>          try to insert modules using this command
  --set-counters PKTS BYTES     set the counter during insert/append
[!] --version   -V              print package version.

IPTABLES 에는 filter 테이블에 미리 정의된 3가지 체인(아래)이 존재합니다.
이 체인들은 어떠한 네트워크 트래픽에 대하여 정해진 규칙들을 수행합니다.

  • Chain INPUT (policy ACCEPT) : 호스트를 향한 모든 패킷
  • Chain FORWARD (policy ACCEPT) : 호스트 컴퓨터가 목적지가 아닌 모든 패킷, 즉 라우터로 사용되는 호스트 컴퓨터를 통과하는 패킷
  • Chain OUTPUT (policy ACCEPT) : 호스트 컴퓨터에서 발생하는 모든 패킷


1. iptables 명령어(command)

  • -A (–-append) : 새로운 규칙을 추가
  • -C (–check) : 패킷을 테스트
  • -D (–delete) : 규칙을 삭제
  • -F (–flush) : chain 으로 부터 규칙을 모두 삭제
  • -I (–Insert) : 새로운 규칙을 삽입
  • -L (–list) : 규칙을 출력
  • -N (–new) : 새로운 chain을 만듬
  • -P (–policy) : 기본정책을 변경
  • -R (–replace) : 새로운 규칙으로 교체
  • -X (–delete-chain) : chain 을 삭제
  • -Z (–zero) : 모든 chain의 패킷과 바이트 카운터 값을 0으로 만듬


2. 매치(match)

iptables에서 패킷을 처리할 때 만족해야 하는 조건을 가리킵니다.
즉, 이 조건을 만족시키는 패킷들만 규칙을 적용합니다.

  • -s (–source) : 출발지 IP주소나 네트워크와의 매칭
  • -d (–destination) : 목적지 IP주소나 네트워크와의 매칭
  • -p (–protocol) : 특정 프로토콜과의 매칭
  • -i (–in-interface) : 입력 인터페이스
  • -o (–out-interface) : 출력 인터페이스
  • –state : 연결상태와의 매칭
  • –comment : 커널 메모리 내의 규칙과 연계되는 최대 256바이트 주석
  • -y (–syn) : SYN 패킷을 허용하지 않음
  • -f(–fragment) : 두번째 이후의 조가게 대해서 규칙을 명시한다.
  • -t (–table) : 처리될 테이블
  • -j (–jump) : 규칙에 맞는 패킷을 어떻게 처리할것인가를 명시한다.
  • -m (–match) : 특정 모듈과의 매치


3. 타겟(target)

iptalbes에서 패킷이 규칙과 일치할 때 동작을 취하는 타겟을 지원합니다.

  • ACCEPT : 패킷을 받아들임.
  • DROP : 패킷을 버림 (패킷전송이 없었던 것 처럼)
  • REJECT : 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송
  • LOG : 패킷을 syslog에 기록
  • RETURN : 호출 체인 내에서 패킷 처리를 지속함


4. config 파일에 등록

config 파일에 등록을 하게 되면 서버 재부팅시 또는 iptables 을 재기동시 config 에 있는 설정값으로 셋팅되게 됩니다.

CentOS

$ vi /etc/sysconfig/iptables

Ubuntu

$ vi /etc/iptables.rules


5. 자주사용하는 iptables command

cli 모드에서 command 를 입력하여 바로 적용시킬 수 있습니다. 서버에서 docker 를 사용할 경우 iptables 을 재기동하게 되면 network 설정이 꼬이게 되는데 그럴 때 이와 같은 방법으로 적용 할 수 있습니다.

# 적용상태 확인
$ iptables -nvL --line-numbers
# 특정 IP 차단
$ iptables -I INPUT -s xxx.xxx.xxx.xxx -j DROP

# 특정 IP 허용
$ iptables -I INPUT -s xxx.xxx.xxx.xxx -j ACCEPT
# 특정 Port 차단
$ iptables -A INPUT -p tcp --dport xxxx -j DROP

# 특정 IP / Port 허용
$ iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx --dport xxxx -j ACCEPT
# 특정 IP/Port 를 7번째 룰에 추가
$ iptables -I INPUT 7 -s xxx.xxx.xxx.xxx  -p tcp --dport 8080 -j ACCEPT

# 7번째 룰 삭제
$ iptables -D INPUT 7
# INPUT chain 에 state 모듈 상태가 New 이고 프로토콜이 tcp 이고 목적지 port 가 8088 인 패킷에 대한 허용추가
$ iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 8088 -j ACCEPT

# 규칙삭제
$ iptables -D INPUT -p tcp -s xxx.xxx.xxx.xxx --dport xxxx -j ACCEPT
# 적용된 규칙 전부 삭제
$ iptables --flush