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