[linux] Iptables & Filter logging

리눅스 패키지중 강력한 네트워크 패킷 필터링 도구인 iptables의 간단한 내용을 정리합니다..

제가 사용하는 개인서버에서는 아래와 같은 설정만을 이용합니다.

iptables 명령어를 이용하거나,  system-config-firewall   또는 스크립트를 생성하여 이용하기도합니다만

/etc/sysconfig/iptables 에 룰을 직접 지정하여 사용하는 것이 편할 수 도 있습니다.

 

아래 처럼 제가 사용하고 있는 샘플을 보시면, 개인 vpn 에 대해서는 모두 허용하고 그 외 모든 인터페이스에서

접근하는 패킷에 대해서는 INPUT Chain 에서 차단합니다.

 

해당 서버가 프록시, 메일, vpn, db 등으로 꾹꾹 눌러담아 사용하다보니 외부에서 의도적으로 접속하는 경우가 있는데요.

해당 부분에 대해서는 과도한 접근 시도를 확인하면, DROPLOG 라는 체인을 별도로 만들어서 해당 체인으로 점프 시킨 후 로그를 확인 하거나, 패킷을 드랍 시키는 용도로 사용하고 있습니다.

 

생성 시킨 로그는 별도 커스텀 로그로 생성하여 관리 할 수도 있는데 관련해서는 syslog 설정에 별도로 추가하여,  제가 따로 명시한 로그 프리픽스인 [Firewall] 을 필터로 /var/log/firewall.log 등으로 커스텀하게 생성할 수 있습니다.

생성 시 아래와 같은 형태로 로그를 남겨 필터링 할 수 있습니다.

아래 예시에서는 로그 프리픽스를 iptables denied 와 iptables VPN으로 생성하여 모니터링 한 예입니다.

 

방화벽 로그

[255434.143314] iptables denied: IN=eth0 OUT= MAC=06:3e:a8:fd:1b:86:06:dc:04:XX:XX:XX:XX SRC=1.2.3.4 DST=10.10.10.100 LEN=52 TOS=0x00 PREC=0x00 TTL=107 ID=19009 DF PROTO=TCP SPT=58139 DPT=25 WINDOW=8192 RES=0x00 SYN URGP=0 

 

[255982.927075] iptables VPN: IN=sunghovpn OUT= MAC= SRC=192.168.192.6 DST=10.10.10.100 LEN=64 TOS=0x00 PREC=0x00 TTL=64 ID=43356 DF PROTO=TCP SPT=51934 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0 

 

 

방화벽 설정

[root@mail ~]# cat /etc/sysconfig/iptables

# Firewall configuration written by system-config-firewall

# Manual customization of this file is not recommended.

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

-A INPUT -p icmp -j ACCEPT

-A INPUT -i lo -j ACCEPT

# LOG to VPN

# IF YOU NEED MONITORING , THIS OPTION ENABLE

#-A INPUT -m limit --limit 5/min -s 192.168.192.0/24 -j LOG --log-prefix "[Firewall] VPN: " --log-level 6

# BAN IP LIST

##############################################

# create RULE

-N DROPLOG 

# Input Drop IP rule

-A INPUT -s 185.125.6.105/32 -j DROPLOG

-A INPUT -s 50.243.196.29/32 -j DROPLOG

-A INPUT -s 120.92.233.86/32 -j DROPLOG

-A INPUT -s 197.14.14.150/32 -j DROPLOG

-A INPUT -s 203.198.207.61/32 -j DROPLOG

# Drop RULES logging and Drop

# IF YOU NEED DROP PACKET MONITORING, THIS OPTION ENABLE

#-A DROPLOG -m limit --limit 5/min -j LOG --log-prefix "[Firewall] Drop: " --log-level 6

-A DROPLOG -j DROP

##############################################

# FTP 

-A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT

# manage console with private key

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

# SMTP mail server 

-A INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT

# sungho POP3 port

-A INPUT -m state --state NEW -m tcp -p tcp --dport 110 -j ACCEPT

# sungho IMAP port 

-A INPUT -m state --state NEW -m tcp -p tcp --dport 143 -j ACCEPT

# sungho IMAPS port 

-A INPUT -m state --state NEW -m tcp -p tcp --dport 993 -j ACCEPT

# VPN for sungho

-A INPUT -m state --state NEW -m tcp -p tcp --dport 1234 -j ACCEPT

# Proxy for sungho

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3333 -j ACCEPT

# Database sunghoDB

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -s 10.10.10.0/24 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -s 192.168.192.0/24 -j ACCEPT

# FTP data transfer (Passive )

-A INPUT -m state --state NEW -m tcp -p tcp --dport 50020 -j ACCEPT

# Forward for interface

-A FORWARD -i sunghovpn -o eth0 -j ACCEPT

-A FORWARD -i eth0 -o sunghovpn -j ACCEPT

-A FORWARD -i sunghovpn -j ACCEPT

-A INPUT -i sunghovpn -j ACCEPT

 

# Another Input All deny with host not accepts message

-A INPUT -j REJECT --reject-with icmp-host-prohibited

COMMIT

 

 

 

1) 테이블(tables)

우선 iptables에는 테이블이라는 광범위한 범주가 있는데, 이 테이블은 filter, nat, mangle, raw 같은 4개의 테이블로 구성되며, 이중에서 우리에게 필요한 것은 필터링 규칙을 세우는 filter 테이블이다.

2) 체인(chain)

iptables에는 filter 테이블에 미리 정의된 세가지의 체인이 존재하는데 이는 INPUT, OUTPUT, FORWARD 이다. 이 체인들은 어떠한 네트워크 트래픽(IP 패킷)에 대하여 정해진 규칙들을 수행한다.

가령 들어오는 패킷(INPUT)에 대하여 허용(ACCEPT)할 것인지, 거부(REJECT)할 것인지, 버릴(DROP)것인지를 결정한다.

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

3) 매치(match)

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

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

4) 타겟(target)

iptables는 패킷이 규칙과 일치할 때 동작을 취하는 타겟을 지원한다.

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

REJECT는 서비스에 접속하려는 사용자의 액세스를 거부하고 connection refused라는 오류 메시지를 보여주는 반면 DROP은 말 그대로 telnet 사용자에게 어떠한 경고 메시지도 보여주지 않은 채 패킷을 드롭한다. 관리자의 재량껏 이러한 규칙을 사용할 수 있지만 사용자가 혼란스러워하며 계속해서 접속을 시도하는 것을 방지하려면 REJECT를 사용하는 것이 좋다.

5) 연결 추적(Connection Tracking)

iptables는 연결 추적(connection tracking)이라는 방법을 사용하여 내부 네트워크 상 서비스 연결 상태에 따라서 그 연결을 감시하고 제한할 수 있게 해준다. 연결 추적 방식은 연결 상태를 표에 저장하기 때문에, 다음과 같은 연결 상태에 따라서 시스템 관리자가 연결을 허용하거나 거부할 수 있다.

  • NEW : 새로운 연결을 요청하는 패킷, 예, HTTP 요청
  • ESTABLISHED : 기존 연결의 일부인 패킷
  • RELATED : 기존 연결에 속하지만 새로운 연결을 요청하는 패킷, 예를 들면 접속 포트가 20인 수동 FTP의 경우 전송 포트는 사용되지 않은 1024 이상의 어느 포트라도 사용 가능하다.
  • INVALID : 연결 추적표에서 어디 연결에도 속하지 않은 패킷

상태에 기반(stateful)한 iptables 연결 추적 기능은 어느 네트워크 프로토콜에서나 사용 가능하다. UDP와 같이 상태를 저장하지 않는 (stateless) 프로토콜에서도 사용할 수 있다.

6) 명령어(commond)

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

7) 기본 동작

  1. 패킷에 대한 동작은 위에서 부터 차례로 각 규칙에 대해 검사하고, 그 규칙과 일치하는 패킷에 대하여 타겟에 지정한 ACCEPT, DROP등을 수행한다.
  2. 규칙이 일치하고 작업이 수행되면, 그 패킷은 해당 규칙의 결과에 따리 처리하고 체인에서 추가 규칙을 무시한다.
  3. 패킷이 체인의 모든 규칙과 매치하지 않아 규칙의 바닥에 도달하면 정해진 기본정책(policy)이 수행된다.
  4. 기본 정책은 policy ACCEPT , policy DROP 으로 설정할 수 있다.

일반적으로 기본정책은 모든 패킷에 대해 DROP을 설정하고 특별히 지정된 포트와 IP주소등에 대해 ACCEPT를 수행하게 만든다.

 

 

글쓴이