강좌
클라우드/리눅스에 관한 강좌입니다.
해킹&보안 분류

iptables 설치 및 커널 설정

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

iptables 설치 및 커널 설정

 

 

 

이제 직접 방화벽 관리 프로그램인 iptables를 설치해 보도록 하자. 방화벽은 커널 수준에서 작동하기 때문에 먼저 커널에서 방화벽이 작동할 수 있도록 설정되어야 한다.

 

 

 

 

 

 

최근 사용되는 대부분의 배포판에서는 기본적인 iptables 기능을 제공하고 있어 별도의 커널 컴파일을 하지 않아도 사용은 가능하다.

 

 

 

 

 

 

하지만 고급 기능을 이용하기 위해서 가능하다면 커널을 컴파일 할 것을 권장한다.

 

 

 

 

 

 

커널컴파일을 하기 위해 커널 소스 디렉토리인 /usr/src/linux로 이동 후

“make menuconfig”를 실행한 다음

 

 

커널 2.4.x 버전이라면

 

Networking options ---> 를 선택 후 IP: Netfilter Configuration --->”를 선택한다.

 

 

 

 

 

 

커널 2.6.x 버전이라면

 

Networking --->를 선택 후 Networking options --->에서

[*] Network packet filtering framework (Netfilter) --->”를 선택하여 하위 메뉴를

선택하여 지정하면 된다.

 

iptables에서 제공하는 여러 가지 기능만큼 많은 선택항목이 있는데, 2.6.x 버전에서 iptables를 최대한 활용하기 위해 꼭 필요한 몇 가지의 항목만을 살펴보자.

 

 

커널 2.4.x에는 “IP: Netfilter Configuration ”에서 일괄 설정 가능하고 2.6.x 는 아래와 같이 두개의 메뉴로 나누어져 있다.

 

 

 

 

 

Core Netfilter Configuration --->

[*] Netfilter connection tracking support

[*] FTP protocol support

[*] "connlimit" match support"

[*] "length" match support

[*] "limit" match support

[*] Multiple port match support

[*] "state" match support

[*] "string" match support

 

IP: Netfilter Configuration --->

[*] IPv4 connection tracking support (required for NAT)

[*] IP tables support (required for filtering/masq/NAT)

[*] IP range match support

[*] recent match support

[*] Packet filtering

[*] Reject target support

[*] LOG target support

[*] Full NAT

[*] MASQUERADE target support

[*] Packet mangling

[*] TOS target support

[*] TTL target support

 

 

위 메뉴는 커널 2.6.x 버전을 기준으로 한 메뉴이므로 커널 버전에 따라 다소 다를 수 있다.

 

 

 

 

그리고 메뉴에서 각각의 기능을 선택할 때 모듈로 선택해도 되지만 위와 같이 Static하게 선택하여 커널에 정적으로 포함시키는 것이 좋다.

 

 

 

 

 

각각 위에서 선택한 항목들에 대해 간단히 알아보자.

 

 

Netfilter connection tracking support

"state" match support

IPv4 connection tracking support (required for NAT)

 

 

 

앞에서 언급한 바와 같이 최근 진보된 방화벽에서 기본적으로 제공하고 있는 상태추적에 대한 제공여부를 선택하는 부분이다.

 

 

 

 

방화벽을 통해 어떠한 패킷이 통과했는지의 기록을 메모리에 보관하고 유효한 패킷인지 등에 대해 검사하는 기능으로서 이 기능은 NAT나 마스커레이딩을 이용할 때에도 필요하다.

 

 

 

 

꼭 선택하도록 한다.

 

 

 

FTP protocol support

 

FTP는 다른 프로토콜과 달리 두개의 포트(control / data port)가 두 가지 방식(active/passive) 으로 복잡하게 작동하므로 별도의 FTP 연결 추적기능이 필요하다.

 

 

 

 

이에 대해서는 뒤에서 다시 알아보도록 하겠다.

 

 

 

 

FTP는 많이 사용되므로 선택하도록 한다.

 

 

 

 

만약 ftp로 기본포트인 21/tcp가 아닌 다른 포트로 사용하고자 한다면 이 부분을 모듈(Module)로 선택하여야 한다.

 

 

 

 

자세한 내용은 뒤에서 다시 살펴보기로 하자.

 

 

 

"connlimit" match support"

 

 

connection에 대한 제한을 ip별 또는 ip대역별로 제한할 수 있는 기능으로서 dos 공격등을 차단하고자 할 때 유용하다.

 

 

 

 

일부 버전에서는 기본으로 포함되어 있지 않아 p-o-m 패치를 하여야 보일 수도 있다.

 

 

 

 

아래에서는 connlimit에 대한 예를 보여주고 있다.

 

 

 

 

 

 

iptables -A INPUT -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT

 

 

 

위의 경우 한 클라이언트 IP에서 동시에 telnet 접속을 2회로 제한하는 설정이며 이외의 접속은 REJECT하게 된다.

 

 

 

 

IP에서의 접속 제한이므로 다른 IP에서는 접속이 가능하다.

 

 

 

 

또는 not의 의미인 !를 이용하여 아래와 같이 표현해도 같은 의미가 될 것이다.

 

 

 

 

 

 

iptables -p tcp --syn --dport 23 -m connlimit ! --connlimit-above 2 -j ACCEPT

 

 

 

물론 이 기능은 시스템에서 제공하는 PAM 설정(/etc/security/limits.conf)을 이용해도 구현할 수 있다.

 

 

 

 

 

IP뿐만 아니라 IP 대역으로 제한할 수도 있다.

 

 

 

 

아래의 경우 mask 24라고 하였으므로 한 C Class당 웹 접속을 동시 16개로 제한하는 것이다.

 

 

 

 

 

 

iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24 -j REJECT

 

 

 

이를 활용한다면 짧은 시간에 비정상적으로 많은 접속을 시도하는 서비스거부 공격 등을 차단하는데 효과적일 것이다.

 

 

 

 

"length" match support

 

 

패킷의 사이즈별로 차단할 수 있는 기능을 제공한다.

 

 

 

 

 

이를테면 53/udp로 들어오는 트래픽에 대해 패킷사이즈가 512byte 이상인 트래픽은 차단할 수 있다.

 

 

 

 

iptables -A INPUT -p udp --dport 53 -m length --length 512:65535 -j DROP

 

 

“limit” match support

 

 

룰에 매칭되는 개수나 비율을 제한할 수 있는 기능으로 서비스거부공격을 차단하거나 불필요한 로그를 일일이 남기지 않도록 하고자 할 때 유용하다.

 

 

 

 

이를테면 아래의 경우 inbound 되는 tcp 에 대해 SYNFIN이 함께 보일 경우 관련된 모든 패킷정보를 로그에 남기는 것이 아니라 분당 최대 5개까지만 남기도록 한다는 의미이다.

 

 

 

 

 

 

iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/minute -j LOG

 

 

Multiple port match support

 

iptables에서는 기본적으로 한 줄에 하나의 포트를 지정할 수 있지만 만약 여러 개의 포트를 지정해야 할 경우 룰이 그만큼 많아지고 복잡해지므로 비효율적이다.

 

 

 

 

따라서 아래와 같이 사용할 수 있다면 룰도 간소화되고 편리할 것이다.

 

 

 

 

 

iptables -A INPUT -p tcp -m mport --dports 21,1001:1004,8080 -m state --state NEW -j ACCEPT

 

 

참고로, 버전에 따라 mportmultiport가 각기 사용될 수 있는데, 차이점은 아래와 같다.

 

 

 

 

 

 

[*] Multiple port match support ==> CONFIG_IP_NF_MATCH_MULTIPORT

: 단일 포트만 사용할 수 있는 옵션으로 기본커널에 있다.

 

 

 

 

 

: 80,8080,1000

 

[*] Multiple port with ranges match support ==> CONFIG_IP_NF_MATCH_MPORT

: 단일포트와 range를 함께 사용할 수 있는 것으로 버전에 따라 POM 패치를 하여야 한다.

 

 

 

 

 

: 80,8080,1000:2000

 

"string" match support

 

string 기능을 선택하면 iptables 방화벽을 통과하는 패킷에 대해 Layer7 수준에서 패킷에 대한 제어가 가능하다.

 

 

 

 

뒤에서 p2p 트래픽 등을 제어하고자 할 때 유용하게 활용할 수 있는데, 이를테면 단순히 아래와 같이 실행하는 것만으로도 MSN 메신저의 사용을 차단할 수 있다.(자세한 내용은 뒤에서 다룬다.)

 

iptables -A FORWARD -m string -- string "messenger.msn.com" -j DROP

 

IP tables support (required for filtering/masq/NAT)

 

iptables를 지원하는지에 대한 설정이다.

 

 

 

 

반드시 선택한다.

 

 

 

 

 

 

IP range match support

 

 

앞에서 살펴본 multiport와 같이, 정책 설정 시 여러 ip를 지정하고자 할 때 유용하게 사용할 수 있는 것으로 이를테면, 아래와 같은 경우 192.168.1.10부터 192.168.1.20까지 oracle1521/tcp로 접근을 허용하는 룰을 보여주고 있다.

 

 

 

 

 

만약 이 기능이 지원되지 않는다면 11개의 룰을 일일이 지정해 주어야 할 것이다.

 

 

 

 

 

 

iptables -A INPUT -p tcp -m iprange --src-range 192.168.1.10-192.168.1.20 --dport 1521 -m state --state NEW -j ACCEPT

 

 

일반적으로 특정 IP 대역에 대해서는 -s 192.168.1.0/24와 같이 CIDR 형식으로 표현하는데, 만약 CIDR로 표현할 수 없는 IP 대역의 경우에 iprange를 사용하면 효과적이다.

 

 

 

만약 목적지 IP 대역에 대해 지정하려면 “-m iprange --dst-range” 를 지정하면 되는데 소스와 목적지 모두 여러 ip 대역인 경우에는 --src-range--dst-range를 함께 사용해도 된다.

 

 

 

 

 

 

recent match support

 

 

최근에 사용된 주소를 기반으로 룰을 생성할 수 있는 기능으로 여러 가지 흥미있는 기능을 이용할 수 있다.

 

 

 

 

이를테면 아래의 룰은 1개의 ip에서 25/tcp10개 이상의 동시 접속이 있을 경우 해당 ip5(300)동안만 차단하는 기능이다.

 

 

 

 

 

iptables -A INPUT -m recent --name badguy --rcheck --seconds 300 -j DROP

iptables -A INPUT -p tcp --syn --dport 25 -m connlimit --connlimit-above 10 -m recent --name badguy --set -j DROP

 

 

이 기능은 뒤에서 살펴볼 port knocking등에서 사용되는데 자세한 내용은 홈페이지(http://snowman.net/projects/ipt_recent/)를 참고하기 바란다.

 

 

 

 

 

 

Packet filtering

 

방화벽의 기본기능인 패킷필터링에 대해 정의하는 메뉴이다.

 

 

 

 

filter 테이블내 INPUT, FORWARD, OUTPUT chain을 통해 패킷 필터링 기능을 제공하므로 반드시 선택한다.

 

 

 

 

 

 

Reject target support

 

 

패킷을 차단하는 방식에는 패킷을 차단 후 아무런 응답 패킷도 발송하지 않는 DROPicmp 에러코드를 발송하는 REJECT가 있는데 이는 REJECT를 사용하도록 하는 기능이다.

 

 

 

 

 

방화벽에서 DROPREJECT는 매우 중요한 의미가 있는데, 이에 대해서는 뒤에서 알아보도록 한다.

 

 

 

 

선택하도록 한다.

 

 

 

 

 

LOG target support

 

iptables룰에 매칭이 되었을 때 관련 패킷에 대해 로그를 남기도록 하는 메뉴이다.

 

 

 

 

이를테면 아래와 같이 설정하면, eth0을 통해 10.x.x.x을 소스로 들어오는 패킷에 대해서는 log를 남기게 된다.

 

 

 

 

 

 

iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j LOG

 

 

 

Full NAT

 

 

masquerading이나 port forwarding nat 기능을 사용하고자 할 때 선택한다.

 

 

 

 

물론 서버에서 단독으로 사용할 경우에는 nat가 불필요하므로 선택하지 않아도 된다.

 

 

 

 

 

 

MASQUERADE target support

 

 

nat의 한 가지 case인 마스커레이드를 사용하고자 할 때 사용하는 것으로 유동ip를 할당받는 환경에서 nat를 구현할 때 필요하다.

 

 

 

 

 

 

 

Packet mangling

 

 

mangle테이블을 사용하여 패킷의 TOS 값 등을 지정할 수 있도록 제공하는데, 선택하도록 한다.

 

 

 

 

 

 

TOS target support

 

 

라우팅 전에 IP 패킷의 TOS 값을 지정할 수 있도록 제공한다.

 

 

 

 

선택한다.

 

 

 

 

 

 

TTL target support

 

 

이 설정을 선택하면 시스템의 초기 TTL 값을 지정할 수 있다.

 

 

 

 

이를테면 시스템에 ping 요청을 할 경우 시스템마다 고유한 TTL 값으로 응답한다는 특성을 이용하여 원격지 OS등을 추측할 수 있는데, 이 값을 OS 마다 고유한 값이 아닌 임의의 값으로 지정함으로써 이러한 시도를 차단할 수 있다.

 

 

 

# ping www.server.com

PING server.com (192.168.3.2) from 192.168.4.5 : 56(84) bytes of data.

64 bytes from www.server.com (192.168.3.2): icmp_seq=0 ttl=63 time=0.4 ms

64 bytes from www.server.com (192.168.3.2): icmp_seq=1 ttl=63 time=0.2 ms

64 bytes from www.server.com (192.168.3.2): icmp_seq=2 ttl=63 time=0.3 ms

 

 

 

이를테면 www.server.com이라는 리눅스 서버에 ping을 실행하였을 경우 위와 같이 ttl=64부터 시작하여 ttl (라우터)1 떨어진 곳에서 ping을 하여 ttl 값이 64-1=63이라는 것을 알 수 있는데, 아래와 같이 임의의 값인 126으로 설정한 후 ping을 실행하자, ttl 값이 126에서 1을 뺀 125로 변경된 것을 알 수 있다.

 

 

 

 

물론 홉이 3 떨어진 곳에서 ping을 하였다면 126-3=123이 될 것이다.

 

 

 

 

ttl 뿐만 아니라 다른 방법으로도 원격지 OS를 판별할 수는 있지만 단지 TTL 값을 변경하는 것만으로도 일정 정도 원격지 OS 스캔 시도 시 결과 값을 위조할 수 있다는 장점이 있다.

 

 

 

 

참고로 기본 ttl값은 OS버전마다 다소의 차이는 있지만 통상적으로 라우터 등의 장비는 255, Windows 계열은 128, 리눅스 등의 계열은 64이다.

 

 

 

 

# iptables -t mangle -A OUTPUT -j TTL --ttl-set 126

 

# ping www.server.com

PING www.server.com (192.168.3.2) from 192.168.4.5 : 56(84) bytes of data.

64 bytes from www.server.com (192.168.3.2): icmp_seq=0 ttl=125 time=0.4 ms

64 bytes from www.server.com (192.168.3.2): icmp_seq=1 ttl=125 time=0.3 ms

64 bytes from www.server.com (192.168.3.2): icmp_seq=1 ttl=125 time=0.3 ms

 

 

 

 

커널 2.4의 경우 “Connection tracking match support” 2.6에서의

"conntrack" connection tracking match support“ 메뉴는 상태 추적 시

NEW,ESTABLISHED,RELATED 뿐만 아니라 ASSUREDSEEN_REPLY등 추가적인 상태 추적을 하고자 할 때 사용되는데, 이는 “cat /proc/net/ip_conntrack”를 실행해 보면 알 수 있다.

 

 

 

 

이 확장된 기능은 별로 사용하지 않으므로 선택하지 않아도 된다.

 

 

 

 

 

 

아래는 “cat /proc/net/ip_conntrack”를 실행하였을 때의 한 예이다.

tcp 6 423650 ESTABLISHED src=222.101.103.66 dst=211.47.68.72 sport=3753 dport=80 src=211.47.68.72 dst=222.101.103.66 sport=80 dport=3753 [ASSURED] use=1

 

 

 

 

위와 같이 선택한 후 커널을 재 컴파일 하여 시스템을 재부팅 한 후 새로운 커널로 적용 하도록 한다.

 

 

 

 

 

그리고 이전의 iptables rpm이 설치되어 있다면 rpm -e iptablesrpm을 삭제한 후(만약 배포판에 따라 의존성 에러가 날 경우 --nodeps 옵션을 주어 삭제하도록 한다.)

 

 

 

 

iptables 홈페이지인 http://www.netfilter.org/에서 최신버전의 iptables 프로그램을 다운로드 받아 압축 해제 후 make; make install로 컴파일 하여 설치를 하면 /usr/local/sbin/ 디렉토리에 iptables 실행파일이 생성된다.

 

 

 

 

이 파일을 /sbin 디렉토리에 복사하여 쉽게 사용할 수 있도록 하거나 링크를 걸어 사용하도록 한다.

 

 

 

 

 

 

[root@server src]# rpm -e iptables --nodeps

[root@server src]# wget ftp://ftp.iptables.org/pub/iptables/iptables-x.x.x.tar.bz2

[root@server src]# tar jxvfp iptables-x.x.x.tar

[root@server src]# cd iptables-x.x.x

[root@server iptables-x.x.x]# make; make install

[root@server iptables-x.x.x]# ln -s /usr/local/sbin/iptables /sbin/iptables

 

 

 

현재 커널에 로드된 iptables의 기능을 보려면 아래와 같이 실행하면 되는데 만약 보이지 않는다면 정상적으로 커널에 로드된 것이 아니므로 커널컴파일을 다시 하여야 한다.

 

# cat /proc/net/ip_tables_matches

ttl

recent

iprange

icmp

string

state

limit

length

conntrack

udp

tcp

 

 

 

 

 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,035 명
  • 현재 강좌수 :  35,791 개
  • 현재 접속자 :  98 명