KOROMOON

착한 사마리아인이 되고 싶습니다.

2/08/2020

리눅스 방화벽 iptables


( 1 ) iptables

강력한 패킷 필터링 툴이자 방화벽임.
리눅스 커널 2.4 버전부터 사용되는 iptables 는 ipchains 의 체인(Chain) 구조를 그대로 승계했지만 4 계층 구조의 테이블(Table)을 만들어 사용하여 이름을 iptables 라 명명함.
ipchains 와 거의 유사하게 체인에 정책을 설정하여 사용하지만 기능과 역할을 강화하기 위해 테이블로 확장하여 테이블 별로 각각의 체인을 지정하고 해당 체인에 정책을 설정하도록 되어 있음.
<Netfilter Components>

iptables 는 패킷 필터링을 직접적으로 수행하지 핞고 커널에 있는 netfilter 라는 모듈이 필터링을 수행함.
netfilter 는 리눅스가 제공하는 모든 종류의 패킷 필터링과 맹글링(mangling, 패킷을 토막내는 일) 도구로 네트워크 스택으로 함수를 후킹(hooking)하는데 사용할 수 커널 내부 프레임워크임.
iptables 는 패킷에 대한 필터링을 수행하게 설계된 함수를 네트워크 스택으로 후킹하기 위해 netfilter 프레임워크를 사용함.
즉, netfilter 는 iptables 가 방화벽 기능을 구현할 수 있게 프레임워크를 제공한다고 보면 됨.

홈페이지 : http://www.netfilter.org/



( 2 ) iptables 구조

다른 방화벽 프로그램에 비해 빠르고 강력하게 IP 패킷에 대한 제어가 가능하고 내부 트래픽도 덜 발생시킴.
iptables 를 이용하여 정책을 설정하여 들어와서는 안되는 패킷을 차단하고 통과하는 패킷은 목적지로 전송하거나 로컬 네트워크의 요구사항에 따라 적용됨.
iptables 의 정책은 정렬된 규칙 집합으로부터 생성되고 규칙은 특정 분류의 패킷에 대해 취해야 할 조치를 커널에게 알려줌.
하나의 iptables 규칙은 테이블 내에 있는 하나의 체인에 적용됨.
iptables 의 체인은 순서대로 공통적인 특징을 공유하는 패킷들과 비교되는 규칙 모임이라고 보면 됨.

iptables 는 Filter, Nat, Mangle, Raw 와 같은 4 개의 테이블(Table)이 있음.
Filter  - iptables 의 기본 테이블로 패킷 필터링을 담당
Nat     - Network Address Translation 약자로써 IP 주소를 변환시키는 역활
Mangle  - 패킷 데이터를 변경하는 특수 규칙을 적용하거나 성능 향상을 위한 TOS(Type of Service)를 설정
Raw     - 넷필터의 연결추적 하위시스템과 독립적으로 동작해야 하는 규칙을 설정
<iptables Chain>

규칙(Rule)은 Filter 테이블의 3 개의 체인(Chain)에 정책을 설정해야 함.
(아래 3 개의 체인은 기본적으로 설정되어 있는 체인이며 사용자가 체인을 임의적으로 생성할 수 있음)​
INPUT   - 외부에서 들어오는 패킷을 담당하는 체인
OUTPUT  - 외부로 나가는 패킷을 담당하는 체인
FORWARD - 외부에서 다른 시스템으로 전달되는 패킷을 담당하는 체인



( 3 ) iptables 명령어 실행 시 시스템에 적용되는 시기

iptables 명령어를 실행하면 재부팅하지 않더라도 즉시 시스템에 적용됨.
iptables -A INPUT -s 0/0 -j DROP 을 입력하면 그 즉시 모든 접속이 차단됨.
iptables -D INPUT -s 0/0 -j DROP 를 입력하면 그 즉시 접속 차단 명령이 삭제됨.
iptables -L 명령어가 시스템에 적용 중인지 확인 가능함.



( 4 ) iptables 규칙 순서

iptables 의 체인(Chain)에서는 먼저 등록된 규칙(Rule)이 효력을 발생하기 때문에 등록을 하는 순서가 중요함.
즉, 모든 것을 거부하는 설정이 먼저오게 되면 그 이후에 포트를 열어주는 설정이 와도 효과가 없음.
그러므로 허용하는 정책이 먼저 오고나서 거부하는 정책이 나중에 와야 함.

-A 옵션을 줌으로써 우리는 새로운 규칙을 체인의 맨 아래에 추가하게 됨.
즉, 체인의 상위 규칙이 먼저 작동하기 때문에 새로 추가하는 규칙이 먼저 작동시키기 위해서는 -I 옵션을 줌으로써 새로운 규칙을 원하는 위치에 놓을 수 있음.
예를 들어 INPUT 체인의 가장 위에 어떤 규칙을 놓고 싶다면 "-I INPUT 1" 을 입력하면 됨.

이미 위치된 규칙을 다른 위치로 바꾸고 싶다면 -R 옵션을 주면 됨.
다만 -I 옵션을 사용해서 1 의 위치에 놓으면 다른 규칙들이 밑으로 한 칸씩 내려가는 반면 -R 옵션을 사용해서 1 의 위치에 놓으면 그 위치의 규칙은 삭제됨.

규칙을 삭제하고 싶다면 -D 옵션과 숫자를 사용하면 되고 -L 옵션을 사용하면 모든 규칙의 목록을 보여주고 -F 옵션을 주면 해당 체인의 모든 규칙을 삭제함. 그리고 만약 체인을 명시하지 않았다면 모든 것으로 flush 할 것임.



( 5 ) iptables 기본 명령어

iptables -h 명령어로 확인할 수 있으며 좀더 자세한 정보를 원하시면 man iptables 로 확인하자!​

기본 명령어 형식 :
iptables -[AD] 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)

--append  -A chain                  규칙을 순서대로 아래에 추가
--delete  -D chain                  규칙을 삭제
--delete  -D chain rulenum          해당 번호의 규칙 삭제
--insert  -I chain [rulenum]        해당 번호에 규칙 삽입 (디폴트 1=first)
--replace -R chain rulenum          해당 번호의 규칙 변경
--list    -L [chain [rulenum]]      구체적인 전체 or 특정 체인 규칙 보기
--list-rules -S [chain [rulenum]]   간략하게 전체 or 특정 체인 규칙 보기
--flush   -F [chain]                전체 or 특정 체인의 모든 규칙 초기화
--zero    -Z [chain]                전체 or 특정 체인의 모든 규칙의 패킷, 바이트 카운트를 0 으로 초기화
--new     -N chain                  새로운 체인 생성
--delete-chain -X [chain]           특정 체인 삭제 (인자 없으면 전체 삭제)
--policy  -P chain target           대상 체인의 정책 변경
--rename-chain -E old-chain new-chain   체인 이름 변경



( 6 ) iptables 명령어 match 옵션

일반적으로 한 룰에서 매칭 옵션을 많이 지정하면 할수록 좀 더 세부적인 패킷을 지정하게 됨.

--proto         -p proto            프로토콜 이름 이나 숫자
--source        -s address[/mask]   출발지 IP/Subnet
--destination   -d address[/mask]   목적지 IP/Subnet
--in-interface  -i input name[+]    입력 인터페이스 (+ 와일드카드)
--out-interface -o output name[+]   출력 인터페이스 (+ 와일드카드)
--sport                             출발지 포트
--dport                             목적지 포트
--tcp-flags                         TCP 플래그
--syn                               SYN 플래그
--jump          -j target           규칙에 맞는 패킷의 행동
--goto          -g chain            jump to chain with no return
--match         -m match            특정 모듈 사용
--state                             연결 상태 (NEW, ESTABLISHED, RELATED, INVALID)
--numeric       -n                  numeric output of addresses and ports
--table         -t table            처리될 테이블 (디폴트 : filter)
--string                            어플리케이션 계층 데이터 바이트 순서
--comment                           주석 (최대 256 바이트)
--verbose       -v                  자세한 정보 표시
--line-numbers                      줄번호 출력
--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                  버전 표시



( 7 ) iptables 명령어 타겟(target)

iptables 를 이용한 규칙의 제일 마지막 부분인 타겟에 대한 설정 부분임.
임의의 조건에 대한 규칙이 매칭되는 패킷이 있을 경우 어떻게 처리할 것인지를 지정하는 부분이 바로 타겟이 됨.
'-j 타겟(target)' 형식으로 지정하면 됨.
아래 인수 목록이 타겟으로 옴.

ACCEPT   규칙에 매칭되는 패킷 허용
DROP     규칙에 매칭되는 패킷 거부
LOG      규칙에 매칭되는 패킷 로그로 저장
REJECT   규칙에 매칭되는 패킷 거부
         출발지 주소로 에러 메시지 발송
         (TCP - Reset, UDP - ICMP Port Unreachable)
RETURN   체인 내에서 패킷 처리를 계속함 (재귀)



( 8 ) iptables 규칙의 저장, 복원

규칙 저장
iptables-save > /root/firewall.rules
(원하는 위치에 규칙을 저장시킴)

규칙 복원
iptables-restore < /root/firewall.rules
(지정된 위치의 규칙을 복원함)



( 9 ) 사용 예제

방화벽 규칙 보기
iptables -L

기본 정책을 ACCEPT 으로 설정
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

기본 정책을 DROP 으로 설정
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

루프백 허용
iptables -A INPUT -i lo -j ACCEPT

특정 IP 허용
iptables -A INPUT -s xxx.xxx.xxx.xxx -j ACCEPT

특정 IP 차단
iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP

사설 IP 차단
(아래 중에서 이용하고 있는 사설 IP 대역이 있다면 해당하는 IP 대역이 있는 행을 지움)
iptables -A INPUT -s 10.0.0.0/8 -j DROP
iptables -A INPUT -s 172.16.0.0/16 -j DROP
iptables -A INPUT -s 192.168.0.0/16 -j DROP
iptables -A INPUT -s 224.0.0.0/4 -j DROP
iptables -A INPUT -s 240.0.0.0/5 -j DROP
iptables -A OUTPUT -d 10.0.0.0/8 -j DROP
iptables -A OUTPUT -d 172.16.0.0/16 -j DROP
iptables -A OUTPUT -d 192.168.0.0/16 -j DROP
iptables -A OUTPUT -d 224.0.0.0/4 -j DROP
iptables -A OUTPUT -d 240.0.0.0/5 -j DROP

IANA 예약 IP 대역 차단
iptables -A INPUT -s 0.0.0.0/8 -j DROP
iptables -A INPUT -s 169.254.0.0/16 -j DROP
iptables -A INPUT -s 192.0.0.0/24 -j DROP
iptables -A INPUT -s 248.0.0.0/5 -j DROP
iptables -A OUTPUT -d 0.0.0.0/8 -j DROP
iptables -A OUTPUT -d 169.254.0.0/16 -j DROP
iptables -A OUTPUT -d 192.0.0.0/24 -j DROP
iptables -A OUTPUT -d 248.0.0.0/5 -j DROP

주요 서비스 허용 (HTTP, FTP, MySQL 등)
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
iptables -A INPUT -p udp --dport 22 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 443 -j ACCEPT

뒤따라오는 연결은 허용
(참고 : 이걸 안하게 되면 네트워크간 접속이 원활하지 않게 됨)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT



TCP 연결 중 새로 들어오는 접속이 SYN 패킷이 아닌 것만을 허용
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

비정상인 TCP Flag 차단
iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL PSH,FIN -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL URG,PSH,FIN -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL SYN,ACK,FIN -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN,PSH -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN,RST -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN,RST,PSH -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN,ACK,RST -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL SYN,ACK,FIN,RST,PSH -j DROP
iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP
iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP

조각난 패킷 차단
iptables -A INPUT -f -j DROP

MAC 주소가 00-AA-BB-04-CC-B2 에서만 22번으로 접근 가능,
이외의 모든 MAC 주소를 가진 접근은 차단
iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source ! 00-AA-BB-04-CC-B2 -j DROP

참고로 iptables -nL --line-numbers 를 사용하면 지우기 쉽게 정책 왼쪽에 숫자가 나옴.
규칙을 만들 때 아래와 같이 4 가지 관점을 가지고 만들면 됨.
1. 방향          - 패킷이 들어오는건지 나가는건지 경유하는건지
2. 객체(IP/Port) - 식별할 대상(match)
3. 액션          - 행동(target)
4. 순서          - 규칙 순서



참고 사이트 :

Linux netfilter Hacking HOWTO
https://wiki.kldp.org/wiki.php/DocbookSgml/Netfilter-hacking-TRANS#NETFILTER

Linux / 설정 / iptables , netfilter 개념 사용법 예제 정리
http://xenostudy.tistory.com/245

iptables
http://man.kldp.net/wiki/ManPage/iptables.8

IPTABLES 이용하여 IP차단하기
http://ganzik.com/22826

리눅스 네트워크 방화벽 iptables guide
http://the1900.tistory.com/93

http://www.sersc.org/journals/JSE/vol8_no5_2011/7.pdf



============================================================
본 게시물은 KOROMOON 님께서 작성하였으며 CCL (Creative Commons License) 에서 "저작자표시-비영리-동일조건변경허락" 이용조건으로 자료를 이용하셔야 합니다.

댓글 없음:

댓글 쓰기