Operating System/Linux2007/06/22 05:32

Rusty Russell, mailing list netfilter@lists.samba.org
v1.0 Tue Mar 21 23:29:42 EST 2000

-----------------------------------------------------------------------------------
이 문서는 2.4 Linux Kernel에서 잘못된 Packet을 Filtering하기 위하여 어떻게 iptables 을 이용하는가를 기술한다.
-----------------------------------------------------------------------------------
 
7. iptables 사용하기

iptables는 상당히 자세한 Manual Page(man iptables)를 가지고 있다. ipchains 에 익숙하다면 <@@ref>Appendix-Aipchains와 iptables의 다른 점을 보아라. 이 둘은 매우 비슷하다.

iptables로 할 수 있는 일에는 몇 가지 다른 것이 있다. 첫 번째 작동은 전체 Chain을 조절한다. 처음 시작은 세 개의 미리 만들어진 Chain으로 시작하는 데 이것은 제거될 수 없다.

새로운 Chain 만들기 (-N).
비어있는 Chain을 제거하기 (-X).
미리 만들어진 Chain의 정책을 바꾸기 (-P)
어떤 Chain의 규칙들을 나열하기 (-L)
Chain으로부터 규칙들을 지우기 (-F)
Chain내의 모든 규칙들의 Packet과 byte의 Count를 0으로 만들기 (-Z)

Chain 내부의 규칙을 조작하는 몇 가지 방법이 있다.

Chain에 새로운 규칙을 추가하기 (-A)
Chain의 어떤 지점에 규칙을 삽입하기 (-I)
Chain의 어떤 지점의 규칙을 교환하기 (-R)
Chain의 어떤 지점의 규칙을 제거하기 (-D)
Chain에서 일치하는 첫 번째 규칙을 제거하기 (-D)

7.1 Computer가 Booting될 때 여러분이 보게 되는 것

iptables는 Module로 되어있을 것이다. 이것은 iptable_filter.o이다. 이것은 처음으로 iptable를 실행할 때 자동으로 Load 될 것이다. 이것은 Kernel에 영구히 포함될 수도 있다.

iptables 명령이 실행되기 전에는 기본적으로 만들어져 있는 Chain(입력, Forwarding, 출력)에는 아무튼 규칙도 없다. (주의: 어떤 배포판에는 초기화 Script에 iptables를 실행하는 것이 들어있을 수 있다.) 입력과 출력 Chain의 정책은 ACCEPT이고 Forwarding Chain의 정책은 DROP이다. (iptable_filter Module에 'forward=1' Option을 선택하여 이것을 고칠 수 있다.)

7.2 하나의 규칙으로 작동하기

이것은 Packet Filtering의 약방의 감초이다. 일반적으로 추가와 제거 명령을 사용할 것이다. 다른 것은 이런 개념의 단순한 확장이다.

각 규칙은 Packet이 일치되어야 할 상태를 설정하고, 일치되었을 때 무엇을 할 것인가 ('target')를 나타낸다. 예를 들어, 여러분은 127.0.0.1로부터의 모든 ICMP Packet을 DROP하려고 할 것이다. 그렇다면, 이 경우 일치되어야 할 상태는 'ICMP이면서 그 출처 가 127.0.0.1' 이다. 이 경우 'target' 은 DROP 이다.

127.0.0.1 은 'loopback' Interface이고 실제적인 Network 접속이 전혀 없더라도 이것은 가지고 있을 것이다. 이러한 Packet은 'ping' Program을 이용하여 생성할 수 있다. (이것은 단순히 ICMP type 8 (반응요구)을 보내고 모든 협조적인 Host는 친절하게 ICMP type 0 (반응요구에 대한 응답)을 대답한다. 이것은 Test하는데 유용 하다.

# ping -c 1 127.0.0.1

PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.2 ms

--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.2/0.2/0.2 ms

# iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP
# ping -c 1 127.0.0.1

PING 127.0.0.1 (127.0.0.1): 56 data bytes

--- 127.0.0.1 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss

#

여기서 첫 번째 ping 이 성공한 결과를 볼 수 있다. ('-c 1'은 하나의 Packet만 보내도록 ping에게 말하는 것이다.)

그리고, '입력' Chain에 127.0.0.1에서 오는 Packet('-s 127.0.0.1')으로 ICMP Protocol인 것 ('-p icmp')은 DROP ('-j DROP')하라는 규칙을 추가(-A)하였다.

그리고는 다시 ping으로 규칙을 Test하였다. ping이 오지 않은 응답을 기다 리지 못하고 응답 받기를 포기하기까지 약간의 시간이 걸릴 것이다.

규칙을 제거하는 데는 두 가지 방법이 있다. 첫째, 입력 Chain에는 단 하나의 규칙 만이 있다는 것을 앎으로, 몇 번을 지우라는 방식으로 할 수 있다.

# iptables -D INPUT 1
#

입력 Chain으로부터 1번 규칙을 제거한다.

두 번째 방법은 -A 명령을 이용한 이전의 명령에서 -A를 -D로 바꿔주면 된다. 이것은 복잡한 규칙을 가지고 있고 각 규칙이 몇 번째 규칙인지를 외우고 다니기를 싫어한다면, 아주 유용한 방법이다.

# iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP
#

-D 명령은 -A 명령과 똑 같은 문법이다. (-I 나 -R 도 마찬가지이다.) 만약, 여러 개의 똑 같은 규칙들이 같은 Chain에 있다면, 첫 번째 것만 제거 될 것이다.

7.3 Filtering 지정

앞에서 Protocol을 지정하기 위하여 '-p'를 이용하였고, 출처를 지정하기 위하여 '-s'를 이용하였다. 그 외에도 Packet의 특징을 지정하는데 사용되는 다른 Option들이 있다. 아래는 이것들에 대한 완벽한 개요이다.

출처와 목적지 지정

출처('-s', '--source', '--src')와 목적지('-d', '--destination', '--dst') IP 주소를 지정하는데 4가지 방법이 있다. 가장 보편적인 방법은 'www.linuxhq.com', 'localhost' 처럼 이름을 이용하는 것이다. 두 번째 방법은 '127.0.0.1' 처럼 IP 주소를 이용하는 것이다.

세 번째와 네 번째 방법은 IP 주소의 Group을 지정하는 것으로 '199.95.207.0/24' 또는 '199.95.207.0/255.255.255.0' 같은 형태이다. 이 둘은 모두 199.95.207.0부터 199.95.207.255 사이의 모든 IP 주소를 지정한다. '/' 다음의 숫자는 IP 주소의 어떤 부분이 의미 있는가를 나타낸다. '/32' 나 '/255.255.255.255' 가 기본값이다. (IP 주소의 모든 부분이 일치해야 한다.) 모든 IP 주소를 지정하는데 '/0' 가 사용된다.

# iptables -A INPUT -s 0/0 -j DROP
#

이것은 '-s' Option을 이용하지 않은 것과 같은 효과를 나타내므로 잘 사용되지 않는다.

'역'의 경우 지정

많은 지시자들('-s'나 '-d' 같은)은 일치하지 않는 주소를 나타내기 위하여 '!'('not'을 의미한다)로 시작하는 설정을 할 수 있다. 예로, '-s ! localhost' 는 localhost로 부터 오는 Packet이 아닌 경우를 나타낸다.

Protocol 지정

Protocol은 '-p' 지시자로 지정할 수 있다. Protocol을 숫자가 될 수 있고 (IP의 Protocol 번호를 알고 있다면) 'TCP', 'UDP', 'ICMP' 같은 이름이 될 수도 있다. 그리고 'tcp'는 'TCP'와 같은 역할을 한다.

Protocol 이름 지정에도 '!'을 이용할 수 있다. '-p ! TCP'

Interface 지정

'-i'('--in-interface')와 '-o'('--out-interface')가 Interface를 지정 하는데 사용된다. Interface는 Packet이 들어오고 나가는 물리적인 도구이다. ifconfig 명령을 사용하여 현재 활성화 되어있는 Interface를 알아볼 수 있다.

입력 Chain을 지나는 Packet은 출력 Interface를 가지고 있지 않으므로 '-o' 설정에 일치하는 Packet이 없을 것이고 출력 Chain을 지나는 Packet은 입력 Interface를 가지고 있지 않으므로 '-i' 설정에 일치하는 Packet이 없을 것이다.

Forwarding Chain을 지나는 Packet만이 입력과 출력 Interface를 모두 가질 것이다.

현재 존재하지 않는 Interface를 지정하는 것도 아무런 문제없이 될 수 있다. 이것은 Interface가 활성화 되기 전까지는 규칙에 일치하는 Packet이 있을 수 없을 것이다. 이것은 dial-up PPP를 사용하는 경우 특히 유용하다.

특별한 경우로, Interface 이름이 '+'로 끝날 수 있는데 이것은 그 이름으로 시작하는 모든 Interface를 모두 지정한다(그것이 현재 존재하든 존재하지 않든). 예를 들어, 모든 PPP Interface와 일치하는 규칙을 지정하려면 -i ppp+와 같이 하면 된다.

Interface 이름 앞에 '!'도 이용할 수 있다.

분절 (Fragments) 지정

가끔 Packet은 한번에 다 전달되기에는 너무 큰 경우가 있다. 이런 경우 Packet은 여러 분절로 나뉘어지고 다중 Packet의 형태로 전달된다. 목적지에서 이 분절들 은 재 구성되어 전체 Packet이 된다.

분절에서 문제점은 내부 Packet의 부분으로 IP Header 다음의 위치에서 Protocol Header를 찾는데, 이것은 첫 번째 분절에만 있기 때문에 찾을 수가 없다.

만약 여러분이 접속추적이나 NAT를 한다면 모든 분절은 Filtering Code에 도달하기 전에 뭉쳐지므로 분절에 대한 걱정은 할 필요가 없다.

그렇지 않다면, 분절들이 Filtering 규칙에서 어떻게 처리되는가를 이해하는 것 은 중요하다. 우리가 가지고 있지 않은 정보를 요구하는 Filtering 규칙에 부합될 수가 없다. 이것은 첫 번째 Packet은 다른 Packet과 같이 처리되고 두 번째 이후의 분절은 전달될 수 없음을 의미한다. 그러므로 -p TCP --sport www ('www' 를 출신 Port로 지정하는 경우)와 같은 규칙에 맞는 분절은 있을 수 없다(첫 번째 분절을 제외하고). 그 반대의 규칙인 -p TCP --sport ! www도 분 절들을 처리할 수 없다.

그러나, 두 번째 이상의 분절에 대하여 규칙을 지정하기 위하여 '-f' ('--fragment')라는 지시자를 사용할 수 있다. 두 번째 이상의 분절에는 적용 되지 않는 규칙을 지정하기 위하여 '-f' 앞에 '!' 를 붙이는 것도 가능하다.

일반적으로, 첫 번째 분절에 Filtering이 적용되어 DROP 되면 목적지 에서 다른 분절들의 재합성이 되지 않으므로, 두 번째 이상의 분절이 그냥 지나가도록 하는 것도 안전한 것으로 간주 된다. 그러나 단순히 분절들을 전달하는 것만으로 Host를 Crash가 생기는 Bug가 알려져 있다. 여러분이 결정할 일이다.

Network Header에 대한 주의: 잘못 구성된 Packet들은 이러한 시험을 할 때 DROP 되었다. (TCP, UDP, ICMP Packet중 길이가 너무 짧아 Firewall Code가 Port나 ICMP Code와 형태를 읽을 수 없는 경우). 왜냐하면 TCP 분절은 8번째 위치부터 시작되기 때문이다.

예로, 다음과 같은 규칙은 192.168.1.1 로 향하는 분절을 DROP 시킨다.

# iptables -A OUTPUT -f -d 192.168.1.1 -j DROP
#

iptables의 확장: 새로운 대상(Matches)

iptables는 확장 가능하다. 즉 새로운 형태를 제공하기 위하여 iptables와 Kernel 모두가 확장 가능하다는 의미이다.

이중 일부는 표준적이고 다른 것은 이색적이다. 다른 사람에 의해서도 확장 은 만들어질 수도 있으며 독립적으로 배포될 수 있다.

정상적으로 Kernel 확장은 Kernel Module 하부 Directory에 존재한다. (/lib/modules/2.3.15/net). 이것은 요구에 의하여 적재된다. 그러므로 직접 이들 Module을 적재할 필요는 없다.

iptables의 확장들은 공유 Library 형태로 보통 /usr/local/lib/iptables에 위치한다. 배포판은 이것을 /lib/iptables나 /usr/lib/iptables에 넣으려 할 것이다.

확장은 두 가지 형태이다. : 새로운 target, 새로운 적용(match) 아래에 새로운 Target에 대하여 이야기 할 것이다. 어떤 Protocol은 자동으로 새로운 Test를 제공하는데 현재로는 TCP, UDP, ICMP 에 대해서 아래에 보여 줄 것이다.

이것을 위해서 '-p' Option 뒤에 지정하는데 그러면 확장을 적재할 것이다. 명백히 하려면 '-m' Option으로 확장을 적재하고 확장 Option을 사용 가능하게 할 수 있다.

확장에 대한 도움을 얻으려면, 적재하는 Option('-p', '-j', '-m')을 '-h'나 '--help' 다음에 지정하면 된다.

TCP 확장

TCP 확장은 '--protocol tcp' 가 지정되고 다른 적용이 지정되지 않으면 자동으로 적재된다. 이것은 다음과 같은 Option을 제공한다.

--tcp-flags
'!' Option을 사용한다면 이것 뒤에 두 개의 단어를 사용한다. 첫 번째 것은 검사하고자 하는 지시자 List의 마스크이다. 두 번째 단어는 지시자에게 어떤 것이 설정 될 것인지를 말해준다. 예를 들어,

# iptables -A INPUT --protocol tcp --tcp-flags ALL SYN,ACK -j DENY

이것은 모든 것이 검사되어야 함을 말한다.('ALL'은 `SYN,ACK,FIN,RST,URG,PSH' 와 같다.) 그러나 SYN 과 ACK 만 설정된다. 'NONE'는 지시자가 없음을 말한다.

--syn
'!' Option이 선행될 수 있다. 이것은 '--tcp-flags SYN,RST,ACK,SYN'의 약어이다.

--source-port
'!' Option이 선행될 수 있다. 이후에 하나의 TCP Port나 Port의 범위를 지정한다. /etc/services 에 기록된 것과 같은 Port 이름이 사용될 수 도 있고 숫자로 나타낼 수도 있다. 범위는 두 개를 Port 이름을 '-'으로 연결해서 사용하거나 (크거나 같은 경우를 위해서) 하나의 Port 뒤에 '-'를 사용하거나 (작거나 같은 경우를 위해서) 하나의 Port 앞에 '-' 를 덧붙일 수 있다.

--sport
이것은 '--source-port'와 동의어이다.

--destination-port, --dport
위의 내용과 같으나 목적 지를 지정한다.

--tcp-option
'!'나 숫자가 Option에 선행될 수 있는데 숫자가 앞에 올 경우 그 숫자 와 TCP Option이 같은 경우의 Packet을 검사한다. TCP Option을 검사하려 할 때 완전한 TCP Header를 갖지 않는 것은 자동으로 DROP 된다.

TCP 지시자에 대한 설명

가끔 한쪽 방향에서의 TCP 접속만 허락하고 다른 방향에서의 접속을 불허하는 것이 유용하다. 예로, 여러분은 외부 WWW Server로의 접속은 허락하며 그 Server로부터의 접속은 불허하기를 원할 것이다.

단순하게 그 Server로부터 오는 TCP Packet을 막으면 된다고 생각할 것이다. 그러 나, 불행히도 작동하기 위해서 TCP 접속은 양방향의 Packet을 요구한다.

해법은 접속을 요구하는 Packet만 막는 것이다. 이러한 Packet을 SYN Packet이라 한다. (물론, 기술적으로 SYN 지시자 셋을 갖는 Packet이 있다. 그리고 FIN 과 ACK 지시 자는 지워진다. 그러나 간단히 그것을 SYN Packet이라고 한다.) 이러한 Packet만 불가능으로 만듦으로써 외부로부터의 접속 시도를 막을 수 있다.

이러한 것을 위해서 '--syn' 지시자가 사용된다. : 이것은 Protocol을 TCP 로 지정했을 때만 효과가 있다. 예를 들면, 192.168.1.1 로부터의 TCP 접속을 지 정하기 위하여 다음과 같이 하면 된다.

-p TCP -s 192.168.1.1 --syn

접속을 시작한 것 외의 모든 Packet을 지정하기 위하여 '!' Option이 선행될 수 있다.

UDP 확장

이 확장은 '--protocol udp'가 지정되고 적용이 지정되지 않으면 자동으로 적재된다. 이것은 '--source-port', '--sport', '--destination-port', '-dport'를 지원하고 내용은 TCP 설명에서 자세히 나왔다.

ICMP 확장

이 확장은 '--protocol icmp'가 지정되고 그 적용이 지정되지 않으면 자동으로 적재된다. 이것은 단 하나의 새로운 Option만 지원한다.:

--icmp-type
'!' Option이 선행될 수 있다. 이후에 ICMP 타입의 이름('host-unreachable') 이나 숫자형태 ('3'), 또는 숫자형태와 Code('/'로 분리 예. '3/3') 의 형 태가 사용된다. 사용할 수 있는 ICMP 형태의 이름의 List는 '-p icmp --help' 하면 나타난다.

그 외의 적용 확장

Netfilter Package의 다른 확장은 시험적인 확장이다. 이것은 (설치 되어있다면) '-m' Option으로 활성화 된다.

mac

이 Module은 '-m mac' 또는 '--match mac' 이라고 함으로 지정할 수 있다. 이것은 들어오는 Packet의 Ethernet 주소를 검사한다. 그러므로 입력 Chain에 서만 유용하다. 이것은 하나의 Option만 제공한다.

--mac-source
'!' Option이 선행 될 수 있다. 이후에 콜론으로 분리된 16진수 숫자의 Ethernet 주소가 온다.
예 '--mac-source 00:60:08:91:CC:B7'

limit

이 Module은 '-m limit' 또는 '--match limit'이라고 함으로 지정할 수 있다. 이것은 Log Message를 억제할 때처럼 적용검사의 속도를 제한하는데 사용한다. 1초에 주어진 숫자만큼의 적용만 검사한다. (기본값은 한 시간 에 3번, 최고 5번이다.) 이것은 두 개의 Option을 제공한다.

--limit
숫자가 따라온다: 초당 평균 최대 적용 검사 수를 지정한다. 숫자 뒤에 시간단위를 지어 할 수도 있다. ('/second', '/minute', '/hour', '/day'형태이다. 예로, '5/second' 또는 '5/s'가 가능하다)

--limit-burst
숫자가 따라온다. 위의 제한이 적용되기 전의 최대 Burst(?)를 제한 한다.
이 적용은 종종 Log의 속도를 제한하기 위하여 LOG Target과 함께 사용된다. 이것을 이해하기 위하여 아래에 기본 제한설정을 하는 Log Packet 제한을 보자.

# iptables -A FORWARD -m limit -j LOG

이 규칙에 도달될 때까지 Packet은 Log될 것이다. 사실 Burst의 기본값은 5 이므로 처음 5개의 Packet은 Log될 것이다. 그 이후 얼마나 많은 Packet이 도달하든 간에 하나의 Packet이 Log되기 전에 20분이 걸릴 것이다. 그리고 20분 동안 Packet 적용이 없으면 Burst 하나가 다시 생길 것이다. Packet없이 100분 이 지나면 Burst는 완전이 원상 복구 될 것이다. 처음 시작할 때로 돌아가는 것이다.

재복구 시간을 59시간 이상으로는 설정하지 못한다. 그러므로 평균속도를 하루에 1개로 설정하였다면 Burst 속도는 3 이하가 되어야 한다.

owner

이 Module은 지역에서 생성된 Packet의 생성자의 여러 특징을 적용하려고 한다. 이것은 출력 Chain에만 사용되며 어떤 Packet들(ICMP ping 응답 같은)은 소유자 가 없으므로 적용되지 않는다.

--uid-owner userid
유효한 사용자 id (숫자)의 Processor가 생성한 Packet에 적용한다.

--uid-owner groupid
유효한 Group id (숫자)의 Processor가 생성한 Packet에 적용한다.

--pid-owner processid
주어진 Processor id 의 Processor가 생성한 Packet에 적용한다.

--sid-owner processid
세션 Group내의 Processor가 생성한 Packet에 적용한다.

unclean

이 시험적인 Module은 정확히 '-m unclean' 또는 '--match unclean'으로 지정해 주어야 한다. 이것은 무작위의 여러 건전성 검사를 한다. 이것은 제대로 검사되지 않았고 안전성 도구로도 사용되지 못한다. (아마도 이것 은 무제를 더욱 힘들게 하고 Bug 그 자체일 것이다.) 이것은 Option이 없다.

상태 적용

가장 유용한 적용 기준은 'ip_conntrack' Module의 접속 추적 분석을 해석하는 'state' 확장이다. 이것을 강력히 추천한다.

'-m state'를 지정함으로 '--state' Option을 사용할 수 있는데 이후에 Comma로 분리되는 적용할 상태들의 List가 온다. ('!' 지시자는 사용되어지지 않는 다.) 이 상태들은;

NEW
새로운 접속을 만드는 Packet

ESTABLISHED
존재하는 접속에 속하는 Packet (즉, 응답 Packet을 가졌던 것)

RELATED
기존의 접속의 부분은 아니지만 연관성을 가진 Packet으로 ICMP Error 나 (FTP Module이 삽입 되어있으면) ftp Data 접속을 형성하는 Packet.

INVALID
어떤 이유로 확인할 수 없는 Packet: 알려진 접속과 부합하지 않는 ICMP Error와 'out of memory' 등을 포함한다. 보통 이런 Packet은 DROP 된다.

7.4 Target 지정

이제 Packet에서 어떤 검사를 할 수 있는지를 알았다. 이제 우리의 검사에 일치 하는 Packet을 어떻게 할 것인지를 말하는 것을 알아야 한다. 이것을 규칙 Target 이라고 한다.

두 개의 이미 만들어진 단순한 Target이 있다. : DROP 과 ACCEPT. 이미 이것에 대해서는 이야기를 한 적이 있다. 적용이 되는 Packet과 그것의 Target이 위의 두 개중 하나라면 더 이상의 참고할 규칙은 없다. : Packet의 운명은 결정 되는 것이다.

이미 만들어진 두 개의 Target외에 두 가지 형태의 Target이 있다.: 확장과 사용자 지정의 Chain들이다.

사용자 지정의 Chain들

Ipchains로 부터 상속되는 iptables의 강력한 기능중의 하나는 능력이 되는 사용자가 기존의 세 개의 Chain(입력, 출력, Forward)외에 새로운 Chain을 생성할 수 있다는 것이다. 모임의 결과 사용자 지정의 Chain은 그것을 구분하기 위하여 소문자로 나타낸다. (아래 전체 Chain에 대한 작용 부분에서 어떻게 사용자 지정의 새로운 Chain을 만드는지 기술할 것이다.)

Target이 사용자 지정의 Chain인 규칙에 Packet이 맞으면 Packet은 사용자 지정의 Chain을 따라 움직이게 된다. 그 Chain이 Packet의 운명을 결정하지 못하면 그리고 그 Chain에 따른 이송이 끝나면, Packet은 현재 Chain의 다음 규칙으로 돌아온다.

그림을 보자. 두 개의 Chain이 있고 그것이 입력과 Test라는 사용자 지정의 Chain이 라고 가정하자.

'INPUT'

 

'test'

Rule1: -p ICMP –j DROP

 

Rule1: -s 192.168.1.1

Rule2: -p TCP -j test

 

Rule2: -d 192.168.1.1

Rule3: -p UDP -j DROP

   

192.168.1.1 로부터 와서 1.2.3.4 로 향하는 TCP Packet이 있다고 가정한다. 이것은 입력 Chain으로 들어온다. Rule1을 검사한다. 맞지 않음. Rule2 맞음. 그것의 Target 은 Test, 고로 다음 검사할 규칙은 Test의 시작이다. Test의 Rule1이 맞다. 그러나 이것이 Target을 지정하지 않는다. 그러므로 다음 규칙이 검사된다. Rule 2. 맞지 않다. 그 Chain의 끝에 도달했다. 다시 입력 Chain으로 돌아가서 Rule 3을 검사 한다. 그것도 맞지 않다.

사용자 지정의 Chain에서 대를 사용자 지정의 Chain으로 갈 수 있다. (그러나 Loop를 돌 수는 없다. Loop를 발견하게 되면 Packet은 DROP 된다.)

iptables로의 확장: 새로운 Target

Target의 다른 형태는 확장이다. Target 확장은 Kernel Module로 구성된다. 그리고 iptables에 대한 선택적 확장은 새로운 명령 행의 Option을 제공한다. 기본적으로 Netfilter 배포에 포함된 몇몇의 확장은 다음과 같다.

LOG

일치하는 Packet의 Kernel Log를 제공한다. 이것은 부가의 Option을 제공한다.

--log-level
Level 숫자나 이름이 따라온다. 유효한 이름은 (상황에 따라 다르다) 'debug' 'info', 'notice', 'warning', 'err', 'crit', 'alert', 'emerg' 이고 이것 은 각각 숫자 7 에서 0 에 대응한다. 이런 Level에 대한 설명은 syslog.conf 의 man Page를 보라.

--log-prefix
14자까지의 문장이 따라온다. 이 Message는 Log Message의 시작부분으로 보내져서 확인에 사용될 수 있다. 이 Module은 'limit' Target 다음에 사용하면 가장 효과적이다. 그래서 Log가 넘쳐나지 않도록 할 수 있다.

REJECT

이 Module은 'DROP'과 같은 효과를 나타낸다. 다만, 'port unreachable' 이라는 Error Message를 ICMP 로 보낸다. 주의할 것은 ICMP Error Message는 다음의 경우 보내 지지 않는다. (RFC 1122 를 보라) :

검사된 Packet이 ICMP Error Message이거나 알 수 없는 ICMP 형태인 경우
검사된 Packet이 Header가 없는 분절인 경우
너무 많은 ICMP Error Message를 그 목적지로 보낸 경우.

REJECT 는 '--reject-with'라는 Option을 가지는데 이것은 사용할 응답 Packet을 변경한다. 자세한 것은 Manual Page를 보라.

특별한 미리 만들어진 Target
두 개의 미리 만들어진 Target이 있다: RETURN, QUEUE

RETURN은 한 Chain의 끝으로 보내지는 것과 같은 효과가 있다. : 미리 만들어진 Chain의 경우 그 Chain의 정책은 실행이다. 사용자 정의 Chain의 경우 이 Chain으로 점프 하는 규칙의 바로 다음인 이전 Chain으로 이동한다.

Queue은 특별한 Target으로, 사용자공간의 작업을 위해 Packet을 대기하도록 한다. Packet 을 위해서 대기하고 있는 것이 없다면(즉, 이 Packet을 다룰 Program이 아직 씌어져 있지 않다면) Packet은 DROP 될 것이다.

7.5 전체 Chain에 대한 작용.

iptables의 유용한 기능 중 하나는 여러 관계가 있는 규칙을 하나의 Chain 속으로 Group화 하는 것이다. Chain의 이름은 어떤 것을 사용할 수도 있으나 미리 만들어 진 Chain과의 혼동을 막기 위하여 소문자를 사용하기를 권한다. Chain의 이름은 16자까지 가능하다.

새로운 Chain 생성

새로운 Chain을 만들어 보자. 나는 매우 상상력이 좋은 사람이므로 이것을 Test 라고 부르기로 하겠다. '-N' 또는 '--new-chain' Option을 사용한다.

# iptables -N test
#

단순하다. 이제 이 Chain에 상세한 규칙을 적용할 수 있다.

Chain 제거

Chain을 제거하는 것도 단순하다. '-X' 나 '--delete-chain' 을 사용한다.

# iptables -X test
#

Chain을 제거하는 데는 몇 가지 제한이 있다. 이것은 비어있어야 한다. (아래의 Chain 비우기를 보라) 그리고 그것은 다른 어떤 규칙의 Target도 아니어야 한다. 미리 만들어진 세 개의 Chain은 제거할 수 없다.

Chain의 이름을 지정하지 않으면 모든 사용자 정의의 Chain은 제거된다.

Chain 비우기

하나의 Chain의 모든 규칙을 비우는 간단한 방법이 있으니, '-F' ('--flush') 명령이다.

# iptables -F forward
#

Chain을 지정하지 않으면 모든 Chain의 규칙이 지워진다.

Chain 규칙 나열하기

한 Chain의 모든 규칙은 '-L' 명령으로 나열할 수 있다.

각 사용자 정의의 Chain을 나열했던 'refcnt' 는 그 Chain을 그들의 Target으로 하는 규칙들의 번호이다. Chain이 제거되기 위해서는 이것이 '0'으로 되어야 한다. (그리고 그 Chain은 비어야 한다)

Chain의 이름이 생략되면 비어있는 것을 포함한 모든 Chain이 나열된다.

'-L' 명령에 따르는 Option은 세 개가 있다. '-n' (numeric) Option은 iptables가 여러분이 DNS 요구를 Filtering한 경우나 DNS가 적절이 설정되어 있지 않다면 오랜 시간이 걸리는, IP 주소를 찾는 것을 예방하는 아주 유용한 Option이다. 이것은 TCP와 UDP Port가 이름이 아닌 숫자로 출력되도록 하기도 한다.

'-v' Option은 규칙의 자세한 정보(Packet과 byte 카운터, TOS 비교, Interface와 같은)를 나타낸다.

Packet과 byte Count는 'K'(1000), 'M'(1,000,000), 'G'(1,000,000,000) 와 같은 접미사와 함께 나타난다. '-x' (확장 수) 지시자를 사용하면 얼마나 큰 숫자든 전 체 숫자가 나타난다.

Count Reset ('0'으로 만들기)

이것은 Count를 Reset하는데 유용하다. 이것은 '-Z' ('--zero') Option으로 가능하다.

이것의 문제점은 Reset하기 직전의 Count 값을 알 필요가 있을 때가 가끔 있다는 것 이다. 이러한 경우의 예로, 어떤 Packet이 '-L' 과 '-Z' 명령 사이에 지나갈 수 있다. 이런 이유로 Count를 읽는 것과 동시에 Reset하기 위해서 '-L' 과 '-Z' 명령을 같이 사용할 수 있다.

정책 설정

우리가 이전 Chain을 Packet이 어떻게 지나가는가를 의논할 때, 미리 만들어진 Chain의 끝에 Packet이 다다랐을 때 무슨 일이 일어날 것인가를 설명하였다. 이 경우 Chain의 정책이 그 Packet의 운명을 결정한다. 미리 만들어진 Chain(입력, 출력, Forward)만이 정책을 가지는데, 이것은 사용자 정의의 Chain의 끝에 다다른 Packet의 이동은 이전 Chain에서 요약되어지기 때문이다.

정책은 ACCEPT 또는 DROP이 될 수 있다.

ipchains와 ipfwadm을 사용하기

배포되는 Netfilter에는 ipchains.o 와 ipfwadm.o 라는 Module이 있다. 이것을 여러 분의 Kernel에 포함시키면 이전과 똑 같이 ipchains 나 ipfwadm을 사용할 수 있다. (주의: 이들은 iptables.o, ip_conntrack.o, ip_nat.o와 호환성이 없다)

이것은 아직 한동안은 지원될 것이다. 이들을 완전히 대치하는 안정판이 나오는데 까지는 2 * [대치할 것이라는 발표 - 첫 번째 안정판] 이라는 공식이 적용된다고 생각한다.

즉, ipfwadm의 경위 이것의 지원이 종료될 때는:

2 * [October 1997 (2.1.102 release) - March 1995 (ipfwadm 1.0)]
+ January 1999 (2.2.0 release)
= November 2003.

그리고 ipchains의 경우 이것의 지원이 종료될 때는 :

2 * [August 1999 (2.3.15 release) - October 1997 (2.2.0 release)]
+ January 2000 (2.3.0 release?)
= September 2003.

그러므로, 2004년 까지는 걱정할 필요가 없을 것이다.

Creative Commons License
Posted by BLUEDAY™