iptables 사용법

옵션

-A 체인에 새로운 규칙 추가

-D 체인의 어떤 지점의 규칙 삭제

-F 체인으로부터 모든 규칙 삭제

-L 어떤 체인의 규칙 보기

-I 체인의 어떤 지점에 규칙을 삽입

-i (input interface // I eth0 은 eth0으로 들어오는 모든 패킷을 뜻 함)

-o (output interface)

-R 체인의 어떤 지점의 규칙을 교환

-s 출발지 주소(패킷 출처 IP 지정/도메인 또는 192.168.10.1/24처럼 저장 될 수 있다.)

-d 목적지 주소(패킷 도착지 IP 지정)

--sport 출발지 포트 번호 제어

--dport 목적지 포트 번호 제어

-p 프로토콜 제어

-j 규칙 설정

## iptables를 초기화

iptables -F

## 랜카드 사용을 모두 허용

iptables -A INPUT -p ALL -i eth0 -j ACCEPT

iptables -A OUTPUT -p ALL -o eth0 -j ACCEPT

iptables -A INPUT -p ALL -i eth1 -j ACCEPT

iptables -A OUTPUT -p ALL -o eth1 -j ACCEPT

##Telnet port 막음

iptables -A INPUT -p TCP --dport 23 -s 192.0/24 -j ACCEPT

iptables -A INPUT -p TCP --dport 23 -s 192.168.0.0/24 -j ACCEPT

intables -A INPUT -p TCP --dport 23 -j DROP

## FTP port 막음

iptables -A INPUT -p TCP --dport 21 -s 192.0/24 -j ACCEPT

iptables -A INPUT -p TCP --dport 21 -s 192.168.0.0/24 ACCEPT

iptables -A INPUT -p TCP --dport 21 -j DROP

## SSH port 막음

iptables -A INPUT -p TCP --dport 22 -s 192.0/24 -j ACCEPT

iptables -A INPUT -p TCP --dport 22 -s 192.168.0.0/24 ACCEPT

iptables -A INPUT -p TCP --dport 22 -j DROP
# service iptables save 하면 현재 룰셋이 /etc/sysconfig/iptables 로 저장되고 리부팅 후에도 적용 됨.

# 현재 정의된 규칙 보여주기

iptables -L

# 규칙 초기화

iptables -F

# 출발지가 127.0.0.1인 (-s 127.0.0.1) icmp 프로토콜(-p icmp) 패킷을 거부(-j DROP)하는 규칙을 추가(-A) 합니다.

iptables -A INPUT -p icmp -s 127.0.0.1 -j DROP

# 목적지 포트가 23(--dport 23)이고 tcp 프로토콜(-p tcp) 인 패킷을 거부(-j DROP)하는 규칙을 추가(-A) 합니다.

iptables -A INPUT -p tcp --dport -j DROP

1. Tcpdump의 옵션들

-a : Network & Broadcast 주소들을 이름들로 바꾼다.

-c Number : 제시된 수의 패킷을 받은 후 종료한다.

-d : comile된 packet-matching code를 사람이 읽을 수 있도록 바꾸어 표준 출력으로 출력하고, 종료한다.

-dd : packet-matching code를 C program의 일부로 출력한다.

-ddd : packet-matching code를 숫자로 출력한다.

-e : 출력되는 각각의 행에 대해서 link-level 헤더를 출력한다.

-f : 외부의 internet address를 가급적 심볼로 출력한다(Sun의 yp server와의 사용은 가급적 피하자).

-F file : filter 표현의 입력으로 파일을 받아들인다. 커맨드라인에 주어진 추가의 표현들은 모두 무시된다.

-i device : 어느 인터페이스를 경유하는 패킷들을 잡을지 지정한다.

지정되지 않으면 시스템의 인터페이스 리스트를 뒤져서 가장 낮은 번호를 가진 인터페이스를 선택한

다.

(이 때 loopback은 제외된다, eth0 ...)

-l : 표준 출력으로 나가는 데이터들을 line buffering한다.

다른 프로그램에서 tcpdump로부터 데이터를 받고자 할 때, 유용하다.

-n : 모든 주소들을 번역하지 않는다(port,host address 등등)

-N : 호스트 이름을 출력할 때, 도메인을 찍지 않는다.

-O : packet-matching code optimizer를 실행하지 않는다. 이 옵션은 optimizer에 있는 버그를 찾을 때나 쓰인

다.

-p : 인터페이스를 promiscuous mode로 두지 않는다.

-q : 프로토콜에 대한 정보를 덜 출력한다. 따라서 출력되는 라인이 좀 더 짧아진다.

-r file : 패킷들을 '-w'옵션으로 만들어진 파일로 부터 읽어 들인다.

파일에 "-" 가 사용되면 표준 입력을 통해서 받아들인다.

-s length: 패킷들로부터 추출하는 샘플을 default값인 68Byte외의 값으로 설정할 때 사용한다.

(SunOS의 NIT에서는 최소가 96Byte이다).

68Byte는 IP,ICMP, TCP, UDP등에 적절한 값이지만 Name Server나 NFS 패킷들의 경우에는

프로토콜의 정보들을 Truncation할 우려가 있다.

이 옵션을 수정할 때는 신중해야만 한다.

이유는 샘플 사이즈를 크게 잡으면 곧 패킷 하나하나를 처리하는데 시간이 더 걸릴 뿐만아니라

패킷 버퍼의 사이즈도 자연히 작아지게 되어 손실되는 패킷들이 발생할 수 있기 때문이다.

또, 작게 잡으면 그만큼의 정보를 잃게되는 것이다.

따라서 가급적 캡춰하고자 하는 프로토콜의 헤더 사이즈에 가깝게 잡아주어야 한다.

-T type : 조건식에 의해 선택된 패킷들을 명시된 형식으로 표시한다.

type에는 다음과 같은 것들이 올 수 있다.

rpc(Remote Procedure Call), rtp(Real-Time Applications protocol), rtcp(Real-Time Application

control protocal),

vat(Visual Audio Tool), wb(distributed White Board)

-S : TCP sequence번호를 상대적인 번호가 아닌 절대적인 번호로 출력한다.

-t : 출력되는 각각의 라인에 시간을 출력하지 않는다.

-tt : 출력되는 각각의 라인에 형식이 없는 시간들을 출력한다.

-v : 좀 더 많은 정보들을 출력한다.

-vv : '-v'보다 좀 더 많은 정보들을 출력한다.

-w : 캡춰한 패킷들을 분석해서 출력하는 대신에 그대로 파일에 저장한다.

-x : 각각의 패킷을 헥사코드로 출력한다.

2. 조건식(expression)

옵션의 제일 마지막인 조건식은 어떤 패킷들을 출력할지를 선택하는데 쓰인다.

조건식이 주어지지 않는 다면 모든 패킷들이 그 대상이 될 것이다.

일단 주어지면, 아무리 패킷들이 많아도 조 건식에 부합하는 패킷만을 출력한다.

조건식들은 하나 또는 몇 개의 primitive들로 구성되어 있다.

primitive들은 보통 하나 혹은 몇개의 qualifier들 다음에 오는 하나의 값으로 이루어진다.

Qualifier들은 모두 3 종류이며 다음과 같다.

1) type : 주어진 값의 종류가 무엇인지를 나타낸다.

가능한 type들은 'host', 'net', 'port'가 있다. type이 없는 값들은 type을 host라 가정

한다.

2) dir : id로 부터의 어떤 특정한 전송 방향을 나타낸다.

가능한 방향은 'src', 'dst', 'src or dst', 'src and dst'이다.

만약 방향이 정해지지 않았다면, src or dst라 가정한다.

"For `null' link layers (i.e. point to point protocols such as slip) the inb ound

and out bound qualifiers can be used to specify a desired direction."

3) proto : 매칭을 특정 프로토콜에 한해서 수행한다.

가능한 프로토콜들은 ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl,

tcp, udp이다.

만약 프로토콜이 명시되지 않았다면, 해당하는 값의 type에 관련된 모든 프로토콜들이 그

대상이 된다.

4) 이 밖에도 위의 패턴을 따르지 않는 Primitive들이 존재한다. (gateway, broadcst, less,

greater, 산술식).

5) 좀 더 정교한 조건식들을 사용하려면, 'and(&&)', 'or(||)', 'not(!)'들을 사용하여

여러 primitive들을 연결하면 된다. 같은 표현들은 생략될 수 있다.

3. 사용 가능한 Primitive들

1) dst host HOST

packet의 IP destination 항목이 HOST일때 참이 된다.

2) src host HOST

packet의 IP source 항목이 HOST일때 참이 된다.

3) host HOST

IP source, IP destination 항목 중 어느 하나라도 HOST이면 참이다.

4) ether dst ehost

ethernet destination 주소가 ehost일 때 참이다.

5) ether src ehost

ethernet source 주소가 ehost일 때 참이다.

6) ether host ehost

ethernet source, destination 항목들 중 어느 하나라도 ehost이면 참이다.

7) gateway host

패킷이 host를 게이트웨이로 사용하면 참이다.

이 말의 의미는 ethernet sour ce나 destination 항목은 host이지만,

IP source와 destination은 host가 아닐 때를 말한다.

8) dst net NET

패킷의 IP destination 주소가 NET의 network number를 가지고 있을 때 참이 다.

9) src net NET

패킷의 IP source 주소가 NET의 network number를 가지고 있을 때 참이다.

10) net NET

패킷의 IP source 주소 혹은 destination 주소가 NET의 network number를 가 지고 있을

때 참이다.

11) net netmask mask

IP 어드레스가 지정된 netmask를 통해서 net과 매칭되면 참이다.

12) net net/len

IP 어드레스가 netmask와 len 비트만큼 매치되면 참이다.

13) dst port PORT

패킷이 ip/tcp, ip/udp 프로토콜의 패킷이고 destination port의 값이 PORT일 때 참이다.

port는 /etc/services에 명시된 이름일 수도 있고 그냥 숫자일 수도 있다.

만약 이름이 사용됐다면 port 번호와 프로토콜이 같이 체크될 것이다.

만약 숫자나 불 확실한 이름이 사용됐을 경우에는 port 번호만이 체크될 것이다.

14) src port PORT

패킷의 source port의 값으로 PORT를 가지면 참이다.

15) port PORT

패킷의 source, destination port 중에 하나라도 PORT이면 참이다.

16) less length

패킷이 length보다 짧거나 같으면 참이다.(len <= length)

17) greater length

패킷이 length보다 짧거나 같으면 참이다.(len >= length)

18) ip proto protocol

패킷이 지정된 종류의 프로토콜의 ip패킷이면 참이다.

Protocol은 icmp, igrp, udp, nd, tcp 중의 하나 혹은 몇 개가 될 수 있다.

주의할 점은 tcp, udp, icmp들은 '\'로 escape되어야 한다.

19) ehter broadcast

패킷이 ethernet broadcast 패킷이라면 참이다. ehter는 생략 가능하다.

20) ip broadcast

패킷이 IP broadcast 패킷이라면 참이다.

21) ether multicast

패킷이 IP multicast 패킷이라면 참이다.

22) ether proto protocol

패킷이 ether type의 protocol이라면 참이다.

protocol은 ip, arp, rarp 중에 하나 혹은 몇개가 될 수 있다.

ip proto protocol에서와 마찬가지로 ip, arp, rarp는 escape 되어야 한다.

23) decnet src host

만약 DECNET의 source address가 host이면 참이다.

이 어드레스는 '10.123'이 나 DECNET의 host name일 수 있다.

DECNET host name은 DECNET에서 돌아가도록 설정된 Ultrix 시스템에서만 사용 가능하다.

24) decnet dst host

DECNET destination address가 host이면 참이다.

25) decnet host HOST

DECNET source, destination address중의 하나라도 HOST이면 참이다.

26) ip, arp, rarp, decnet

ether proto [ip|arp|rarp|decnet]의 약어

27) lat, moprc, mopdl

ether proto [lat|moprc|mopdl]의 약어

28) tcp, udp, icmp

ip proto [tcp|udp|icmp]의 약어

29) expr relop expr

30) EXPR

proto [expr:size]의 형식을 띤다. proto, expr, size에 올 수 있는 것들은 다음과 같다.

31) proto : ether, fddi, ip, arp, rarp, tcp, udp, icmp

32) expr : indicate Byte offset of packet of proto

33) size : optional. indicate the size of bytes in field of interest

34) default is one, and can be two or four

35) RELOP

!=, =, <=, >=, etc.

이 조건식을 사용하기 위해서는 먼저 해당하는 Protocol(proto)의 헤더에 관련된 것들을 자세히 알아야만 한

다.

proto에는 대상이 될 프로토콜을 지정한다. expr에는 프로토콜 헤더의 처음부터의 Byte Offset을 지정하는 식

이 들어가게 된다.

Size는 Option이며 지정이 안 되어 있을 경우에는 자동으로 1byte를 지칭한다.

따라서 이 조건식을 사용하게 되면 헤더에 포함된 정보를 Bitmask를 사용하여 직 접 원하는 패킷인지를 가려

낼 수 있기 때문에,

보다 정밀한 사용이 가능하게 된다.

Tcpdump의 사용 예제들

security라는 호스트로부터 날아오고, 날아가는 패킷들을 출력

# tcpdump host security

security와 mazinga, getarobo 사이에 날아다니고 있는 패킷들을 출력

# tcpdump host security and \( mazinga or getarobo \)

security에서 elgaim을 제외한 모든 호스트로 날아다니는 IP 패킷들을 출력

# tcpdump ip host security and not elgaim

gateway amurorei를 거치는 ftp에 관련된 패킷들을 출력

# tcpdump 'gateway amurorei and ( port ftp or ftp-data )'

local호스트가 아닌 호스트와 로컬호스트가 맺는 TCP 커넥션의 시작과 마지막 패 킷들을 출력한다(SYN, FIN 패

킷),

tcp 프로토콜의 13번째 옥텍(8bit) 있는 1과 2의 flag.

# tcpdump 'tcp[13] & 3 != 0 and not src and dst net non-local'

gateway amurorei를 지나는 576Byte보다 큰 패킷들을 출력한다

# tcpdump 'gateway amurorei and ip[2:2] > 576'

Ethernet boradcast 혹은 multicast를 통해서 보내진 것이 아닌, IP broadcast 혹 은 multicast 패킷들을 출력

한다.

# tcpdump 'ehter[0] & 1 = 0 and ip[16] >= 224'

Echo request/reply가 아닌 ICMP 패킷들을 모두 출력한다.

# tcpdump 'icmp[0] != 8 and icmp[0] != 0'

access list Overview

- Access List란 단어 자체에서 의미하듯이 라우터를 경유하는 트래픽에 대한 제어를 할 수 있는 것으로 어떤 트래픽을 어떻게 제어할 것인지를 정의한다.

- 라우터에 연결되는 LAN과 호스트 수의 증가와 인터넷으 발달로 네트워크 performanace를 극대화하기 위해서는 트래픽 access(접근) 통제 정책을 수립할 필요가 있다. 정책을 수립해야 할 내용 중에는 어떤 트래픽을 어떻게 제어할 것인지를 확정하고 불필요한 연결은 어떻게 사전에 미리 막아야 하는지를 포함한다.

Access list 특징

- Packet Filtering을 통해 네트워크의 트래픽을 제한하거나, 특정 사용자나 장치에 의해 사용되는 네트워크 자원을 제한할 수 있다.

- Access List는 일반적으로 라우터의 특정 인터페이스를 통과하는 패킷을 허용하거나 제한할 수 있다.

- Access List는 라우터를 통과하는 트래픽을 제한할 수 있지만 라우터에서 만들어지는 트래픽에 대해서는 제한이 불가능하다.

Access list 쓰임

- Access List는 라우터를 통과하는 패킷을 목적지로 보낼 것인지 제한할 것인지를 지정해서 불필요한 트래픽은 제거하고 네트워크 자원의 보안을 위해 설정되는 명령어이다. 하지만 반드시 설정이 필요한 명령어는 아니다.

-> Standard Access List

: Source Address만을 체크해서 패킷의 전송 여부를 결정하는 방식으로 특정 프로토콜(FTP, TFTP, Telnet)에 따라 패킷의 전송 허용/제한이 불가능한 방식이다.

-> Extended Access List

: Source Address와 Destination Address 모두를 체크해서 패킷의 전송 여부를 결정하는 방식으로 특정 프로토콜(FTP, TFTP, Telnet)에 따라 패킷의 전송 허용/제한이 가능한 방식이다.

Access List 적용 위치

- Inbound Access List

: 라우터에 수신되는 패킷이 라우터의 Outbound Interface로 전달되기 전에 Access List가 적용된다. 따라서 Filtering에 의해 패킷이 제거되면 라우터 내부에서 처리되는 것이 없기 때문에 qjfey의 라우팅 Lookup ouvehead를 감소시킬 수 있어서 효율적인 방법이라고 할 수 있다.

- Outbound Access List

: 라우터에 수신된 패킷이 Outbound Interface까지 전달된 후 Access List가 적용된다.

라우터의 Inbound Interface에 패킷이 들어왔을 경우 처음에는 라우팅 테이블을 참조해서 목적지에 대한 주소가 존재하면 맞는 인터페이스 패킷이 전송되고, 그렇지 않은 경우에는 버려진다.

인터페이스에 Access List가 설정되어 있는지를 체크하고 없으면 패킷을 보내고, 적용되어 있으면 Access List의 조건을 체크한다.

조건을 체크해서 조건과 일치하면 permit/Deny 설정 상태에 따라 패킷을 전송/폐기한다.

Access List 문법

<Standard>

Router(config)# access-list (access-list-number) {permit | deny} {test conditions}

* access-list-number는 Standard는 1~99, Extended는 100~199번까지 설정이 가능

* permit은 허용을 뜻하고, deny는 거부를 뜻함

* test conditions 는 standard는 L3 정보 밖에 구분하지 못하므로 S.IP를 MT고 뒤에는 wild card mask를 쓴다.

ex) access-list 1 deny 192.168.1.0 0.0.0.255 <-- 1.0 네트워크를 모두 거부한다는 뜻

ex) access-list 1 deny 192.168.1.25 0.0.0.0 <-- 한 대만 거부를 하기에 wild card mask는 0.0.0.0 임

Router(config-if)# {protocol} access-group {access-list-number} {in | out}

* protocol은 tcp, udp를 선택할 수 있다. 또한 ip는 이 둘 모두를 포함한다.

* access-list-number는 위에 룰 설정 했던 번호를 그대로 가져오면 되는 것이다.

* in | out은 inbound 인지 outbound 인지 정해주면 되는 것이다.

ex) ip access-group 1 in <-- 나에게로 들어오는 192.168.1.0 네트워크를 거부한다는 뜻

또한 아무것도 일치할 필요가 없다고 생각되는 것은 any로 대체가 가능하다.

ex) access-list 2 deny any

<Extended>

Router(config)# access-list (access-list-number) {permit | deny} (protocol source)

(source-wildcard) [operator port] (destination) (destination-wildcard) [operator port]

[established] [log]

* L3~ L4까지 필터링 가능

* access-list-number : 엔트리가 속할 리스트를 나타냄, 100~199, 2000~2699 사이에 있는 한 숫자를 사용하여 해당 리스트를 식별 함.

* permit | any : 해당 엔트리가 지정된 어드레스를 허용하는지 또는 차단하는지를 나타냄

* protocol : IP, TCP, UDP, ICMP, GRE, IGRP

* source와 destination : 각기 송신지 및 수신지 IP 어드레스를 가리킴

* source-wildcard와 destination-wildcard : 와일드카드 마스크를 나타냄. 0은 일치해야 하는 위치를 나타내며, 1은 ‘don't care’ 위치를 나타냄.

* operator port : lt(less than), gt(greater than), eq(equal to), neq(not equal to)와 프로토콜 포트 번호

* Established : Inbound TCP에 대해서만 사용, 패킷이 수립된 연결을 사용할 경우(예 : ACK 비트 세트를 가질 경우) established가 설정되어 있으면 TCP 트래픽이 통과한다.

ex) access-list 101 permit udp 192.168.1.0 0.0.0.255 192.168.2.3 0.0.0.0 eq 69

101번 룰 설정은 192.168.1.0 네트워크가 192.168.2.3 한 대 pc의 69번 포트접속을 허용한다.

Router(config-if)# {protocol} access-group {access-list-number} {in | out}

ex) ip access-group 101 in