UNIX/Redhat

[스크랩] iptables guide

99iberty 2015. 9. 7. 17:08


http://the1900.tistory.com/93



참고로 리눅스 커널버전 2.6.32 이다 2.6 아래 리눅스 커널이랑은 서로 약간 다르다.



iptables

-Netfilter Project에서 개발되었으며 2001년 리눅스 2.4커널부터 적용되었으며 주요기능으론 상태 추적, 패킷 애플리케이션 계층 검사 , 속도제한 등이있다


이식성과 특징

-리눅스 커널내부에서 동작하기 때문에 강력한 제어기능이 가능하고 NAT도 가능하다 



iptables architecture


iptables 에는 테이블이 존재하고 테이블에는 체인이 존재한다. 그리고 체인에는 적용할 룰이존재한다 즉 iptables > 테이블 > 체인 > 룰(정책) 이며 iptables 는 룰(규칙)집합 이라고할수있다

각각의 룰이 체인을 이루고 그체인들이 테이블에 속해있는것이다 


테이블(table)




filter table

-필터링을 적용하는 테이블로서 특정 rule(규칙)에 따라 패킷을 차단하거나 허용 하는역할을 하며 filter table은 디본적으로 INPUT, OUPUT, FORWARD 3개의 chain이 존재한다 


nat table

-필터링기능은 없지만 nat(주소변환)용으로 사용하며 외부에서 내부로 오는 패킷 포워딩, 내부에서 외부로 나갈때 다른 ip주소로 나가게 하는게 가능하다


mangle table

-TTL이나 TOS(type of service)같은 특수규칙을 적용하기 위해 사용된다 즉 패킷안에 데이터를 변환 또는 조작을 위한 테이블이다 


raw table

-필터 테이블의 Connection Tracking(연결추적) 기능을 좀더 자세히 다룰때 사용된다 특정 네트워크는 연결 추적에서 제외하는등의 추가 설정이 가능하며 conntrack 모듈보다 우선순위를 가진다


체인(chain)




  • 패킷이 이동하는 경로이다
  • 각각의 table은 각각의 다른 chain을 가지고있고 사용자 정의 chain생성 가능하다
  • iptables 정책 한개 라고 이해하면 된다
  • flter table은 기본적으로 INPUT(수신), OUTPUT(송신), FORWARD(경유) 체인이 존재한다
  • NAT table은 PREROUTING(라우팅전)과POSTROUTING(라우팅후) 체인이 추가로 존재한다


match(매치)



-쉽게 말하면 규칙을 적용할 대상이 되는 요소들과 옵션이다 예로는 아래의 목록이있다 


매치 

설명 

--source (-s) 

출발지 IP주소 또는ip/subnet 즉 네트워크  

--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) 

특정 모듈 사용 




target(타겟)




-매치를 통해 규칙을 적용할 대상을 선별했으니 행동이 필요하다 바로 타겟이다 


타겟 

설명 

ACCEPT 

패킷을 허용 

DROP 

패킷을 버린다(무시)->못받은걸로 처리 

LOG 

패킷을 syslog에 기록 

REJECT 

패킷을 버리고 버렸다고 응답해준다 즉 거절임(TCP는 Reset, UDP는 ICMP port Unreachabe 를 보낸다) 

RETURN 

체인내에서 패킷처리를 계속함 즉 재귀 



설치




-리눅스 커널에 포함이니 아마 거의 이미 설치되어있을 것이지만 root로 아래의 명령어를 실행해주자

yum update iptables 없다면 yum install iptables



명령어 형식(command format)




명령어 [command] [체인] [인터페이스] [출발지/목적지] [프로토콜] [포트] [상태] [타겟]


command 

설명 

 -A(--append)

 규칙을 순서대로 아래에 추가한다.

 -N(--new-chain)

 새로운 체인 생성

 -X(--delete-chain)

 체인 제거 인자가 없으면 전체

 -P(--policy) 

 체인 기본정책 변경

 -L(--list) 또는 -S

 체인의 규칙상태 보기

 -F(--flush)

 체인내의 모든 규칙 제거(방화벽 초기화)

 -Z(--zero) 

 체인내의 모든 규칙의 패킷과 바이트의 카운트를 0으로 초기화

 -D(--delete) 

 규칙을 삭제

-R(--replace)

 새로운 규칙으로 대체

 -I(--insert) 

 체인의 가장 처음에 규칙을 추가한다.

 -E(--rename-chain)

 체인의 이름을 변경한다.




주요파일 위치 및 정책 저장, 불러오기 



 파일 위치 및 명령어 

설명 

 service iptables save

 현재 정책을 기본으로 설정으로 재부팅시 자동시작되도록 한다

 iptables-save > [/path/filename]

 현재 정책을 지정 경로에 파일명으로 저장한다

 /etc/rc.d/init.d/iptables

 service 등록된 스크립트 이다

 /etc/sysconfig/iptables 

 자동으로 iptables 시작시 적용되는 기본 정책이다 

 정책이 정의된 쉘스크립트 파일 .sh

 755 권한을 chmod로 주고 실행하면 자동으로 정책이 적용 

 /etc/sysconfig/iptables-config

 모듈 관리및 설정 파일

/etc/sysctl.conf 

 ip포워딩같은 설정을 영구적용 가능하며

호스트전용 가용 포트번호 범위등도 여기에 설정된다

 /proc/sys/net/netfilter/

 현재 세션수, 최대 연결추적 갯수 설정등 각종 설정파일이 존재한다



iptables 켜기 , 끄기 service 명령어 


service iptables {start | stop | reload | restart | condrestart | status | panic | save}


현재 정책 상황 보기 및 출력



iptables -L     "모든 테이블에 대해 모든 정책 출력"
iptables -nL    "최근 정책 부터출력"
iptables -L --line-numbers    "정책 순서 번호도 같이 출력"
iptables -V     "버전 출력"
iptables -L     "체인명 해당 체인만 출력한다"
iptables -L  체인명 -t 테이블명   "해당 테이블의 해당 체인 만 출력"
iptables -L -t 테이블명   "해당 테이블만 출력" 
iptables -L -n    "포트번호 및 IP출력" 
iptables -L -v    "필터링된 패킷 바이트 출력" 


정책 만들기전에 수행할것 


iptables -F "모든 정책 초기화"
iptables -X "사용자 정의체인 전부 삭제"
iptables -P INPUT DROP "기본 수신 패킷 전부 차단"
iptables -P OUTPUT DROP "기본 솔신 패킷 전부 차단"
iptables -P FORWARD DROP "기본 경유 패킷 전부 차단" 
방화벽 정책을 만들기 전에 모든 패킷을 차단해놓고 만드는것이 좋다 이러한 방식이 white-list방식인데 허용하는것외에는 전부 차단하는것이 보안상 좋다 그반대는 black-list이다


iptables 주요파일 및 모듈 설명



m 옵션을 통해 모듈을 사용하기전에 먼저 모듈이 로드 되어잇어야한다






/sbin/modprobe [모듈명] 을 입력하면 모듈이 추가되고 정책을 설정할떄 m 으로 모듈을 사용할수있



그중 conntrack 모듈은 연결추적에 필요한 모듈인데 네트워크 연결 정보를 시스템이 기억하는것이다 이를통해 상태기반 방화벽이라던가 NAT, IP포워딩을 사용할수있다 


conntrack 모듈의 테이블을 구성하는 값은 2가지다.

- CONNTRACK_MAX : 커널 메모리 상에서 netfilter가 동시에 처리하는 세션의 수

- HASHSIZE : CONTRACK 엔트리의 리스트를 저장할 해쉬 테이블의 사이즈

kernel: ip_conntrack version 2.4 (8192 buckets, 65536 max) - 228 bytes per conntrack

netfilter의 conntrack 하나당 228 byte가 필요하며ㅡ 최대 65536개 만큼 처리가 가능하다는 뜻임




forward 모듈은 forward 테이블의 정책이나 ip포워딩 같은  NAT이용시 사용된다



/proc/sys/net 디렉토리 하위에 각종 파일들이 존재하는데 연결추적 최대량이라던가 IP포워딩같은 옵션을 여기서 지정할수있다 또한 로그도 볼수있다




※방화벽 정책 설정 가이드

1.방향 -패킷이 들어오는건지 나가는건지 경유하는건지

2.객체(IP/PORT) -식별할 대상(매치,match) 

3.액션 - 할 행동(target)

4.순서 - rule들의 순서 예를들어 특정 ip 2개를 제외하고 전부 허용하려할때 전부 허용하는걸 맨 먼저 적용하면 아래 2개 정책이 무효된다오 그래서 순서가 중요하오


정책 설정


#eth0장치로 icmp 패킷 수신 허용
iptables -A INPUT -i eth0 -p icmp -j ACCEPT
#수신을 해주었으니 발신(응답)도 해주어야한다
iptables -A OUTPUT -o eth0 -p icmp -j ACCEPT


아래는 설정 영상이다


참고로 iptables -nL  --line-numbers 를 사용하면 지우기 쉽게 정책 왼쪽에 숫자가 나온다


상태기반(stateful)  연결추적(Connection Tracking)



conntrack 모듈을 사용하고 옵션으로 -m state --state 버전이올라가면서-m conntrack --ctstate로사용한다

또한 비연결지향성인 UDP도 상태기반을 지원한다

상태는 4가지 종류가 있다 

  • NEW -새로운접속을만드는패킷
  • ESTABLISHED -존재하는접속에속하는패킷(즉, 응답패킷을가졌던것)
  • RELATED -기존의접속의부분은아니지만연관성을가진패킷으로. ICMP 에러나(FTP 모듈이삽입되어있으면) ftp 데이터접속을형성하는패킷.
  • INVALID -어떤이유로확인할수없는패킷: 알려진접속과부합하지않는ICMP 에러와'out of memory' 등을포함한다. 보통이런패킷은DROP 된다.

아래는 리눅스 기본 iptables 정책인데 정책 순서에 유의하면서 보자


#기존연결에 추가 연결이나 연관된 연결 허용
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#icmp 프로토콜 수신 허용
-A INPUT -p icmp -j ACCEPT
#로컬 장치 패킷 수신 허용
-A INPUT -i lo -j ACCEPT
#tcp 22포트 패킷 허용 ssh이다 putty, winscp 용
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
# 이외에 것들은 모든 패킷 수신 차단
-A INPUT -j REJECT --reject-with icmp-host-prohibited
#이외에 것들은 모든 패킷 경유 차단
-A FORWARD -j REJECT --reject-with icmp-host-prohibited


--reject-with icmp-host-prohibited[각주:1] 는 패킷 거부이유를 icmp 프로토콜  host-prohibited  메시지를 통해 알려주라는 것이다

또한 OUTPUT체인이 없는데 이는 상태기반이기떄문에 알아서 응답도 해주기 때문에 OUTPUT 체인은 따로 정책을 명시해주지 않아도 되는것이다



로깅 logging


허용이나 차단 규칙위에 존재해야한다


로그 옵션은 아래와같다

  • --log-prefix "로그이름" : 로그에이름지정(grep등으로필터하여보기편하도록)

  • --log-ip-options : IP 패킷내용중 Options의내용을 로그에 포함하도록지정

  • --log-tcp-options : TCP 패킷내용중 Options의내용을 로그에 포함하도록지정

  • --log-tcp-sequence : TCP 패킷내용중 순서Number/승인Number를 로그에 포함하도록지정

  • --log-level debug : 로그레벨 지정

바로위 상태기반 정책에 로그를 추가해보자


#로그는 항상 패킷 허용 차단 위에 존재해야한다 따라서 I 를 통해 맨위로 삽입한다
#icmp 패킷에 대해 log_icmp로 로그남기기
iptables -I INPUT -p icmp -j LOG --log-prefix "log_icmp"
# tail -f /var/log/messages | grep log_icmp 를통해 실시간 보기가능하다 
iptables -L --line-numbers
tail -f /var/log/messages | grep log_icmp 


영상을 통해 실시간 확인해보자 





정책 사전(작성중) NAT는 다음에...


 로컬 네트워크 장치


iptables -A INPUT -i lo -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT


 DNS

iptables -A INPUT -p udp -m udp --sport 53 -j ACCEPT

iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT


 ICMP (핑) 

iptables -A OUTPUT -o eth0 -p icmp --icmp-type echo-request -j ACCEPT

iptables -A INPUT -i eth0 -p icmp --icmp-type echo-reply -j ACCEPT

iptables -A OUTPUT -o eth0 -p icmp --icmp-type echo-reply -j ACCEPT


 SSH  (Winscp, Putty)

iptables -A INPUT -p tcp -m tcp --sport 22 -j ACCEPT

iptables -A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT


 HTTP, HTTPS

iptables -A INPUT -m state --state NEW -m tcp -p tcp -m multiport --dports 80,443 -j ACCEPT


 FTP


iptables -A INPUT  -p tcp -m tcp --sport 21 --dport 1024:65535 -j ACCEPT

iptables -A OUTPUT -p tcp -m tcp --sport 1024:65535 --dport 21 -j ACCEPT


iptables -A INPUT  -i eth0 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -j ACCEPT



 YUM

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



Reference

close

http://www.netfilter.org/documentation/ :Link

http://www.iptables.info/en/structure-of-iptables.html :Link

http://blog.daum.net/hypermax/6 :Link

http://webdir.tistory.com/170 :Link

학교 pdf 교제


close








  1. icmp-net-unreachable icmp-host-unreachable icmp-port-unreachable icmp-proto-unreachable icmp-net-prohibited icmp-host-prohibited or icmp-admin-prohibited (*) 등도 존재 [본문으로]