[Centos 7] Linux Iptables

2022. 11. 24. 17:30리눅스(Linux)

Iptables이란?  

   - Iptables란 Linux 운영체제에서 특정 IP주소에 대한 OS의 동작을 정의해 놓는 Kernel 프로그램이다.

 

   - 기본 User Level의 명령이지만, 동작 자체는 Kernel 단계에서 packet을 Filtering 하며 동작하게 된다.

 

   - Linux kernel은 기본적으로 "netfilter" 기능이 존재하며, 우리가 iptables를 사용하는 것은 실제로는 "netfilter"를 정의하는 행위가 된다.

 

   - Packet의 기본 구조는 Packet의 정보를 담고 있는 Header와 실제 packet의 내용이 담겨있는 Data로 구분된다, iptables는 Packet의 Header를 검사하여 Filtering을 진행 한다.

 

   - Iptables의 기본구조 ( "Table" -> "Chain" -> "Rule" ) 형식으로 구성

 

   - 주로 사용되는 Table은 Filter Table, NAT Table 2가지를 사용한다.

 

$ Iptables Table의 종류 

Filter Table  

   - 실제 packet Filtering을 적용하는 Table, rule에 따라서 packet을 허용 혹은 차단하는 역할을 진행한다. ( INPUT, OUTPUT, FORWARD 3가지 Chain을 갖는다 )

 

   - INPUT은 외부에서 방화벽으로 들어오는 packet을 담당하며, OUTPUT은 방화벽에서 나가는 packet을 담당한다.

 

   - FORWARD는 방화벽으로 들어오는 packet이 아닌, 방화벽 내부에 있는 또 다른 서버로 향하는 packet을 담당하여 Filtering을 진행한다.

 

   - INPUT, OUTPUT은 한대의 Linux Server에서 방화벽 과 다른 Service를 동시에 운영할 때 사용되고, FORWARD는 방화벽과 Service를 운영하는 Server가 다를 때 사용된다.

 

Nat Table

   - NAT 테이블은 Packet을 Filtering 하거나 특성을 변환하는 기능은 없다, 단지 방화벽으로 향하는 packet을 방화벽이 보호하는 내부 네트워크의 다른 주소로 Forwarding 하거나 방화벽 내부 네트워크에서 방화벽을 통해 외부 네트워크로 나갈 때 다른 주소로 변환시켜 주는 역할을 한다.

 

   - NAT Table은 POSTROUTING , PREROUTING 2가지 Chain을 주로 사용한다.

 

   - POSTROUTINGSource NAT (SNAT) Target 과 매칭되어 내부 네트워크에서 방화벽을 통해 외부로 나갈 때 사용, PREROUTIDestination NAT (DNAT) Target 과 매칭되어 주로 외부에서 방화벽 내부 서버로 향하는 packet을 방화벽이 보호하는 내부서버로 Forwarding 할 때 사용

 

   - POSTROUTING은 사무실 등에서 사설IP를 사용하면서 하나의 공인 IP로 인터넷을 공유하고자 할 때, PREROUTING은 사설 IP 를 이용한 서버를 운영하면서 외부로 Service 할 때 사용

 

Mangle Table

   - 자주 사용되지는 않지만 packet의 TTL이나 TOS 값을 변경 할 때 사용된다. ( 즉, packet의 특성을 변경할 때 사용되는 Table )

 

   - Mangle Table은 PREROUTING 과 OUTPUT 2가지 Chain으로 이루어져 있다, PREROUTING 방화벽으로 들어오는 packet에 대해 변경하고, OUTPUT은 내부에서 생성된 packet이 방화벽을 통해 나갈 때 변경한다.

 

Raw Table 

   - Filter 테이블의 Connection Tracking ( 연결추적 ) 기능을 좀더 자세히 다룰 때 사용된다.

 

   - 특정 네트워크는 연결 추적에서 제외 하는 설정이 가능하며 conntrack 모듈 ( 연결추적 모듈 )보다 우선순위를 가진다.

 

$ Iptables 명령어 사용 형식 

   - 기본 사용형식 ( "iptables [ -t table ] 명령어 [ Match option ] [ target ]" )

   

   - 테이블명은 생략이 가능하며, 생략 시 "filter Table이 기본값"으로 설정 된다.

 

   - iptables 작업시에는 반드시 "대소문자"를 구분하여 설정한다.

 

   - iptables는 "명령어, 설정파일" 설정 2가지 형식으로 룰을 정의 할 수 있다.

   

   - 명령어에 의한 룰설정은 "즉시적용", 설정파일을 이용 한 경우에는 "서비스를 반드시 재 시작"을 진행한다.

 

$ 명령어의 종류   

    - iptables에서 룰을 추가하거나 삭제 수정 등의 작업을 수행 할 명령어를 정의한다.  

 

-A ( --append ) : 새로운 규칙을 추가한다. ( "여러 개의 룰 중 가장 마지막 라인에 추가" )

-D ( --delete ) : 규칙을 삭제한다.

-I  ( --insert ) : 새로운 규칙을 삽입한다. ( "여러 개의 룰 중 가장 처음 라인에 추가" )

-L  ( --list ) : 규칙을 출력한다.

-F  ( --flush ) : chain으로부터 규칙을 모두 삭제한다.

-P  ( --policy ) : 기본정책을 변경한다.

-Z ( --zero ) : 모든 chain의 Packet과 바이트 카운터 값을 0 으로 만든다.

-N ( --new ) : 새로운 chain을 만든다.

-X ( --delete-chain ) : chain을 삭제한다.

-C ( --check ) : Packet을 테스트한다.

-R ( --replace ) : 새로운 규칙으로 교체한다.

 

$ Match Option 

   - iptables에서 Packet을 처리 할 때 만족해야 하는 조건을 지정한다. 

 

--source ( -s ) : 출발지 IP주소나 네트워크와의 Match

--destination ( -d ) : 목적지 ip주소나 네트워크와의 Match

--sport / --dport : 출발지 포트/목적지 포트를 Match

--protocol ( -p ) : 특정 프로토콜과의 Match ( "tcp, udp, icmp, !tcp = tcp가 아닌 나머지 프로토콜지정" )

--in-interface ( -i ) : 들어오는 Interface ( "시스템에 여러 개의 인터페이스가 존재할때만 사용" )

--out-interface ( -o ) : 나가는 Interface ( "시스템에 여러 개의 인터페이스가 존재할때만 사용" )

--tcp ( flag ) : TCP 6개의 Flag를 지정하여 Match ( "SYN, ACK, FIN, PSH, URG, RST" )

     - 비정상적인 패킷을 필터링 할 때 주로 사용

     - flag 지정 외의 ALL, NONE등의 옵션도 사용이 가능하다.

     - "--syn" 옵션의 경우 따로 사용도 가능하다.

--icmp-type ( ICMP Type & code ) : ICMP의 상태코드 및 Type을 지정하여 Match

     - echo-request, echo-reply 등의 타입과 상태코드를 지정 한다.

--match ( -m ) : 특정 모듈과의 Match

--limit ( Option ) : 지정한 시간 동안 최대 Match 횟수를 정의 한다.

      - 서비스 거부 공격을 어느정도 방어 할 수 있다. ( "하드웨어 성능이 좋을 경우에만 해당" )

      - 지정 시간 옵션 : /second, /minute, /hour, /day 

      - "--limit-burst" 옵션을 정의하여 초당, 분당, 시간당, 하루당 등에 매치될 수 있는 패킷의 수를 결정할 수 있다.

      - EX : -m limit --limit 5/m --limit-burst 10 -j LOG ( 10개 까지는 로그에 바로 기록, 이후에는 5분에 한 번씩 로그를 남긴다. )

      - EX : -m limit --limit 5/m --limit-burst 5 -j DROP ( 5분내의 5번째까지는 버리고, 이후에는 5분에 한번씩 버린다. )

--state : 연결 상태와의 Match

      - NEW : 새로운 연결을 요청하는 packet 

      - ESTABLISHED : 기존 연결의 일부인 packet

      - RELATED : 기존 연결에 속하지만 새로운 연결을 요청하는 packet, ( EX : FTP 접속포트는 21번,  데이터 전송 포트는 20번 혹은 1024번 이상의 랜덤 포트인 경우가 해당 된다 )

      - INVALID : 연결 추적 표에서 어디 연결에도 속하지 않은 packet 

      - EX : -m state --state RELATED

--string : 애플리케이션 계층 데이터 바이트 순서와의 Match

--comment : Kernel 메모리 내의 규칙과 연계되는 최대 256바이트 주석

--fragment ( -f ) : 두 번째 이후의 조각에 대해서 규칙을 명시한다.

--table ( -t ) : 처리될 테이블

--jump ( -j ) : 규칙에 맞는 Packet을 어떻게 처리할 것인가를 명시한다.

 

$ Target 

   - iptables는 Packet이 Match Option과 일치 할 때 취할 동작을 Target에서 정의한다. 

 

ACCEPT : Packet을 허용한다.

DROP   : Packet을 거부한다. ( "응답 메시지를 전송하지 않는다" )

REJECT : Packet을 거부하고 이와 동시에 적절한 응답 Packet을 전송 한다. ( "응답 메시지를 전송" )

LOG    : Packet을 syslog에 기록한다

 

$ IPTABLES 정책적용 실습

   - 모든 테이블에 모든 체인 정책 초기화 후 작업 진행 (NAT, Filter)

   - SSL 및 DNS는 정책만 적용 후 실테스트는 진행하지 않는다

   - 그 외 나머지는 테스트를 정상적으로 정책이 적용이 되었는지 확인

   - 4번, 5번의 경우 Match Option을 참조하여 설정

   - 기본 필터 정책의 경우 DROP으로 설정 후 작업진행

 

1. NAT(POSTROUTING)설정 및 XP에서 BT로 SSL(443) / SSH(22) 허용 

   - BackTrack SSH 시작 : root@bt:~# service ssh start

   - BackTrack SSH Key 설정 : root@bt:~# sshd-generate 

2. XP에서 BT로 ssh접속 연결은 허용, 반대로 XP로 접속은 안되게 설정

3. XP에서 외부 DNS ( "168.126.63.1" ) 서비스 가능하도록 설정

4. icmp로 통신하는 내용을 5번째 까지는 로그로 남기고, 이후에는 1분에 하나씩 로그남기게 설정 

5. icmp로 통신 시 5번까지는 차단, 이후에는 1분에 하나씩 막도록 설정

 

# iptables -t filter -L 
   - iptable 확인, chain부분만 잘 확인하면 성공 
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootps
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:bootps
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere            
INPUT_direct  all  --  anywhere             anywhere            
INPUT_ZONES  all  --  anywhere             anywhere            
DROP       all  --  anywhere             anywhere             ctstate INVALID
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination  

# iptables -t filter -D INPUT 5 
   - 5라인에 input 지우겠다.

# iptables -F 
   - iptables 초기화
   
# iptables -t nat -F 
   - nat 테이블 초기화

iptables -L
   - 라우팅테이블 확인
   
iptables -t filter -L
   - 필터라는 이름의 라우팅테이블 확인.
   
iptables -t filter -L --line
   - 필터라는 라우팅테이블 번호매겨서 출력.
   
iptables -t filter -D INPUT 5
   - 필터라는 테이블에 input5번째줄 삭제.
   
iptables -t nat -F
   - nat테이블 -F옵션으로 초기화

iptables -t nat -A POSTROUTING -s 192.168.206.0/24 -o ens34 -j MASQUERADE
   - iptables에 192.168.206.0/24 출발하면 ens34 인터페이스카드로 보내는 라우팅정보 입력 




# iptables -A INPUT -s 192.168.206.0/24 -p icmp --icmp-type echo-request -j ACCEPT
   - input 체인에 206.0대역의 icmp 요청을 허용
# iptables -A OUTPUT -d 192.168.206.0/24 -p icmp --icmp-type echo-reply -j ACCEPT
   - output 체인에 206.0대역의 icmp 응답을 허용

# iptables -A FORWARD -s 192.168.206.0/24 -p tcp --dport 80 -j ACCEPT 
   - 192.168.206.0/24 대역대로 오는 tcp 80번 포트 허용 
# iptables -A FORWARD -d 192.168.206.0/24 -p tcp --sport 80 -j ACCEPT 
   - 192.168.206.0/24 대역대로 가는 tcp 80번 포트 허용
# vi ./myfirewall.sh
#!/bin/bash 	

iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp --sport 80 -j ACCEPT

iptables -A FORWARD -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -p tcp --sport 22 -j ACCEPT

iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/m --limit-burst 5 -j LOG
   - limit burst(limit 적용되기 전까지 5횟수 log기록 남기고) limit정책(1분의 1개 주기)로 log기록 남기겠다.  

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT 
   - input체인에 에코 request 허용

iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT 
   - output체인에 에코 reply 허용	


# chmod +x ./myfirewall.sh  
# ./myfirewall.sh