리눅스를이용한방화벽구축 2005. 5. 인프라보호단 / 보안관리팀
목차 Ⅰ. 서론...1 Ⅱ. 리눅스를이용한방화벽구축방안...1 1. iptables 설치및리눅스커널설정하기...4 Ⅲ. NAT 방화벽설정...20 1. N A T 구성방법...20 2. NAT 룰설정하기...21 Ⅳ. 브리지 (Bridge) 방화벽설정하기...25 Ⅴ. phpfwgen을이용한 iptables 사용하기...31 1. phpfwgen의기능및특징...31 2. phpfwgen 설치및사용하기...32 Ⅵ. GUI를활용한방화벽스크립트구축...39 1. fwbuilder의기능및특징...39 2. fwbuilder의설치및활용...40 < 별첨 #1> DNS 트래픽및 ICMP 트래픽허용...46 < 별첨 #2> iptables 설정스크립트예제...49 < 별첨 #3> NAT를이용한방화벽정책설정예제...49 < 별첨 #4> 브리지방화벽룰설정예제...51
그림목차 [ 그림 1] 각시스템에방화벽설치...1 [ 그림 2] netfilter 홈페이지...2 [ 그림 3] 방화벽에서의패킷이동경로...4 [ 그림 4] -j LOG로생성된로그...12 [ 그림 5] 커널설정화면...18 [ 그림 6] 브리지유틸리티압축해제...33 [ 그림 7] 브리지유틸리티환경설정...33 [ 그림 8] 브리지유틸리티환경설정...34
Ⅰ. 서론 건물의한곳에서화재가발생한후주변으로번지는것을방지하는역할을하는기능이방화벽이듯이전산에서사용되고있는방화벽 (Firewall, 침입차단시스템 ) 의개념은인터넷상의보안사고및위협이주변망이나개인 PC로전파되는것을방지하는역할을하는것이다. 이는특정포트나특정 IP에대한접근통제를기본원칙으로하며, 시스템이나네트워크앞단에설치되어진다. 보안의필요성이강조되면서방화벽의개념은널리알려져있고, 이에대한활용도또한높아지고있다. 이장에서는이러한방화벽기능을상용제품이아닌리눅스 1) 를활용하여구축하는방법에대해알아보기로한다. Ⅱ. 리눅스를이용한방화벽구축방안 리눅스를이용하여방화벽의기능을구축할수있는세가지방법에대해알아보겠다. 첫번째, 리눅스서버자체에방화벽을탑재한것으로시스템자체에방화벽기능이포함되었기때문에각각의리눅스시스템커널에직접방화벽을설치하는경우이다. 규모가크지않고, 개별적인서비스를제공하는시스템이라면이방법을추천한다. 이러한경우기존에서비스중인서버에직접방화벽을소프트웨어적으로설치하는것이므로별도의방화벽장비 ( 시스템 ) 가필요하지않다는장점이있다. 내부망 웹서버 인터넷 라우터 스위치 파일서버 네임서버 DB 서버 [ 그림 1] 각시스템에방화벽설치 1) 리눅스 : 리누스토발즈 (linus torvalds) 에의해개발된운영체제 - 1 -
두번째, 리눅스방화벽시스템이네트워크말단에놓여지는것으로 NAT 2) 또는브리지방화벽이될수있다. NAT 는초기방화벽에서자주사용되었던방법이고최근에도꾸준히사용되고있는방법으로방화벽이일종의게이트웨이또는라우터역할을하는경우이다. 외부와연결되는방화벽의인터페이스 (eth0) 에는공인 IP를할당하고내부의인터페이스 (eth1) 에는사설 IP를할당함으로써방화벽에서공인 IP 를내부의사설 IP의특정포트로매칭시켜주는방법이다. 이를테면, 230.1.2.3 의 80 번으로들어오는패킷을내부의 192.168.1.3의 80번으로매칭시켜주는것이그예이다. 브리지방화벽 3) 역시형태적으로는동일하지만 NAT와는크게다른방식으로서, 리눅스방화벽은단지스위치처럼패킷을받아서스위칭만할뿐 NAT와같은라우팅은하지않는다. 따라서방화벽에는원격에서접속할일이없다면굳이 IP를할당할필요가없으며방화벽내부의각서버는공인 IP를그대로사용하면된다. 즉, 브리지방화벽을통과하는패킷중비정상적인패킷은필터링하고, 정상적인트래픽을허용하는것은 NAT와동일하지만방화벽자체에서라우팅을하는지여부와방화벽내부의서버들이공인 IP를사용하는지사설 IP를사용하는지에따라달라질수있다. 내부망 웹서버 인터넷 라우터 스위치 파일서버 네임서버 DB 서버 [ 그림 2] NAT, 브리지방화벽구조 2) NAT(Network Address Translation)-내부의개별주소와정식 IP주소를상호변환하는기능이다. 개별노드가할당되지않은노드에서도인터넷에접속가능하고, TCP/IP의전송계층이나응용계층의통신규약에대한변환을하여특정 TCP/IP 응용을이용하도록한다. 3) 브리지방화벽-두동일한이더넷환경을연결시켜줌으로써오가는패킷을그대로전달한다. - 2 -
그림상의위치를보면 NAT와브리지방화벽의구조는같아보일수있다. NAT나브리지든관계없이방화벽에랜카드 ( 인터페이스 ) 는최소 2장이상연결되어있어야한다. 하지만 NAT 구조에서는외부와연결된랜카드에는공인 IP가, 내부의스위치로연결된랜카드에는사설 IP가할당되어야한다. 하지만브리지방화벽에서는두랜카드에 IP를할당할필요가없다. 브리지방화벽은그냥스위치라고생각하면되는것이다. 그리고방화벽내부에서는 NAT 의경우모두사설 IP를할당하여야한다. 사설 IP 는네트워크의규모에따라적당히설정하면되는데, 통상적으로 192.168.x.x 대역이나 172.16.x.x 또는 10.x.x.x 대역을주로사용한다. 그러나어떤 IP를사용하든, 네트워크대역에관계없이공통적인사항은내부서버들의게이트웨이는반드시방화벽의사설 IP 에할당된 IP를설정하여야한다. 즉방화벽의내부랜카드인 eth1이내부네트워크의게이트웨이역할을하는것이다. 그렇지않으면내부네트워크에서는전혀통신을할수없게된다. 반면브리지방화벽의내부에서는공인 IP를그대로사용한다. IP 뿐만아니라 netmask나 broadcast등도똑같이설정하면된다. 다시한번강조하지만브리지방화벽은그냥스위치라고생각하면된다. 그럼, NAT를사용하여야할까아니면브리지방화벽을사용하여야할까? 각각의장단점이있는데, 일단브리지방화벽은 NAT에비해편리하다. 내부서버에서도공인 IP를그대로사용할수있기때문에복잡한 NAT를고민할필요가없다. 그리고뒤에서자세히살펴보겠지만방화벽설정에서도 NAT의경우공인 IP 및포트를사설 IP 로포워딩해주거나반대로사설 IP를공인 IP 로포워딩하는 NAT도고려해주고, 또한패킷필터링도고려해주어야하지만브리지방화벽은공인 IP를그대로사용하기때문에패킷필터링만신경쓰면된다. 따라서규칙도브리지방화벽이훨씬단순하다. 그러나 NAT의경우실제서버에서는사설 IP를사용하기때문에 NAT 방화벽에서별도로패킷을포워딩하고또한허용해주지않는한구조적으로외부에서내부로는절대접속할수없다. 따라서극도의보안을추구한다면 NAT가좋은대안이될수있을것이다. 반면브리지방화벽의경우물론규칙설정을확실히하여꼭필요한서비스외에는외부에서의일체접속을차단하여야하지만만약실수에의해허용되었을경우심각한문제가유발될수있으므로주의해야한다. 실수로방화벽의규칙이허용되어있어방화벽이있지만패킷필터링을제대로못할수있기때문이다. 초기에는 NAT가대세였지만최근에는편의성을고려하여 NAT 보다는브리지방화벽이많이사용되고있는추세이다. 각각의방법에대한구체적인설정방법등에대해서는뒤에서자세히알아보도록한다. - 3 -
1. iptables 설치및리눅스커널설정하기 각자위와같은구조에따라서버자체또는 NAT나브리지방식을적절히사용하면될것이다. 이제리눅스방화벽의기본이되는 netfilter 기반의 iptables에대해알아보고이는어떤장점과기능을제공하는지알아본다. http://www.netfilter.org http://www.iptables.org [ 그림 3] netfilter 홈페이지 iptables는다른상용방화벽이제공하는기능을대부분가지고있는데, 그중에서가장대표적인기능또는이전버전에비해향상된기능은다음과같다. 1) 상태추적기능제공 최근의방화벽에서제공하는고급기능중하나인상태추적은방화벽을통과하는모든패킷에대한연결상태를추적 (tracking) 하여이정보를메모리에기억하고있다가기존의연결을가장하여접근할경우메모리에저장된상태목록과비교하여적합하면통과하고그렇지않으면거부하는기능으로서지능화된공격시도를차단할수있는기능중하나이다. 이를테면단순히포트나 tcp flag 등을매칭하여필터링한구버전의방화벽에서기존의연결없이단지 ack flag를설정한 tcp 패킷이들어온다면이미연결중인트래픽으로판단하여허용하지만상태추적이제공될경우 - 4 -
에는아무리 ack flag를달고들어온다하더라도이전의접속목록에 syn 및 syn/ack 와관련된정보가없기때문에비정상트래픽으로간주하여필터링하게되는것이다. iptables 이전버전인 ipchains 와같이상태추적을제공하지않는방화벽은 stateless 라고하며지금부터알아볼 iptables 와같이상태추적이제공되는방화벽은 stateful 이라고한다. 2) 향상된매칭기능제공 iptables는방화벽에서기본적으로제공하는매칭정보인패킷의소스 ip, 목적지 ip 및소스포트, 목적지포트번호뿐만아니라추가적으로다양한매칭기능을제공하고있다. 이를테면상태추적을통한현재의연결상태나하드웨어 MAC 주소, 패킷발신자의유저나그룹프로세스, ip 헤더의 TOS(Type Of Service) 등여러가지조건을이용하여세부적이고복잡한매칭및필터링이가능하다. 물론일부기능은추가적으로커널패치를통해구현할수있다. 3) 포트포워딩 (port forwarding) 기능포함제공 이전버전인 ipfw이나 ipchains를사용할때는 NAT를이용하기위해서별도로분리되어있던툴인 ipmasqadm을사용하여야했으나 iptables에는 NAT 기능이자체적으로포함되어있어 NAT를위해별도의프로그램을이용할필요가없이커널메뉴에서추가로지정해서컴파일해주면 iptables만으로도바로사용할수있다. 2.6버전이아닌 2.4버전의커널사용시에는아래와같은커널설정확인을거쳐야한다. STEP 1. KERNEL 설정하기 ( 버전 2.4 기준 ) 커널소스디렉토리에서 make config나 make menuconfig를실행하여커널메뉴로들어가면된다. 나머지는각자환경에따라적용하기바라며커널 2.4 버전의경우아래와같이보이게된다. 이중에서방화벽관련설정은 Networking options 부분에정의되어있으므로이메뉴를선택하도록한다. 매우많은선택메뉴들이있는데, 가장기본적인메뉴만위와같이선택하도록한다. 만약모듈 (module) 로선택하였을경우에는이후에해당모듈을로드 (load) 해주어야한다. 그리고선택하려는메뉴가어떤기능과역할을하는지모른다면해당메뉴에서우측의 Help를클릭하면상세한안내를볼수있으니참고하면된다. 그럼다음과같은순서로 KERNEL을설정하도록해보자. STEP 2. iptables 설치하기 - 5 -
1 Kernel 메뉴설정 make config ( 또는 make menuconfig) 입력 Networking options 선택 2 netfilter 설정확인 IP Netfilter Configuration 선택 3 netfilter 설정확인 Connection tracking 선택 - 6 -
4 netfilter 설정확인 LOG target support 선택 최근의리눅스배포판에서는별도로커널컴파일을하지않고 CD로설치된상태에서도기본적으로 iptables 방화벽기능이모듈로작동하고있지만가급적커널컴파일을통해불필요한기능은끄고, 꼭필요한기능만사용하도록하는것을권장한다. 하지만커널컴파일에익숙하지않다면이과정을생략하고바로 STEP 3. iptables 를활용한룰설정 을익혀도된다. iptables 방화벽은시스템의응용프로그램수준이아니라커널수준에서작동하기때문에먼저커널에서방화벽이작동할수있도록설정하여야한다. 이를위해서는커널소스를다운받아커널컴파일을하여야하는데, 소스파일은아래 URL에서다운로드할수있다. 그럼다음과같은순서로설치하도록하자. 1 iptables rpm 제거 rpm -q iptables : 먼저 RPM 명령어를이용하여기존의 iptables 버전을확인한다. rpm -e iptables --nodeps : 최신버전이아니라면기존의 iptables 패키지를삭제하여새로설치할준비를한다. - 7 -
2 iptables 소스다운받기 wget http://www.iptables.org/files/iptables-1.2.11.tar.bz2 : wget이나 lynx를이용하여 iptables 최신소스다운을받는다. bunzip2 -d iptables-1.3.1.tar.bz2 : 다운받은파일의압축을푼다. 3 소스압축풀기 rm -f linux : 링크를확인후존재한다면, 삭제한다. linux 디렉토리가다른디렉토리로링크되어있는지확인한다. tar xvf iptables-1.2.11.tar : tar 압축된파일을푼다. - 8 -
4 iptables 디렉토리로이동 cd iptables-1.2.11 : 압축을푼디렉토리로이동한다. 5 ipatbles 컴파일 make KERNEL_DIR=/boot : make를이용하여컴파일한다. KERNEL_DIR을커널디렉토리로지정해준다. 6 iptables install 하기 make install : 컴파일후인스톨을수행한다. KERNEL_DIR 을커널디렉토리로지정해준다. - 9 -
7 설치확인하기 cd /usr/local/sbin/ : 설치된파일을확인하기위해설치폴더로이동하여파일을확인한다. 상기와같은파일이존재한다면설치는이상없이완료되었음을확인할수있다. < 참고 > 선택항목설명각각의환경에따라적당히선택한후커널컴파일한후시스템을재부팅하면새로운커널로적용할수있게된다. 커널적용이된후방화벽관리명령어인 iptables를설치하여사용하도록한다. 만약 iptables rpm 등이설치되어있다면먼저 rpm 버전을삭제한후최신버전의소스를받아설치하는것이좋다. STEP 3. table. chain, rule 이해하기 방화벽관련문서나서적을보면테이블 (table) 이나체인 (chain), rule( 룰 ) 이라는용어가자주나오는데, 먼저테이블은방화벽에서특정한기능을제공하는것을기본적으로 filter, nat, mangle 이렇게 3개가있는데, 각각은별도의기능을가지고있다. 이를테면 filter 테이블의경우이름이뜻하듯이패킷을필터링하는기능을가지고있으며 nat 의경우패킷을필터링하지는않고단순히패킷의소스나목적지주소를변환시켜주는역할을하며 mangle은패킷의특성을변경하거나지정하는기능을한다. 룰을사용할때특정한 table을언급하려면 "iptables -t filter" 와같이 -t [table명] 의형식을사용하면된다. 만약 -t를생략하고별도의언급이없을경우에는기본적으로 filter 테이블이사용된다. 그만큼패킷필터링이 iptables의핵심적이고기본적인기능이라고생각하면된다. - 10 -
filter 테이블방화벽의가장핵심적인테이블로서특정룰에따라서패킷을필터링하거나허용하는역할을한다. filter 테이블에는기본적으로 3개의 chain이있는데, INPUT은외부에서방화벽자체로향하는패킷에대한필터링을담당하며, FORWARD는방화벽을통과하여방화벽이보호하는다른서버등으로향하거나내부의다른서버에서방화벽을통해외부로나가는패킷에대한필터링, OUTPUT은방화벽자체에서외부로나가는패킷에대한필터링을담당한다. 즉, 한대의리눅스서버자체내에서웹서비스등일반서비스와함께패킷필터링을제공하고자할경우 FORWARD는사용하지않고, INPUT과 OUTPUT chain만사용하면될것이다. 그리고리눅스를전용방화벽장비로설정하여보호하고자하는서버의앞단에설치할경우에는 FORWARD chain을사용하여내부의서버들에대한패킷필터링정책을설정하면될것이다. nat 테이블 nat 테이블은패킷을필터링하는기능은없으며단지방화벽으로향하는패킷을방화벽이보호하는내부네트워크의다른주소로포워딩하거나방화벽내부네트워크에서방화벽을통해외부네트워크로나갈때다른 ip주소로변환하는역할을한다. nat 는 POSTROUTING 과 PREROUTING chain 이주로사용되는데, POSTROUTING 은 Source NAT(SNAT) 타겟과매칭되어내부네트워크에서방화벽을통해외부로나갈때사용되며, PREROUTING은 Destination NAT(DNAT) 타겟과매칭되어주로외부에서방화벽내부서버로향하는패킷을방화벽이보호하는내부서버로포워딩할때사용된다. 즉, POSTROUTING은사무실등에서사설ip를사용하면서하나의공인 ip로인터넷을공유하고자할때즉, 공유기의용도로사용할수있고 PREROUTING은사설 ip 로서버를운영하면서외부로서비스를하고자할때사용된다. mangle 테이블이는그리자주사용되지는않지만알아둘필요는있다. mangle 은패킷의 TTL이나 TOS 값을변경하거나매칭할때사용되는데, mangle 테이블은 PREROUTING과 OUTPUT chain 으로이루어져있다. PREROUTING에서는라우팅경로가결정되기전에방화벽으로들어오는패킷에대해변경하거나매칭하고, OUTPUT chain에서는내부에서생성된패킷이방화벽을통해나갈때변경하거나매칭한다. 다음으로체인 (chain) 은패킷이이동하는경로를나타내는데, 각각의 table은각각의다른 chain을가지고있다. 예를들면 filter 테이블의경우 INPUT, FORWARD, OUTPUT chain 등이있다. rule은각각의 chain 에설정하는일련의방화벽정책을뜻한다. chain과관련하여그렇다면패킷은어떠한경로, 즉어떤 chain을통해이동하는지에대해알아보도록하자. 다음그림에서와같이방화벽으로향하는패킷은라우팅경로에따라크게두갈래로나누어진다. 즉, 방화벽자체로향하는패킷과방화벽을통과하여방화벽내부에위치한다른서버를향하는패킷에따라패킷경로가아래그림에서좌측또는우측으로갈라지게되는것이다. 따라서첫번째경우인서버자체방화벽을운영할경우즉, 리눅스서버자체에서비스하면서시스템내커널에방화벽기능을활성화하여방화벽을가동할경우에 - 11 -
는패킷이좌측의경로를따르게되고, NAT나브리지방화벽을사용하여패킷을방화벽내부의서버로포워딩이나스위칭할경우에는우측의경로를따르게된다. 그러나이와관계없이 mangle table의 PREROUTING chain, nat table의 PREROUTING chain, POSTROUTING chain은공통적으로거쳐가는것을알수있다. [ 그림 4] 방화벽에서의패킷이동경로 STEP 4. iptables 명령어사용익히기 iptables를사용할준비가되었으므로이제 iptables의명령어사용방법, 즉 rule 설정방법에중요한몇가지만알아본다. iptables 의기본적인명령어용법은다음과같다. iptables [-t table 명 ] 명령어 [ 매칭옵션 ] [ 타겟 ] 제일먼저지정할것은사용할 table명을설정하는것인데, 앞에서언급한바와같이별도로 table명을지정하지않을경우에는 filter 테이블이사용된다. 즉, 패킷을필터링하기위해서는 filter 테이블을사용하게되는데, 이때 -t filter 와같이언급해도되고, filter 는기본값이므로별도로지정하지않아도무방하다. 그러나 nat 나 - 12 -
mangle 기능을이용하려면반드시 -t nat, -t mangle 과같이해당테이블명을명시하여야하며그렇지않으면 filter 테이블로인식하게되므로주의하여야한다. 그리고테이블명다음에는매칭옵션 ( 이를테면 tcp 인지, 목적지 ip 가무엇인지, 포트번호가무엇인지등 ) 을현재테이블에추가할것인지 (append 또는 insert) 삭제할것인지 (delete) 등의명령어를지정하게된다. 다음으로는어떠한패킷을필터링하거나 nat 또는 mangle할것인지매칭옵션을지정할수있는데, 이를테면어떠한 ip 주소를소스로한패킷인지, 어떠한인터페이스를통과하는지또는정책을설정할패킷이 tcp인지, udp인지등이그것이다. 마지막으로이룰에매칭되는패킷이있을경우이패킷을통과시킬것인지아니면거부할것인지등을타겟 (target) 에서지정할수있다. 1) 기본명령어 iptables에서제공하는옵션과명령어는매우많아서어디에서부터보아야할지막막한것이사실이다. 여기에서소개하는명령어는기본적으로알고있어야할부분이므로천천히읽어보면된다. -A, --append 예 : iptables -A INPUT -A 를이용하여룰을입력하면입력한룰은지정한 chain의제일마지막에추가된다. 즉위예와같이실행하였을경우, INPUT chain 의제일마지막에추가되는것이다. 방화벽에서는어떤룰이먼저설정되었는가에따라패킷허용및차단의결과가크게달라질수있으므로룰의순서를주의하여야한다. 여기에서 -A 는실행한순서대로제일마지막에추가되는데반해 insert의의미인 -I 를입력하였을경우에는룰의제일앞에위치하게된다. 또한가지주의할것은대소문자의구별인데, 경우에따라대문자와소문자의의미가달라질수있으므로주의하여야한다. -D, --delete 예 ) iptables -D INPUT -p tcp --dport 80 -j DROP iptables -D INPUT 1 -D 또는 --delete 는룰을잘못입력했거나필터링정책이변경되었을경우이미입력한룰을테이블에서삭제하는명령어이다. -D를이용하여룰을삭제하는방법은두가지로나눌수있는데, 첫번째예제처럼룰을추가할때사용했던완전한룰을지정하되 -A 나 -I 대신 -D를사용하는방법도있고두번째예제처럼입력한룰의순서대로지정된번호를이용하는방법도있는데, 일반적으로첫번째방법을더많이이용한다. -I, --insert 예 )iptables -I INPUT -p tcp --dport 80 -j ACCEPT 앞에서도잠깐언급했듯이 -I 또는 --insert는 -A 와같이해당 chain 에룰을추가하는것이다. 그러나, -A 는 chain 의제일마지막에추가하는것과는달리 -I 는 chain의제일처음에추가된다는차이가있다. -I 는일반적으로먼저룰이적용된상태에서새로운룰을테스트하고자할때또는임시로특정한룰을적용하고자할때사용된다. -L, --list 예 )iptables -L INPUT - 13 -
-L 은 list의의미로커널메모리에로드되어적용되어있는 chain 의룰목록을보여준다. 위예제의경우 INPUT을지정하였으므로현재 INPUT chain 에설정되어있는룰을보여준다. 이때 -n 을함께사용하면 ip 주소및서비스명에대해역질의를하지않는다. 그리고 -v와함께사용하면각각의룰에매칭된패킷의개수 (pkts) 와바이트 (bytes) 정보도보여준다. -F, --flush 예 ) iptables -F INPUT -F 는모든룰을플러싱 (flushing) 또는삭제하는명령어이다. -D 가룰을한개씩삭제하는것과달리 -F 는모든룰을한꺼번에삭제하는명령어라고할수있다. 위예와같이 -F 다음에 INPUT 을지정할경우에는 INPUT table 에있는모든룰을삭제하게되고, 아무것도입력하지않을경우에는 filter 테이블내모든룰을삭제하게된다. 따라서 nat나 mangle 테이블에있는룰을초기화하려면 "iptables -t nat -F" 나 "iptables -t mangle -F" 와같이테이블명을지정해주어야한다. -F 는주로새롭게룰을생성하고자할때혹시남아있을지모르는룰을깨끗하게삭제하기위해사용되는데, 주의할점은 -P( 뒤에서살펴본다.) 로지정한기본정책은변경되지않는다는것이다. 즉, INPUT의기본정책을 DROP 으로설정한후특정 ip 에서의접속을허용하는룰을생성한후 -F 로룰을초기화하게되면허용하는룰은삭제되고기본정책인 DROP 은그대로남게되므로일체의모든접속이거부되므로주의하여야한다. -N, --new-chain 예 ) iptables -N TEST -N 은새로운 chain 을생성하는명령어이다. 앞에서언급한것처럼새로운 chain 을생성할수는있지만새로운 table은생성할수없다. 일반적으로룰이단순하다면굳이 chain을생성할필요는없지만반복적이고복잡하다면생성해서사용하는것도효율적이다. -X, --delete-chain 예 )iptables -X TEST -X 는지정한 chain 을삭제하는명령어이다. 그러나아래와같이기본적으로내장되어있는 OUTPUT chain을삭제하려고하자, built-in 이라삭제되지않는것을알수있다. 왜냐하면 INPUT 이나 FORWARD, OUTPUT chain 은 - 14 -
filter 테이블에서반드시있어야할기본 chain 이기때문이다. -P,--policy 예 ) iptables -P INPUT DROP -P 는앞에서잠깐언급했듯이지정한 chain 에대한기본정책 (default policy) 을의미한다. 이를테면방화벽으로들어오는패킷은 INPUT 테이블에지정된룰순서대로매칭이되는지점검하게되는데, 만약 INPUT 테이블에있는모든룰에매칭되지않을경우에는기본정책인 -P 에서지정된정책이적용되는것이다. 일반적으로기본정책에서는 DROP을설정하고 (REJECT 는지원하지않는다.) 세부룰에서특정한패킷을허용 (ACCEPT) 하는정책을설정한다. 물론정책에따라그반대도있을수있을것이다. 참고로기본정책을설정할때는 -j 를사용하지않는다. 2) 매칭옵션 일반적으로한룰에서매칭옵션을많이지정하면할수록좀더세부적인패킷을지정하게된다. -p, --protocol 예 ) iptables -A INPUT -p tcp -p 옵션은 tcp 나 udp, icmp 처럼매칭되는프로토콜 (protocol) 을지정하는데, not의의미인느낌표 (!) 를함께사용할수도있다. 즉, -p! tcp 는 tcp가아닌즉 udp와 icmp를의미하는것이다. 소문자인 -p 가 protocol 을의미하는대신, 앞에서살펴보았던대문자인 -P는기본정책을의미한다는것을주의하기바란다. -s, --source 예 ) iptables -A INPUT -s 192.168.1.0/24 -s 옵션은패킷의소스 (source) ip 주소를뜻하는데, 192.168.1.1 과같이단일한하나의 ip주소를지정할수도있고, 192.168.1.0/255.255.255.0 이나 192.168.1.0/24 와같이넷마스크나 CIDR 를사용하여 ip 대역을지정할수도있다. 물론단일한 ip를지정할경우 netmask를 255.255.255.255로사용하거나 CIDR 는 /32를지정해도된다. 만약위의예와같이사용할경우에는 192.168.1.x 대역의모든 ip 주소대역에서들어오는패킷을뜻하게되며 -s를지정하지않을경우에는 ip 와관계없이모든곳으로부터오는패킷을뜻하게된다. -d, --destination 예 ) iptables -A INPUT -d 192.168.1.2 -s 옵션이패킷의소스 ip 주소를의미하는데반해 -d 옵션은목적지 (destination) 주소를뜻한다. 문법은 -s 와동일하며 -d 를지정하지않으면모든목적지에대한매칭이된다. 만약위와같이 -s가없이 -d만지정되어있으면목적지 ip 인 192.168.1.2 로향하는모든패킷을뜻하지만 -s 192.168.1.1 -d 192.168.1.2 와같은경우소스 ip 가 192.168.1.1 이면서목적지ip 가 192.168.1.2 인패킷을뜻한다. 여기에서 이면서 는그리고 (and) 의개념이지또는 (or) 의개념이아니라는점을주의하기바란다. - 15 -
-i, -o 예 ) iptables -A INPUT -i eth0 -i 또는 -o 는 eth0 이나 eth1, lo 등과같이어떤인터페이스에서들어오거나나가는패킷인지지정하는옵션이다. -i 는 in 으로서들어오는인터페이스를, -o 는 out 으로서나가는인터페이스를의미한다. 인터페이스가여러개연결되어있는복잡한네트워크에서유용하게사용할수있는데, 만약 eth0 과같이 1개의인터페이스만설정되어있다면어차피인터페이스는하나이므로굳이인터페이스를지정할필요가없다. --sport, --dport 예 ) iptables -A INPUT -i eth0 -p TCP -s 192.168.5.3 --sport 1024:65535 --dport 161 --sport 은패킷의소스포트를, --dport 는목적지포트를의미하는데, 이옵션을사용할때에는 -p tcp 나 -p udp 와같이 tcp 인지 udp인지반드시명시하여야한다. 아울러앞에서살펴본 ip 주소의경우에는 -s, -d 와같이 -이 1개이지만포트번호의경우에는 --sport, --dport 와같이 - 이 2개라는것을주의하기바란다. --sport 와 --dport 는위의예와같이함께사용할수도있고, --sport 또는 --dport 하나만사용할수도있다. 물론지정하지않을경우에는모든포트를뜻하게되므로 "-s 192.168.5.3 --sport 1024:65535" 와같은경우에는목적지포트는관계없이소스 ip 는 192.168.5.3 이면서소스포트는 1024부터 65535 까지인패킷을뜻하게된다. 또한사용할때에는 --dport 161과같이특정포트를지정할수도있고 --sport 1024:65535 와같이특정포트의대역을지정할수도있다. 만약 1024: 만지정하였을경우에는 1024부터 65535까지를의미하며 :1024 만입력하였을경우에는 1024 이하즉 0부터 1024 까지를의미한다. 그리고 not 의의미인! 을함께이용할수도있는데, 1024:65535는 1024부터 65535 까지가아니므로 0:1023의의미와동일하다. --tcp-flags 예 )iptables -A INPUT -p TCP --tcp-flags ACK,FIN FIN tcp 는 udp나 icmp 와달리패킷의특성상 SYN,ACK,FIN,PSH,URG,RST 등 6개의 tcp-flags 라는것을가지고있다. 이를테면접속을요청하는 tcp 패킷의경우패킷에 SYN 비트가설정되고, 요청에대해응답을할경우에는 ACK, 접속을종료할경우에는 FIN 비트가설정된다. iptables 에서는이러한 tcp-flag 을지정하여관리자가의도한특정한패킷에대한매칭을할수있는데, 이는 tcp-flags 사이의 blank 를기준으로좌측은체크할 tcp-flags를, 우측에는체크한항목중매칭되는 tcp-flags을의미한다. 즉, 위의예에있는룰을예로들면, INPUT chain 을통하여들어오는 tcp 패킷에서 6개의 tcp-flags중모두살펴볼필요없이 ACK와 FIN 부분만살펴보아서 ACK는없이 FIN 만설정되어있는패킷을뜻한다. 즉, ACK 비트가없는 FIN 패킷을의미하는것이다. 그리고여기에서는 ACK와 FIN만체크하였으므로 SYN 비트나 PSH등다른 tcp-flags가있거나또는없어도관계없다. 이외 ALL 은모든 tcp-flags 을의미하며, NONE 은아무런 tcp-flags 가없는것을뜻한다. --syn 예 ) iptables -A INPUT -p tcp --syn -j DROP tcp에서 syn 비트가설정된패킷의의미는남다르다. 왜냐하면 syn 비트가설정된패킷은 tcp 연결을맺기위해제일먼저보내어지는이른바접속요청패킷이기때문이다. 만약위의예와같이들어오는 tcp 패킷중 syn 비트가설정된패킷을거부하였다면모든 tcp 접속연결요청은거부될것이다. 그러나방화벽에서외부로접속요청하였을경우에는 OUTPUT 에서는 syn 이지만 syn 에대한응답인 INPUT 에서는 syn 이아니라 syn 과 ack 비트가함께설정된패킷이들어오게되므로내부에서는외부로 tcp 접속을할수있게 - 16 -
된다. --syn 은! 과함께사용하여! --syn 과같이사용될수있는데, 이때에는이미접속된 tcp 연결을의미하게된다. --icmp-type 예 ) iptables -A INPUT -s 192.168.1.1 -p ICMP --icmp-type echo-request tcp 나 udp 는포트번호로상호어떤서비스인지구별한다. 즉, 같은 tcp 라도 23번은 telnet, 80번은 http, 110번은 pop3인것이그것이다. 그러나, icmp 는 tcp 나 udp 와달리포트의개념이없으며대신 icmp-type 과 code 라는것을사용하여구별한다. tcp 나 udp 의경우포트번호대신포트이름 ( 예 : http) 을써도되는것과같이 icmp-type 을지정할때에는정확한 type 이름을써도되고해당이름에대한번호를지정해도된다. 그러나가급적 tcp 나 udp 는포트번호로, icmp 는 type 이름을설정하는것이더욱명료하고권장된다. icmp-type과 code 에대해서는 http://www.iana.org/assignments/icmp-parameters 를참고하기바란다. 위예의경우 INPUT chain 을통해들어오는패킷중소스주소가 192.168.1.1 이면서 icmp-type이 echo-request 인 icmp 패킷을의미하는것이다. 여기에서프로토콜을뜻하는 -p 다음의 icmp 는위와같이대문자로써도되고소문자로써도된다. -m state 예 ) iptables -A INPUT -p TCP! --syn -m state --state NEW -m state 는상태추적 (Connection State) 에서사용되는것으로상태추적에서는 NEW, ESTABLISHED, RELATED, INVALID 이렇게 4가지의상태를제공한다. 여기에서 NEW는새롭게연결을시작하려하거나이전의연결추적테이블에보이지않는패킷을의미한다. tcp 의경우연결을맺기위한정상적인 syn 패킷이여기에해당할것이다. ESTABLISHED 는클라이언트의연결시도후서버에서응답하여이미연결되어있는상태를의미하며연결이맺어진이후의 tcp ack 메시지나이미데이터가오간 udp 또는 icmp echo-request에대한 icmp echo reply 메시지등이이에해당한다. RELATED 는새롭게연결을시작하려고하나이미연결추적테이블에접속과관련있는 ESTABLISHED 가있는경우를뜻한다. 주로 icmp 에러메시지가여기에속하며 ftp 접속시사용하는두번째포트인 ftp-data(tcp 20번등 ) 가대표적인경우이다. 마지막으로 INVALID는연결상태를알수없거나잘못된헤더를가지고있는경우를뜻한다. 예는들어오는 (INPUT) tcp 패킷 (-p tcp) 중 syn flag가설정된패킷이아니면서 (! --syn) 연결추적테이블에는처음보이는패킷 (-m state --state NEW) 을의미한다. 연결추적테이블에처음보이는 tcp 패킷이라면정상적이라면 syn 패킷이외에는없을것이므로따라서위의룰에매칭되는패킷은위조된패킷이나비정상적인패킷일것이다. 3) 타겟 (target) iptables를이용한룰의제일마지막부분인타겟에대한설정부분이다. 지금까지는임의의조건에대한패킷을지정하는부분이었고, 이러한룰에매칭되는패킷이있을경우어떻게처리할것인지를지정하는부분이바로타겟이되고, -j 타겟 형식으로지정하면된다. -j 뒤의타겟에는 ACCEPT, DROP, LOG, SNAT, DNAT 등이올수있다. ACCEPT는말뜻그대로룰에매칭되는패킷을허용한다는의미이 - 17 -
며, DROP은패킷을필터링 ( 거부 ) 하는것을뜻한다. LOG는단지해당하는룰에매칭되는패킷정보를로그에남긴다는의미이며그자체로로그만남길뿐허용하거나거부하는등의다른액션을취하지는않는다. 그리고, SNAT와 DNAT는 NAT 즉, 주소변환을한다는것을의미한다. 몇가지타겟에대해좀더알아보자. - log target 룰에매칭되는패킷을 LOG 타겟으로보내면패킷의 ip 주소등의정보를로그에남기도록하며, 이정보는 dmesg 등의명령어나 /var/log/messages 파일또는임의로지정한다른파일에서확인할수있는데, 주로룰이정상적으로작동하는지디버그할때나방화벽에서필터링된패킷의로그를보고자할때사용될수있다. LOG에서주로사용하는옵션은 --log-level 과 --log-prefix 가있는데, --log-level 에서는 syslogd 에서제공하는것처럼어떠한로깅레벨을사용할것인지정할수있다. 그리고 --log-prefix를이용하면매칭되는패킷에대해로그정보를남길때로그앞에어떤메시지 ( 일종의말머리 ) 를남길것인지지정할수있다. 이를테면 iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT tcp packets" 와같이지정할경우이룰에매칭되어저장되는모든로깅정보앞에는 INPUT tcp packets 라는문자열이붙게되는것이다. [ 그림 5] -j LOG 로생성된로그 위그림의경우들어오는패킷중 icmp에대해서로그를남기도록설정한예인데, 설정후 /var/log/messages 파일을보면위와같이로그가생성된것을알수있다. - REJECT 타겟 REJECT는 DROP 과같이룰에매칭되는패킷을거부하지만 DROP이패킷을거부한후어떠한추가적인동작이없는반면 REJECT는패킷거부와함께패킷의소스주소로패킷이거부되었다는에러메시지를발송한다는차이가있다. 패킷을 REJECT할때는프로토콜에따라다른데, 만약 TCP인경우에는 reset 비트가설정된 TCP 패킷으로또는 ICMP 패킷으로응답하고, 이외 UDP 등의패킷일경우에는 ICMP 패킷으로응답한다. - 18 -
- NAT 에서의타겟 iptables에서제공하는 NAT를이용하면크게두가지용도로활용할수있다. 첫번째는일종의인터넷공유기로서내부네트워크에서는사설 ip를사용하면서 NAT 방화벽을통과하여외부네트워크로나갈때는공인 ip를소스로한주소로변환되어사용하는경우이다. 두번째는반대로외부에서공인 ip로들어오는접속요청이 NAT 방화벽을거치면서내부의사설ip 로변경되는경우로서웹서버등을구축하여서비스를제공할때실제서버들은사설 ip를운영하면서서버앞단에설치되어있는방화벽에서공인 ip 로들어온요청을내부사설 ip의특정포트로포워딩을하는경우이다. NAT를사용할때는리눅스서버를방화벽전용으로사용하여야하며내부네트워크와외부네트워크를연결해주므로최소한두개의인터페이스가연결되어있어야한다. NAT에서는 Source NAT(SNAT), Destination NAT(DNAT), 마스커레이드 (MASQUERADE), REDIRECT 이렇게네가지종류의타겟을지원하며이타겟을사용하려면 -t nat 을함께사용하여야한다. 아울러또하나중요한것은 NAT 방화벽을통과하는패킷을공인에서사설또는사설에서공인등다른서버나장비로포워딩해주어야하므로방화벽이설치된시스템에서는커널파라미터인 net.ipv4.ip_forward 가반드시 on 의의미인 1로설정되어있어야한다. 이값을 1 로설정하려면 echo 1 > /proc/sys/net/ipv4/ip_forward 또는 sysctl -w net.ipv4.ip_forward=1 을실행하면된다. STEP 5. iptables 를활용한보안룰설정하기 이제지금까지살펴본 iptables의정보를활용하여구체적인룰을설정해보고실제서비스중인서버에직접방화벽을탑재하여운영하는서버자체형태의방화벽을구현해보도록하자. 리눅스시스템자체를방화역의용도로만사용하는 NAT 나브리지방식은다음에알아보도록한다. 그럼, 이제부터 iptables를이용하여각서비스에대한보안정책을다음과같이설정하여사용해보도록하자. 1 룰초기화하기 iptables -L : 현재설정된룰을확인하다. iptables -t filter -F : filter 룰을삭제한다. iptables -t nat -F : nat 룰을삭제한다. iptables -t mangle -F : mangle 룰을삭제한다. - 19 -
iptables를이용하여방화벽룰을설정할때제일먼저하여야할일혹이미존재할지모르는기존의룰을모두삭제하는것이다. iptables -L을실행하여현재설정된룰을확인하여하나하나삭제해도되지만기존에존재하는모든룰을한꺼번에삭제할수있는데, 이러한것을플러싱 (flushing) 한다고한다. 다음과같이특정한 chain을지정하지않을경우에는 INPUT이나 OUTPUT등모든테이블의룰을동시에초기화한다. 2 Loopback 트래픽허용하기 iptables -A INPUT -i lo -j ACCEPT : Loopback에대해 INPUT을허용한다. iptables -A OUTPUT -o lo -j ACCEPT : Loopback에대해 OUTPUT을허용한다 루프백인터페이스는시스템내부의가상인터페이스이므로루프백과관련된모든트래픽은허용하는것이좋다. 현재자신의시스템에서루프백트래픽이사용되는지알아보려면간단히 tcpdump -i lo 로확인해보기바란다. 여기에서 -i 는 interface 의의미이다. 위그림은 lo 인터페이스를통해들어오는패킷과 lo 인터페이스를통해나가는패킷을허용설정한예이다. 이룰에서의 -i 은 in 의의미이고, -o 은 out 의의미이다. 3 기본정책 (default policy) 설정 iptables -P INPUT DROP : INPUT 정책의기본은 DROP으로설정한다. iptables -P FORWARD DROP : FORWARD 정책의기본은 DROP으로설정한다. iptables -P OUTPUT ACCEPT : OUTPUT 정책의기본은 ACCEPT으로설정한다. 기본정책은앞에서설명한바와같이지정한모든룰에매칭되지않을때최종적으로매칭되는것으로대문자인 -P 로표현하며 ACCEPT, DROP 둘중에하나가사용된다. 기본정책으로 REJECT는사용하지않으며 -j DROP 과같이 -j 를사용하지않는다는점을주의하기바란다. 대부분기본정책으로 DROP을설정하는데, 특히원격에서설정시에는사전에허용정책이없으면접속자체가끊겨버리므로주의하여야한다. 상기의내용은 INPUT, FORWARD, OUTPUT 에대해기본정책을설정한예인데, 자체방화벽에서 FORWARD 는사용하지않기때문에 DROP을설정하였고, 들어오는패킷만제대로처리하면되므로 OUTPUT은 ACCEPT를설정하고 INPUT은 DROP을하였다. 여기에서 - 20 -
OUTPUT을 ACCEPT 로설정한이유는어차피 INPUT 과 OUTPUT이동시에 ACCEPT 되어야통신이될수있는데, OUTPUT 만 ACCEPT 해두면외부에서내부로들어오는패킷에대해서는엄격하게통제하되내부에서외부로나가는트래픽에대해서는허용하는것이좋기때문이다. 이는뒤에서살펴볼상태추적을통해이미연결을맺어연결이성립된 ESTABLISHED 와 RELATED 상태는모두허용하도록하였기때문에가능하다. 4 상태추적설정 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT : INPUT 룰에의해허용된트래픽을지속적으로허용한다. iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT : OUTPUT 룰에의해허용된트래픽을지속적으로허용한다. 상태추적이제공되지않는 stateless 구형방화벽의경우매번들어오고나가는패킷마다패킷을허용할것인지혹은차단할것인지여부를체크하여야했지만상태추적을이용하면이미룰에서허용이된트래픽의경우뒤이어전송되는모든패킷을다시첫번째룰부터검사할필요없이바로허용할수있다. 이것이바로상태추적의가장큰장점중하나이다. 따라서아래두줄을방화벽룰설정시가능한먼저설정해주면룰이단순해지고더욱효율적이라할수있다. 아래에서 ESTABLISHED 와 RELATED 는이미 NEW 를통해트래픽이허용된후이와관련되어통신하는패킷에대한허용설정이므로 NEW 에서만제대로설정해주면된다. 5 사설 IP 주소로필터링 iptables -A INPUT -s 10.0.0.0/8 -j DROP : 소스 IP가 10.0.0.0/8인패킷을차단한다. iptables -A INPUT -s 172.16.0.0/12 -j DROP : 소스 IP가 172.16.0.0/12인모든패킷을차단한다. iptables -A INPUT -s 192.168.0.0/16 -j DROP : 소스 IP가 192.168.0.0/16인모든패킷을차단한다. iptables -A INPUT -s 224.0.0.0/4 -j DROP : 소스 IP가 224.0.0.0/4인모든패킷을차단한다. iptables -A INPUT -s 240.0.0.0/5 -j DROP : 소스 IP가 240.0.0.0/5인모든패킷을차단한다. IANA(http://www.iana.org/) 에서특별한목적으로사용하기위해예약해둔사설 ip 대 - 21 -
역이있다. 이러한 ip 주소는 RFC1918(www.ripe.net/db/rfc1918.html) 에명시되어있는데, 특별한목적으로사용될뿐공인네트워크인인터넷에서는라우팅될수없기때문에다음과같이사설 ip 주소를소스로하여들어오는트래픽은위조된트래픽이므로차단하여야한다. 6 루프백 (Loopback) IP 주소차단 iptables -A INPUT -i eth0 -s 127.0.0.0/8 -j DROP : 인터페이스 eth0를통해들어오는 127.0.0.0/8 인 IP 주소를차단한다. 루프백 ip 주소는내부의루프백인터페이스 (lo) 를통해서만통신하기때문에루프백주소를소스로해서 eth0과같이외부인터페이스를통해들어오는트래픽은위조된트래픽일가능성이높으므로, 보안상차단하는것이좋다. 7 예약된 IP 주소차단 iptables -A INPUT -i eth0 -s 0.0.0.0/8 -j DROP : 인터페이스 eth0를통한 IP주소가 0.0.0.0/8 인트래픽을차단한다. iptables -A INPUT -i eth0 -s 169.254.0.0/16 -j DROP : 인터페이스 eth0를통한 IP주소가 0.0.0.0/8 인트래픽을차단한다. iptables -A INPUT -i eth0 -s 192.0.2.0/24 -j DROP : 인터페이스 eth0를통한 IP주소가 0.0.0.0/8 인트래픽을차단한다. iptables -A INPUT -i eth0 -s 248.0.0.0/5 -j DROP : 인터페이스 eth0를통한 IP주소가 0.0.0.0/8 인트래픽을차단한다. 0.0.0.0/8 과 248.0.0.0/5는예약된 ip 대역이며 169.254.0.0/16 은 DHCP등에서임시로사용하는대역이며 192.0.2.0/24 는 TEST-NET 대역이다. 기타차단하고싶은 IP에대해상기와같은방법으로차단하도록한다. 8 SSH 서비스허용하기 iptables -A INPUT -p TCP -s 192.168.10.11 --sport 1024:65535 --dport 22 -m state --state NEW -j ACCEPT : 소스 IP가 192.168.10.11에서 22번으로들어오는 TCP 프로토콜을이용한트래픽에대해허용하며, 상태추적기능을이용한다. - 22 -
서버에대한원격접속을위해최근에는 telnet에대한대안으로세션을암호화한 ssh가많이사용되고있는추세이다. ssh는 22/tcp 포트를사용하므로목적지포트 22번에대한룰을설정해주면된다. ssh 서버는 22번을, 클라이언트는 1024 이후의임의의포트를사용하므로, 방화벽에서각각의포트를허용해주면된다. 위그림은 192.168.10.11에서방화벽서버의 22/tcp 로의접근을허용하는룰이다. 이후방화벽에서 192.168.10.11 로응답하는패킷은앞에서허용한상태추적룰에따라허용되게된다. 만약상태추적에서허용하지않았더라도 OUTPUT의기본정책이 ACCEPT이므로 OUTPUT에대해서는별도로생각해주지않아도된다. 만약모든소스 IP 에대해 ssh를허용하려면 192.168.10.11 부분에 0/0 이나 any를지정하거나 -s 부분을빼면된다. iptables -A INPUT -p TCP -s 192.168.10.11 --sport 1024:65535 --dport 22 -j ACCEPT : 소스 IP가 192.168.10.11에서 22번으로들어오는 TCP 프로토콜을이용한트래픽을허용한다. 만약상태추적을사용하지않는다면위와같이 -m state 이하부분을생략하고포트번호만명시해도된다. 물론 OUTPUT의기본정책이 ACCEPT이므로 OUTPUT 은언급하지않아도된다. iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source! 00-AA-BB-04-CC-B2( 관리자의 MAC 주소 ) -j DROP : MAC 주소가 00-AA-BB-04-CC-B2에서만 22번으로접근가능, 이외의모든 MAC 주소를가진접근은차단한다. - 23 -
관리자의 IP 주소가일정하지않을때는관리자의 MAC 주소를이용하여위와같이접근제한을할수있다. 9 메일서비스허용 (SMTP/POP3) iptables -A INPUT -p TCP! --sport 0:1024 -dport 25 -m state --state NEW -j ACCEPT : 출발지 port가 25인 TCP 프로토콜을이용하는트래픽에대해허용하고, 상태추적기능을이용한다. SMTP 는 25/tcp 를통해서비스가제공되는데, 만약원격지에서보내는메일서버 (SMTP) 용도로허용하여메일을보낼경우에는외부에서서버의 25/tcp 로향하는트래픽을허용해주어야한다. 이때메일을받은서버는임시로큐에저장했다가외부로메일을발송하게되는데, 이경우내부에서외부로의접속이므로이는별도의룰설정없이도허용하게된다. 위그림은외부에서오는메일을받을수있도록 25/tcp를허용한예인데, 소스포트에서 1024:65535 대신! --sport 0:1023 으로하였는데, 이는 0부터 1023까지가아니므로 1024:65535 와동일한의미가되는것이다. iptables -A INPUT -p TCP --sport 1024: --dport 110 -m state --state NEW -j ACCEPT : Destination port가 110인 TCP 프로토콜을이용한트래픽을허용하고상태추적기능을사용한다. - 24 -
pop3 는 110/tcp를통해서비스를제공하는데, 만약 pop3 서비스를제공한다면외부에서의 110/tcp 접속도허용하여야할것이다. 위룰은소스 ip 에대한언급은없었으므로모든 ip에대한허용이되고소스포트는 1204: 이후의포트이고목적지포트는 110/tcp인패킷을허용하는룰이다. 물론요청에대한응답은상태추적및 OUPUT 의기본정책이허용이므로별도로언급하지않아도된다. 만약특정한 ip 또는 ip 대역에서만 pop3/tcp를허용한다면 --sport 앞에 "-s 192.168.1.0/24" 와같이언급하면된다. 10 FTP 서비스허용 iptables -A INPUT -p TCP --sport 1024: --dport 21 -m state --state NEW -j ACCEPT : 목적지포트가 21인 TCP 프로토콜을사용하는트래픽에대해허용하고, 상태추적기능을이용한다. FTP 서비스는다른서비스와달리 2가지모드를사용하고 2가지포트를사용한다. 흔히 FTP 서비스가사용하는포트는 21/tcp라고알고있으나 21/tcp 외에추가적으로다른포트도사용한다. 이때사용하는포트는어떤모드를사용하는가에따라다른데, 이를테면 Active 모드의경우 20/tcp를사용하고, Passive 모드의경우 1024 이후의임의의포트가사용된다. 따라서각각의모드에따라룰을따로따로설정해보면매우복잡한데, 통합적으로아래와같은하나의룰로 FTP 서비스에대한제어를할수있다. 즉, 두번째사용되는포트는상태추적과 OUTPUT 의기본정책이허용됨에따라별도로설정하지않아도되는것이다. DNS 트래픽허용및 ICMP 트래픽허용은 < 별첨 #1> 을참조하도록하자. < 참고 > 방화벽에서외부로의접속허용앞의룰은외부에서방화벽의 ssh 포트로의접근을허용한경우인데, 반대로방화벽에서외부의다른서버로 ssh 접근을허용하려면어떻게하여야할까? 이는방화벽에서외부로나가는것이므로먼저 OUTPUT을생각하면되는데, OUTPUT 은기본적으로 ACCEPT 이므로고려하지않아도되고, 요청에대한응답은 INPUT 이지만상태추적에의해 ESTABLISHED 는허용되어있으므로방화벽에서외부로의접속은기본적으로허용되어있다. 따라서별도의룰설정없이도접속이가능하게된다. 지금까지방화벽을활용하기위해필요한 iptables의문법과활용및여러가지개념에대해알아보고직접각각의서비스에대한룰도작성해보았는데, 이러한것들을통합하여자체적으로운영중인서버에방화벽을직접설정해보도록하자. 지 - 25 -
금까지알아본룰은원격으로연결된상태에서하나하나실행하여적용하지말고, 스크립트파일을이용하여일괄적으로설정후사용하도록하는것이실수를줄일수있다. 스크립트파일은 < 별첨 #2> 를참조하자. - 26 -
Ⅲ. NAT 방화벽설정 앞에서는웹이나메일등서비스중인서버에직접 iptables를설치하여서비스를제공하면서패킷을필터링하는방법에대해알아보았다. 하지만서비스중인한서버를보호하는것이아니라여러대의서버나 Windows 또는유닉스등다른운영체제를사용하는서버또는전체네트워크에방화벽을설치하여보호하고자할때에는 NAT나브리지방식을사용하여야한다. 이번절에서는 NAT 방식에대해알아보고직접구현해보도록한다. 1. NAT 구성방법 NAT가처음소개된지는 10년이상되었지만지금도여전히대중적으로사용되고있는기술중하나이다. NAT를통해갈수록부족해지는 ip 주소의부족현상을해결할수있고, 또한실제서버는외부에서직접접근이불가능한사설 ip를사용함으로써보안을강화할수있다는측면에서장점을가지고있기때문이다. 그러나 NAT를사용할경우 NAT 방화벽과같이게이트웨이역할을하는하나의장비에내부의네트워크가모두연결되어있어트래픽이몰릴수있고, 만약 NAT 게이트웨이장비에장애가있을경우에는이하의모든시스템에영향을줄수있다는단점도있다. NAT 는구성형태에따라크게두가지형태로나뉠수있다. 첫번째는가장전통적인방식으로서내부에서는사설 ip를사용하면서외부의네트워크로접속할때는방화벽을거치면서내부의사설 ip가아니라방화벽에서접속한것처럼보이게된다. 그리고외부의호스트가이요청에응답하면응답패킷을받은방화벽은해당하는응답패킷을요청했던내부의 PC로전달해준다. 이러한방법으로내부네트워크에서는사설ip를사용하여외부에서보이지않으면서도외부로연결되어응답을받을수있게되므로내부네트워크에있는컴퓨터가사설 ip를사용하더라도인터넷에접속할수있는것이다. 게다가공인 ip 1개만으로도내부에서는무제한으로인터넷을이용할수있게된다. 이와같은기능을 masquerading 한다고하며 NAT의가장기본적인기능이기도한다. 두번째는일종의패킷포워딩기능으로외부에서내부로접속을할수있도록하는특징이있다. 따라서사설 ip 환경에서서버를운영한다면포트포워딩기능을이용하면된다. 이를테면공인 ip가 1개있고내부에사설 ip로설정된 3대의서버가있을경우해당공인 ip 의 25번으로오는패킷은첫번째사설 ip 서버의 25번으로포워딩하고, 80번으로오는패킷은두번째사설 ip 서버로포워딩해주고, udp 53번으로오는패킷은세번째사설ip 서버로포워딩해주도록설정하게되면충분히사설ip로도포트의개수만큼많은서비스를제공할수있게되는것이다. masquerading은패킷의소스주소를변경 ( 사설-> 공인 ) 하므로 Source NAT(SNAT) - 27 -
라고하며포트포워딩은패킷의목적지주소를변경 ( 공인-> 사설 ) 하므로 Destination NAT(DNAT) 이라고한다. 2. NAT 룰설정하기 이제본격적으로 NAT를설정하여보도록하자. 앞에서살펴보았던 filter 테이블의 INPUT chain에서는방화벽서버자체를목적지로하는패킷에대한필터링을담당하는데반해방화벽내부의서버에대한필터링은들어오든나가든관계없이 FORWARD chain에서만담당한다. 그리고, NAT를하기위해서는 NAT 테이블에있는 PREROUTING과 POSTROUTING chain을이용하면된다. 그리고방화벽내부에서외부로나가는패킷이나외부에서내부로들어오는패킷은방화벽을통과하면서패킷을포워딩 ( 일종의라우팅 ) 해주어야하므로커널에서 ip 패킷포워딩기능이지원되어야한다. STEP 1. 패킷포워딩기능설정 cat /etc/sysctl.conf : /etc/sysctl.conf 파일의내용을확인한다. sysctl -w net.ipv4.ip_forward=1 : net.ipv4.ip_forward=1로수정하여포워딩기능을활성화한다. 위와같이패킷포워딩기능을설정한다. 만일 nat가영구적으로패킷포워딩이지원되게하려면 etc/sysctl.conf에서 net.ipv4.ip_forward = 1로수정해주어야한다. (SNAT이든 DNAT이든관계없이 NAT를사용한다면설정값은반드시 1이어야한다.) - 28 -
STEP 2. SNAT (Source NAT) 구현하기 iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 211.241.82.119 사무실등에서서버를운영하지는않고단지인터넷만사용할수있도록하기위해소위인터넷공유를이용하여여러 pc에서인터넷을사용하는경우에대해알아보자. 만약 ADSL과같이유동ip인경우, 방화벽의 ppp0 인터페이스에는 DHCP 등을이용한공인 ip를설정하고내부의네트워크와연결된 eth1 인터페이스에는사설 ip 의게이트웨이인 192.168.1.1 로설정하기로한다. 위의룰은 SNAT 설정으로여기에서별도로공인 ip가설정되지않은이유는 DHCP를이용한유동ip 이므로 ip를알수없기때문이다. 만약공인 ip가고정 ip 라면대신위와같이실행하면된다. ppp0 인터페이스를통해나가는모든트래픽은방화벽에서마스커레이드되며이때 ip는 ppp0 인터페이스에설정된 ip가된다. 만약 FORWARD chain이기본정책 - 29 -
으로 ACCEPT라면위의한줄만으로 masquerading은끝난다.. 사실상내부네트워크는사설 ip를사용하여외부에서내부로직접접근할수없으므로 FORWARD의기본정책을 DROP으로할필요는없으며 ACCEPT로해도무방하다. STEP 3. DNAT (Destination NAT) 구현하기 이번에는 DNAT를이용한포트포워딩에대해알아본다. DANT의작동방식은다음과같다. 외부에서의접속요청이방화벽에도착하면방화벽은 PREROUTING chain을통해목적지주소를사설 ip로변경하여사설네트워크가연동된인터페이스를통해패킷을내부의서버에포워딩한다. FORWARD chain 을통과한이패킷을받은서버가응답하게되면역으로방화벽에서소스주소를원래의외부인터페이스주소로변경하여원격지클라이언트에패킷을포워딩해주게된다. 그럼여기에서 http 트래픽을포워딩하는예를보면 DNAT를설정할때에는 NAT 테이블을설정한후 filter 테이블의 FORWARD 설정을하면된다. 그다음은 filter 테이블을설정할차례이다. 여기에서 filter 테이블의 FORWARD chain 이기본정책 (-P) 으로 ACCEPT 라면추가적인룰이필요없다. 만약, DROP 인경우에는상태추적을이용하여이미연결된접속에대해서는허용하도록한다. iptables -P FORWARD ACCEPT 추가적으로웹접속요청을허용하여야하므로그림과같이소스포트가 1024 이후의포트이면서목적지주소가 192.168.1.3 이고목적지포트가 80인패킷을허용하면된다. iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT - 30 -
그리고외부에서의요청을허용하여야하므로상태는 NEW가된다. 이후의패킷교환은위의룰을통해허용된다. iptables -A FORWARD -p TCP --sport 1024: -d 192.168.1.3 --dport 80 -m state --state ESTABLISHED,RELATED -j ACCEPT NAT 를이용한방화벽룰예제는 < 별첨 #3> 을참고한다. - 31 -
Ⅳ. 브리지 (Bridge) 방화벽설정하기 브리지방화벽은 NAT 방식과구조는동일하지만방화벽내부의서버가사설 ip를사용하지않고공인 ip를그대로사용한다는차이가있다. NAT 방화벽은라우터라고생각하면되고, 브리지방화벽은스위치라고생각하면된다. NAT 방식의경우만약방화벽에장애가발생했을경우에는대책이없지만, 브리지방식의경우장애가발생하면내부의케이블만상위스위치에연결하면바로서비스재개가가능하다는장점이있다. 이러한장점때문에최근에사용이늘고있는브리지방화벽을설정하고이용하는방법에대해알아본다. STEP 1. 브리지구성 브리지방화벽은 NAT와같이이더넷카드가 2장있어야하는데, 이두장의카드는 0.0.0.0 으로설정하고이두장의이더넷카드를합쳐서하나의가상인터페이스로설정하게된다. 따라서방화벽을기준으로내부와외부케이블이 eth0 이나 eth1등어떤인터페이스에연결되어도관계없다. 참고로, NAT 의경우외부케이블은공인 ip가할당된인터페이스에, 내부케이블은사설 ip 가할당된인터페이스에연결하여야했다. 이렇듯리눅스시스템을브리지형태로구성하려면 2.4 버전에서는커널패치를해준뒤커널메뉴에서브리지지원메뉴를별도로선택해주고, 2.6 이후버전에서는커널자체에서지원함으로별도의커널패치를하지않아도된다. 2.4 커널의패치를위해서는커널소스디렉토리인 /usr/src/linux/ 디렉토리로이동한후 http://ebtables.sourceforge.net 에서자신의커널버전에맞는패치파일을다운로드하도록한다. 이후이파일을 gzip -d 로압축해제후패치하면된다. 이후 make menuconfig를실행한후 Networking options에서확인해보면아래와같이 802.1d Ethernet Bridging 를선택하면 Bridge: ebtables 라는것이추가된것을알수있으며이메뉴를선택하면된다. - 32 -
[ 그림 6] 커널설정화면 이후커널컴파일및재부팅하면사용할준비가되었다. 다음으로는브리지를설정하기위한관리프로그램인 bridge-utils를설치하도록한다. bridge-utils 다운로드 : http://bridge.sourceforge.net 이후아래와같이압축해제후./configure; make 로컴파일만하면된다. 이후생성된 brctl 실행파일을 /sbin/ 으로옮기도록한다. [ 그림 7] 브리지유틸리티압축해제 - 33 -
[ 그림 8] 브리지유틸리티환경설정 [root@firewall bridge-utils-x.x.x]# make [root@firewall bridge-utils-x.x.x]# mv brctl/brctl /sbin/ STEP 2. brctl 설정하기 bridge-utils인 brctl을설치한후실행하면사용할수있는옵션이많이있는데, 브리징이나스패닝트리 (stp) 등에대한자세한설명은네트워크관련서적을참고하기바라며실제브리지방화벽을운영할때는아래와같은옵션만알고있으면된다. 실제아래와같은스크립트를만들어 br.sh와같은파일로작성후부팅할때자동으로실행하도록설정한다. #!/bin/sh SERVICE_IP="221.1.2.3" #- 방화벽에서사용할공인 ip를지정한다. 각자의공인 ip를설정하면된다. GATEWAY_IP="221.1.2.1" #- 방화벽에서사용할게이트웨이 ip를지정한다. 각자의게이트웨이 ip를설정하면된다. /sbin/brctl addbr bridge /sbin/brctl stp bridge on /sbin/brctl addif bridge eth0 /sbin/brctl addif bridge eth1 /sbin/ifconfig eth0 down /sbin/ifconfig eth1 down - 34 -
/sbin/ifconfig eth0 0.0.0.0 promisc up /sbin/ifconfig eth1 0.0.0.0 promisc up #- 이후아래부분은각자의상황에따라설정한다. /sbin/ifconfig lo 127.0.0.1 up #- 루프백인터페이스에 ip 설정. /sbin/ifconfig bridge $SERVICE_IP promisc up #- br0 인터페이스의 ip 를정의한다. /sbin/route add -host 127.0.0.1 dev lo #- 이후 127.0.0.1을라우팅테이블에추가한다. /sbin/route add default gw $GATEWAY_IP #- 각자의공인게이트웨이 ip를라우팅테이블에정의한다. 위와같이설정후 ifconfig를실행하면다음과같이보일것이다. [root@firewall root]# ifconfig bridge Link encap:ethernet HWaddr 00:02:B3:23:46:A2 inet addr:221.1.2.3 Bcast:221.1.2.255 Mask:255.255.255.0 UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:78976119 errors:0 dropped:0 overruns:0 frame:0 TX packets:1280633 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:19496170 (1163.0 Mb) TX bytes:139611162 (133.1 Mb) eth0 Link encap:ethernet HWaddr 00:02:B3:23:46:A2 UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:1433779958 errors:0 dropped:0 overruns:0 frame:0 TX packets:1244370418 errors:0 dropped:0 overruns:10 carrier:0 collisions:0 txqueuelen:100 RX bytes:3970825670 (3786.8 Mb) TX bytes:3927975228 (3746.0 Mb) Interrupt:7 eth1 Link encap:ethernet HWaddr 00:02:B3:23:46:A3 UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:1245227725 errors:0 dropped:0 overruns:0 frame:0 TX packets:1278748119 errors:0 dropped:0 overruns:8325 carrier:0 collisions:0 txqueuelen:100 RX bytes:154061880 (146.9 Mb) TX bytes:2212479690 (2109.9 Mb) Interrupt:7 Base address:0x2000-35 -
lo Link encap:local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:12390 errors:0 dropped:0 overruns:0 frame:0 TX packets:12390 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:16320338 (15.5 Mb) TX bytes:16320338 (15.5 Mb) route -n 이나 netstat -r 을실행하면아래와같이 bridge 인터페이스가보일것이 다. [root@firewall root]# route -n 127.0.0.1 0.0.0.0 255.255.255.255 UH 0 0 0 lo 221.1.2.0 0.0.0.0 255.255.255.0 U 0 0 0 bridge 0.0.0.0 221.1.2.1 0.0.0.0 UG 0 0 0 bridge 현재브리지상태를조회하려면다음과같이 brctl show를실행하면된다. [root@firewall root]# brctl show bridge name bridge id STP enabled interfaces bridge 8000.00d0b79a2b6c yes eth0 eth1 여기에서만약브리지를해지하고재설정하려면먼저해당브리지에설정되어있는인터페이스를삭제한후브리지를삭제하면된다. 물론원격접속을한상태라면네트워크가끊기게되므로주의하여야한다. 아래와같이스크립트파일을생성한뒤원격접속이아닌리눅스콘솔상에서실행한다. #!/bin/sh ifconfig bridge down brctl stp bridge off brctl delif bridge eth0 brctl delif bridge eth1 brctl delbr bridge ifconfig eth0 down ifconfig eth1 down ifconfig eth0 221.1.2.3 promisc up ifconfig eth1 192.168.1.1 promisc up 브리지방화벽룰은 < 별첨 #4> 를참고한다. - 36 -
Ⅳ. phpfwgen 을이용한 iptables 사용하기 지금까지 iptables를이용하여보안정책을설정하는법을알아보았지만, 수많은보안정책을수립하는데는많은시간과노력이필요함을느끼는사용자들이많다. 또한수많은정책을설정하다보면, 일관성이없어지고많은부분이실행이제대로안되어문제가발생할수있다. 이런사용자를위해좀더손쉽게 iptables script 생성을위한툴이많이존재하고있으며, 그중에웹환경에서사용할수있는 phpfwgen에대해알아보도록하겠다. phpfwgen 홈페이지 : http://phpfwgen.sourceforge.net 1. phpfwgen 의기능및특징 phpfwgen는오픈소스프로젝트중하나로서 iptables를이용한보안정책을손쉽게수립할수있게해주는툴로써아래와같은기능및특징이있다. 가. 웹상에서 GUI 형태로구성되어있어간편하게사용할수있다. 나. 기본적인서비스명이나포트번호등에대해정의되어있다. - 37 -
다. 기본으로제공되는서비스명이나포트번호이외에사용자정의로추가할수있다. 라. RPM 등을이용할수있으며, 설치가용이하다. 2. phpfwgen 설치및사용하기 phpfwgen를사용하기위해서는 php를사용할수있는아파치웹서버환경이마련되어야한다. 설치나사용하는부분이별어려움이없으므로, 간략하게살펴보도록하자. 아래의순서로설치하고, 사용하면별문제없이사용할수있다. STEP 1. phpfwgen 다운로드및설치하기 1 phpfwgen 다운로드홈페이지에서다운로드받기. wget http://heanet.dl.sourceforge.net/sourceforge/ phpfwgen/phpfwgen-2.0.tar.gz (wget 을이용한다운로드 ) tar xvfz phpfwgen-2.0.tar.gz ( 압축풀기 ) 2 환경설정 cd phpfwgen-2.0 ( 디렉토리이동 ) installme 파일을시스템의환 vi installme ( 환경설정 ) 경에맞게수정한다. - 38 -
3 설치하기 sh make-netobjects (netobjects 생성하기 ) sh make-rulesets (rulesets 생성하기 ) 상기의명령어를이용하여 netobjects 파일및 rulesets 파일을필히생성해야한다. sh installme ( 설치하기 ) 4 설치종료및확인하기 cd /var/www/html/phpfwgen ( 설치디렉토리로이동하기 ) 설치디렉토리는자신이설정한디렉토리이며, 확인하도록하자. 5 사용하기웹브라우저로 http://test-server/phpfwgen/ 으로접근하였을때, 아래와같은페이지가확인이된다면, 설치가제대로되었다고할수있다. - 39 -
STEP 3. iptables script 만들기 설치가끝났으면, 이제사용하는법에대해알아보도록하자. 사용하는방법도설치만큼이나쉬우므로, 별어려움이없을것이다. 메뉴화면은아래와같다. - 40 -
메뉴에대해아래와같이확인및사용을하도록하자. 1 Interface 확인하기메뉴중 Interfaces 라는부분을클릭하게되면아래와같이현재시스템에서사용하고있는 Interface 정보를확인할수있다. 2 Protocols, Services, Open Ports 확인하기 Protocols, Services, Open Ports 메뉴는기본적인 Reference 정보를제공하는것으로참고자료로확인하자. Protocols Services Open Ports - 41 -
3 Network Objects 관리하기 Network Objects 메뉴를클릭하면다음과같이설정된 Object에대한정보를확인하거나, Click here to add a new object" 를클릭하여 object를추가할수있다. 4 Rules 확인및설정하기 Firewall Rules 메뉴를클릭하면보안정책을확인및수정할수있다. 일반적인보안정책이기본적으로설정되어있으므로, 자신의환경에맞게수정하거나삭제하여사용하도록하자. - 42 -
Port Forwarding Rules, Redirector Rules 메뉴는해당사용자만설정하여사용하도록하자. 5 Current Script 메뉴를이용한 iptables 스크립트만들기 Current Script" 메뉴를클릭하여, 위에서설정한모든내용이포함된 iptables 스크립트를얻을수있다. 확인하여얻은스크립트를파일로만들어서 iptables 스크립트로사용하도록하자. 이상으로 iptables의스크립트를좀더손쉽게만드는법을알아보았다. 많은보안정책을 iptables를이용하여생성할때유용한편이므로, 테스트후사용해보도록하자. - 43 -
Ⅵ. GUI 를활용한방화벽스크립트구축 지금까지는직접시스템에 SSH 로그인하여일일이룰을생성하고수정하는방법에대해알아보았다. 그러나이작업이번거롭고쉽지않은경우에는 GUI 기반의프로그램을이용하여룰을생성하는작업을할수있다. 이러한대표적인프로그램으로는 firewall builder라는프로그램이있는데리눅스등오픈소스에서는자유롭게이용이가능하고 Windows나 MAC OS와같이상용 OS 버전은 30일동안한시적으로사용이가능하다. firewall builder 홈페이지 : http://www.fwbuilder.org 1. fwbuilder 의기능및특징 fwbuilder 는다음과같은특징을가지고있다. 가. 가장많이사용되는 100개이상의미리정의된룰이있어기존의룰을그대로가져다쓰거나기존의룰을참고하여수정해서간단히이용할수있다. 나. 기존의룰외에도서비스명이나포트번호등에대해개인적으로정의하여사용할수있다. - 44 -
다. 마법사형식으로제공되어초보자도쉽게룰생성및수정을할수있다. 라. snmp등을이용하여시스템정보나인터페이스정보등을자동인식할수있다. 마. 작성된룰은스크립트파일로저장할수도있고방화벽시스템에로그인하여자동설치할수도있다. 바. 일반적인 windows 환경에서지원되는것처럼오른쪽마우스클릭후메뉴나 copy & paste 등이지원된다. 사. iptables 뿐만아니라 cisco의 PIX, ipfilter, pf 등도지원한다. 2. fwbuilder 의설치및활용 이제 fwbuilder를설치해보도록한다. fwbuilder는여러 OS에서제공하는버전을제공하는데, 여기에서는쉽게사용이가능한 Windows 기반의프로그램을다운로드하여설치해보도록한다. 먼저홈페이지에접속후 downloads 메뉴를클릭후 Windows 버전의프로그램을다운로드하면된다. 이후다운로드받은실행파일을실행하여안내에따라설치하면된다. 설치가완료된후시작 -> 프로그램 -> Firewall Builder에서 FWBuilder 를선택하면된다. 1 인스톨하기선택 I Agree" 클릭 2 구성요소선택하기필요한구성요소를마우스로클릭하여선택 -> Next 클릭 - 45 -
3 저장하기저장할폴더선택 ( 변경하려면 Browse를선택하여원하는위치에폴더생성 ) -> Next 클릭 4 프로젝트파일생성 Open existing file 클릭-> Next 클릭 5 파일명입력새로운파일을생성후차후에생성했던파일을선택하여사용 -> Next 클릭 이후 Finish를선택하면드디어프로그램이로딩된것이다. 초기에는아무런데이터가없이초기화된상태이다. - 46 -
6 Object 생성 User선택 -> New firewall 선택 -> 새로운 Object 이름지정 -> 방화벽 SW와 OS 지정 -> fwbuilder에서는자체적으로사전에정의된룰파일들을제공하는데이룰을사용하기위해서 Use preconfigured template firewall objects 메뉴를선택 -> Next 선택 -> Web Server 선택 ( 방화벽이외의타입도사용이가능 ) -> Finish 선택 6-1 User 선택 6-2 New firewall 선택 6-3 새로운 Object 이름지정 -> 방화벽 SW 와 OS 지정 - 47 -
6-4 Web Server 선택 ( 방화벽이외의타입도사용이가능 ) -> Finish 선택 - 48 -
7 정책설정하기 각메뉴에서마우스오른쪽클릭 -> 원하는룰추가혹은삭제 -> Policy 는모든인터페이스에적용되는일반적인룰을, outside 는외부인터페이스의정책을, inside 는 loopback 인터페이스 -> object에서오른쪽마우스를클릭하여인스톨실행 - 49 -
8 해당생성파일확인 fwbuilder가제공하는기능과옵션은매우다양한데, 여기에서는간략하게만살펴보았다. 좀더많은옵션과기능에대해서는홈페이지에서제공하는매뉴얼을참고하기바라며방화벽이나 iptables에대한사전이해없이 GUI 화면만으로룰을생성하려면당장생성하는것은가능할지몰라도문제발생시수정하거나해결하는데에는어려움이있을수있으므로초기에는직접설정하면서테스트하는것을추천한다. - 50 -
< 별첨 #1> DNS 트래픽및 ICMP 트래픽허용 (1) DNS 트래픽허용 DNS(Domain Name Service) 는호스트이름을 ip 주소로또는 ip 주소를호스트이름으로변환해주는역할을하며기본적으로 udp/tcp 53번을사용한다. DNS 서비스의경우질의를요청하는클라이언트포트가 1024:65535 일수도있고 53번일수도있으니소스포트를명시할때주의하도록하여야한다. 만약 DNS 서비스를정확히허용하지않을경우에는서비스에직접적인장애가될수있기때문이다. DNS 서비스운영시트래픽허용방화벽이운영중인서버에서직접 bind 등의데몬을실행하여외부에 DNS 서비스를제공할경우에는모든곳에서접근할수있도록 -s 0/0 으로허용하거나아예 -s 부분을명시하지않으면된다. 그리고외부에서의 DNS 요청시소스포트는 1024:65535 일수도있고 53 일수도있으므로아래그림과같이각각에대해명시해주면된다. 아니면아예 --sport 부분을언급하지않아도된다. 아울러 DNS 트래픽은패킷의특성에따라 udp 일수도있고 tcp 일수도있으므로두가지를모두고려해주어야한다. 외부의 DNS를사용하고자할때대부분자체적으로 DNS 서버를운영하기보다는 ISP에서제공하는 DNS를사용하는경우가많은데, 이러한경우서버내부에서외부로요청하는것이므로이트래픽역시먼저 OUTPUT 을고려한후이에대한응답인 INPUT을생각하면된다. OUTPUT 의경우기본적으로허용되어있고이에대한응답인 INPUT 의경우상태추적인 ESTABLISHED 에의해허용되므로이트래픽은별도로언급하지않아도된다. (2) ICMP 트래픽허용 ICMP (Internet Control Message Protocol) 에대해허용여부를설정할차례이다. 언급한바와같이 icmp 는 tcp나 udp와는달리포트 (port) 라는개념이없이 icmp-type 과 code 가사용되는데, 허용해주어야할특정한타입만을허용해주면된다. icmp의타입과코드에대해서는 http://www.iana.org/assignment/icmp-parameters를참고하기바란다. 1 ping(icmp echo request) 허용하기 icmp의가장대표적인 ping 은 icmp echo request 에대하여 icmp echo reply 패킷을받게된다. 만약외부에서방화벽서버로의 ping을허용하려면 INPUT에서 echo request를허용하면될것이다. 그리고이에대한응답인 echo reply 는 OUTPUT을통해나가게되는데. 기본정책이허용이므로별도로언급하지않아도된다. - 51 -
위그림은외부에서의 ping 요청을허용하기위한룰인데, 물론좀더정확하게하기위해 -m state --state NEW를추가할수있으나 ICMP는통상적으로상태추적을사용하지않아도무방하다. 만약방화벽에서외부호스트또는네트워크로의 ping을허용하기위해서는먼저 OUPUT을생각하면나가는트래픽중 icmp type이 echo-request인패킷을허용하면되는데, OUTPUT은기본적으로허용이므로언급하지않아도된다. 그리고이에대한응답인 echo-reply를 INPUT에서허용하면되지만, 이는상태추적의관점에서 ESTABLISHED이므로별도로언급하지않아도된다. 2 source-quench 허용하기 source-quench는자주사용되지는않지만수신자의버퍼가꽉차서더이상자료를받을수없을때자료를보내는소스호스트에게보내는메시지인데, 필요하므로허용하는것이좋다. OUTPUT 은기본적으로허용이고, 상태추적에의해요청에대한응답도허용된다. 3 destination-unreachable 허용하기 destination-unreachable 은 traceroute를허용하고자할때사용되는데, OUTPUT 은기본적으로허용이므로 INPUT에서만언급하면된다. 4 fragmentation-needed 허용하기 A와 B 이렇게양구간에서의통신시중간을경유하는라우터의 MTU 값보다큰사이즈의패킷이전송될경우에는패킷이단편화된다. 그러나만약단편화될수없는경우에는패킷을 drop 하고해당패킷의소스 ip에게단편화가필요하다는 icmp 패킷을발송하게된다. 따라서이패킷을허용하여야중간에패킷이 drop 되었다는것을알기때문에허용설정을하여야한다. OUTPUT은기본적으로허용이므로 INPUT 에만설정하면된다. - 52 -
5 time-exceeded 허용하기내부에서외부의네트워크로 traceroute를할때 TTL이초과되었다는 icmp 메시지를받고자할때필요하다. OUTPUT 은기본적으로허용이므로 INPUT 에서만허용하면된다. 6 parameter-problem 허용하기마지막으로 parameter-problem 은수신한패킷헤더에비정상적이거나예상치못한데이터가있을경우송신자에게전송하는 icmp 에러메시지로서이패킷도허용하여야한다. OUTPUT 은기본적으로허용이므로 INPUT 에서만허용하도록한다. - 53 -
< 별첨 #2> iptables 설정스크립트예제 #!/bin/sh # 자체서버방화벽룰설정파일 iptables -F -t filter iptables -F -t nat iptables -F -t mangle # 기존에설정되어있을지모를룰을모두초기화한다. iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # 모든룰에매칭되지않았을때실행될기본정책을설정하는부분이다. # 자체서버형태에서는패킷을다른서버로포워딩하지않으므로 FORWARD chains 은 # 사용할필요가없다. 따라서기본정책으로 DROP 하고, OUTPUT은가급적허용하도록 # 한다. 단, INPUT에서는반드시 DROP 하도록한다. iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # 루프백인터페이스를통해오가는트래픽은허용한다. iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP iptables -A INPUT -i eth0 -s 255.255.255.255/32 -j DROP iptables -A INPUT -i eth0 -s 0.0.0.0/8 -j DROP iptables -A INPUT -i eth0 -s 169.254.0.0/16 -j DROP iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP iptables -A INPUT -i eth0 -s 192.0.2.0/24 -j DROP iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP iptables -A INPUT -i eth0 -s 224.0.0.0/4 -j DROP iptables -A INPUT -i eth0 -s 240.0.0.0/5 -j DROP iptables -A INPUT -i eth0 -s 248.0.0.0/5 -j DROP # INPUT 패킷중 RFC 1918 에정의된사설 ip 및일반적인인터넷에서는사용될수 # 없는 ip 또는 ip 대역을소스로한패킷을차단한다. # 위의경우외부네트워크의인터페이스로 eth0을사용하는경우이다. iptables -A OUTPUT -d 10.0.0.0/8 -j DROP iptables -A OUTPUT -d 255.255.255.255/32 -j DROP iptables -A OUTPUT -d 0.0.0.0/8 -j DROP - 54 -
iptables -A OUTPUT -d 169.254.0.0/16 -j DROP iptables -A OUTPUT -d 172.16.0.0/12 -j DROP iptables -A OUTPUT -d 192.0.2.0/24 -j DROP iptables -A OUTPUT -d 192.168.0.0/16 -j DROP iptables -A OUTPUT -d 224.0.0.0/4 -j DROP iptables -A OUTPUT -d 240.0.0.0/5 -j DROP iptables -A OUTPUT -d 248.0.0.0/5 -j DROP # OUTPUT chain 에대한설정으로비정상적인 ip 또는 ip 대역을목적지로한패킷을 # 거부한다. FORWARD 는어떠한트래픽도허용하지않으므로별도로언급하지않아도 # 된다. iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 상태추적에따라허용되어이미세션을맺은후뒤따라오는패킷은허용하도록한다. iptables -A INPUT -i eth0 -p TCP! --syn -m state --state NEW -j DROP # tcp 패킷중상태추적에는 NEW 이면서 syn 패킷이아닌패킷을필터링한다. # 이외의패킷은모두위조된패킷이기때문이다. iptables -A INPUT -i eth0 -p ALL -m state --state INVALID -j DROP # 상태추적테이블에서 INVALID 인패킷은차단한다. iptables -A INPUT -i eth0 -p TCP --sport 1024: --dport 80 -m state --state NEW -j ACCEPT # 웹서비스를제공할때목적지포트가 80번으로향하는초기 (NEW) 패킷은허용한다. iptables -A INPUT -i eth0 -p TCP -s 192.168.1.0/24 --sport 1024: --dport 21 -m state --state NEW -j ACCEPT # 192.168.1.0/24 대역에서의 ftp 접속을허용한다. iptables -A INPUT -i eth0 -p TCP -s 192.168.1.3 --sport 1024: --dport 22 -m state --state NEW -j ACCEPT # 192.168.1.3 에서의 ssh 접속을허용한다. iptables -A INPUT -i eth0 -p TCP --sport 1024: --dport 25 -m state --state NEW -j ACCEPT # SMTP 서비스를제공할때외부에서오는메일을받아서버에저장하거나다른서버로 # 보내고자할때필요하므로 25/tcp를허용한다. - 55 -
iptables -A INPUT -i eth0 -p TCP -s 192.168.1.0/24 --sport 1024: --dport 110 -m state --state NEW -j ACCEPT # pop3 서비스를제공할때 110/tcp 번으로향하는초기 (NEW) 패킷을허용한다. iptables -A INPUT -p ICMP --icmp-type echo-reply -j ACCEPT iptables -A INPUT -p ICMP --icmp-type network-unreachable -j ACCEPT iptables -A INPUT -p ICMP --icmp-type host-unreachable -j ACCEPT iptables -A INPUT -p ICMP --icmp-type port-unreachable -j ACCEPT iptables -A INPUT -p ICMP --icmp-type fragmentation-needed -j ACCEPT iptables -A INPUT -p ICMP --icmp-type time-exceeded -j ACCEPT # icmp 와관련된패킷을허용한다. # 허용하고자하는 icmp type을지정하면된다. - 56 -
< 별첨 #3> NAT 를이용한방화벽정책설정예제 아래는 NAT 방화벽에설정하여사용할수있는룰예제이다. 룰을볼때는먼저각룰의개개의미를먼저살펴보고, 전체적인흐름에서다시살펴보기바란다. 이예에서는 eth0에공인 ip로 221.1.2.3이할당되어있고, 내부의사설대역에는 192.168.1.0/24 대역을사용하며내부의게이트웨이는 192.168.1.1 과같은 eth1의 ip 주소를사용한다고가정한다. NAT 방화벽자체의게이트웨이는공인 ip의게이트웨이로설정되어있어야한다. #!/bin/sh SERVICE_IP="221.1.2.3" # 방화벽에서사용할공인 ip를지정한다. 각자의공인 ip를설정하면된다. /bin/echo "1" >/proc/sys/net/ipv4/ip_forward # NAT를사용하려면 ip_forward 이반드시 1 이어야한다. iptables -t nat -F iptables-t mangle -F iptables -t filter -F # 각테이블에서기존의룰을모두초기화 (flush) 한다. iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # filter 테이블의기본정책을설정한다. 여기에서 INPUT 과 FORWARD 는 DROP 하고 # OUTPUT 은 ACCEPT 로하였다. iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # 루프백인터페이스를통한트래픽은허용한다. iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP iptables -A INPUT -i eth0 -s 255.255.255.255/32 -j DROP iptables -A INPUT -i eth0 -s 0.0.0.0/8 -j DROP iptables -A INPUT -i eth0 -s 169.254.0.0/16 -j DROP iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP iptables -A INPUT -i eth0 -s 192.0.2.0/24 -j DROP iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP iptables -A INPUT -i eth0 -s 224.0.0.0/4 -j DROP iptables -A INPUT -i eth0 -s 240.0.0.0/5 -j DROP - 57 -
iptables -A INPUT -i eth0 -s 248.0.0.0/5 -j DROP # 외부에서 NAT 방화벽자체를향하는트래픽에대한제어를한다. 이는 INPUT chain # 에서필터링설정하면된다. 사설ip 및공인네트워크에서사용되지않는 ip 대역을 # 소스로한패킷을차단한다. iptables -A FORWARD -i eth0 -s 10.0.0.0/8 -j DROP iptables -A FORWARD -i eth0 -s 255.255.255.255/32 -j DROP iptables -A FORWARD -i eth0 -s 0.0.0.0/8 -j DROP iptables -A FORWARD -i eth0 -s 169.254.0.0/16 -j DROP iptables -A FORWARD -i eth0 -s 172.16.0.0/12 -j DROP iptables -A FORWARD -i eth0 -s 192.0.2.0/24 -j DROP iptables -A FORWARD -i eth0 -s 192.168.0.0/16 -j DROP iptables -A FORWARD -i eth0 -s 224.0.0.0/4 -j DROP iptables -A FORWARD -i eth0 -s 240.0.0.0/5 -j DROP iptables -A FORWARD -i eth0 -s 248.0.0.0/5 -j DROP # 외부에서 NAT 방화벽을통과하여내부의서버를향하는트래픽에대한제어를한다. # 이는 FORWARD chain 에서필터링설정하면된다. iptables -A OUTPUT -d 10.0.0.0/8 -j DROP iptables -A OUTPUT -d 255.255.255.255/32 -j DROP iptables -A OUTPUT -d 0.0.0.0/8 -j DROP iptables -A OUTPUT -d 169.254.0.0/16 -j DROP iptables -A OUTPUT -d 172.16.0.0/12 -j DROP iptables -A OUTPUT -d 192.0.2.0/24 -j DROP iptables -A OUTPUT -d 192.168.0.0/16 -j DROP iptables -A OUTPUT -d 224.0.0.0/4 -j DROP iptables -A OUTPUT -d 240.0.0.0/5 -j DROP iptables -A OUTPUT -d 248.0.0.0/5 -j DROP # 방화벽에서외부로나가는트래픽에대한제어를한다. iptables -A FORWARD -i eth1 -s 192.168.1.0/24 -j ACCEPT # 내부의사설대역에서사설인터페이스인 eth1을통해들어오는패킷은 # 내부네트워크에서의정상적인트래픽이므로허용한다. iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT --to $SERVICE_IP # 내부에서 192.168.1.0/24 대역을사용할경우 eth0을통과해나갈때 SERVICE_IP # 에서지정한공인ip 로변환되어나가도록한다. iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT - 58 -
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 이미세션을맺어상태추적테이블목록에있는 ESTABLISHED,RELATED 패킷은허용 # 한다. iptables -t nat -A PREROUTING -d $SERVICE_IP -p TCP --dport 21 -j DNAT --to 192.168.1.1:21 # 앞에서지정한 SERVICE_IP 의 21 번포트로향하는트래픽은 192.168.1.1 의 21번으 # 로포워딩한다. 따라서외부에서 221.1.2.3 의 21번으로접속하면 192.168.1.1 의 21번 # 포트가응답하게된다. iptables -t nat -A PREROUTING -d $SERVICE_IP -p TCP --dport 747 -j DNAT --to 192.168.1.12:80 # SERVICE_IP 의 747 번으로향하는트래픽은 192.168.1.12 의 80 번으로포워딩한다. iptables -A INPUT -p TCP! --syn -m state --state NEW -j DROP iptables -A FORWARD -p TCP! --syn -m state --state NEW -j DROP # 상태추적테이블에 NEW이면서 syn 비트가설정되지않은 tcp 패킷은차단한다. iptables -A INPUT -p ALL -m state --state INVALID -j DROP iptables -A FORWARD -p ALL -m state --state INVALID -j DROP iptables -A OUTPUT -p ALL -m state --state INVALID -j DROP # 상태추적테이블에서 INVALID 인패킷은차단한다. iptables -A FORWARD -p TCP --sport 1024: --dport 747 -m state --state NEW -j ACCEPT # 공인 ip의 747/tcp 포트를향하는트래픽즉, 192.168.1.12 의 80번으로향하는트래픽 # 을허용해주는설정이다. iptables -A FORWARD -p TCP --sport 1024: --dport 21 -m state --state NEW -j ACCEPT # 앞에서 NAT 설정한 21/tcp 에대해포트포워딩을허용한다. iptables -A INPUT -p TCP -s 192.168.1.3 --sport 1024: --dport 22 -m state --state NEW -j ACCEPT # 관리를위해 192.168.1.3 에서방화벽으로의 ssh 로그인을허용한다. iptables -N ICMP_HANDLE iptables -F ICMP_HANDLE # icmp 트래픽에대한설정으로 INPUT, FORWARD 에대해각각동일한룰을 # 반복적으로설정하여야하는데, 이를간소화하기위해 ICMP_HANDLE 이라는별도의 - 59 -
# chain 을생성하도록한다. iptables -A ICMP_HANDLE -p ICMP --icmp-type echo-reply -j ACCEPT iptables -A ICMP_HANDLE -p ICMP --icmp-type network-unreachable -j ACCEPT iptables -A ICMP_HANDLE -p ICMP --icmp-type host-unreachable -j ACCEPT iptables -A ICMP_HANDLE -p ICMP --icmp-type port-unreachable -j ACCEPT iptables -A ICMP_HANDLE -p ICMP --icmp-type fragmentation-needed -j ACCEPT iptables -A ICMP_HANDLE -p ICMP --icmp-type time-exceeded -j ACCEPT # 허용해주어야할몇가지 ICMP type을설정해준다. iptables -A INPUT -p ICMP -j ICMP_HANDLE iptables -A FORWARD -p ICMP -j ICMP_HANDLE # INPUT, FORWARD 되는패킷중 ICMP 패킷을 ICMP_HANDLE chain 에보낸다. - 60 -
< 별첨 #4> 브리지방화벽룰설정예제 실제 iptables를이용하여브리지방화벽룰을설정할차례이다. 브리지방식이라고해서특별할것이없으며, NAT 와매우유사하거나오히려더쉽고간단하다. 브리지는 NAT와관련된룰을고려할필요가없고, 단지 FORWARD chain 만으로허용또는거부만설정하면된다. 브리지방화벽룰은앞에서살펴보았던 NAT 와관련된룰을아래와같이수정하여사용한다. #!/bin/sh SERVICE_IP="221.1.2.3" #- 방화벽에서사용할공인 ip를지정한다. 각자의공인 ip를설정하면된다. /bin/echo "1" >/proc/sys/net/ipv4/ip_forward iptables -t nat -F iptables-t mangle -F iptables -t filter -F iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP iptables -A INPUT -i eth0 -s 255.255.255.255/32 -j DROP iptables -A INPUT -i eth0 -s 0.0.0.0/8 -j DROP iptables -A INPUT -i eth0 -s 169.254.0.0/16 -j DROP iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP iptables -A INPUT -i eth0 -s 192.0.2.0/24 -j DROP iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP iptables -A INPUT -i eth0 -s 224.0.0.0/4 -j DROP iptables -A INPUT -i eth0 -s 240.0.0.0/5 -j DROP iptables -A INPUT -i eth0 -s 248.0.0.0/5 -j DROP iptables -A FORWARD -i eth0 -s 10.0.0.0/8 -j DROP iptables -A FORWARD -i eth0 -s 255.255.255.255/32 -j DROP iptables -A FORWARD -i eth0 -s 0.0.0.0/8 -j DROP iptables -A FORWARD -i eth0 -s 169.254.0.0/16 -j DROP - 61 -
iptables -A FORWARD -i eth0 -s 172.16.0.0/12 -j DROP iptables -A FORWARD -i eth0 -s 192.0.2.0/24 -j DROP iptables -A FORWARD -i eth0 -s 192.168.0.0/16 -j DROP iptables -A FORWARD -i eth0 -s 224.0.0.0/4 -j DROP iptables -A FORWARD -i eth0 -s 240.0.0.0/5 -j DROP iptables -A FORWARD -i eth0 -s 248.0.0.0/5 -j DROP iptables -A OUTPUT -d 10.0.0.0/8 -j DROP iptables -A OUTPUT -d 255.255.255.255/32 -j DROP iptables -A OUTPUT -d 0.0.0.0/8 -j DROP iptables -A OUTPUT -d 169.254.0.0/16 -j DROP iptables -A OUTPUT -d 172.16.0.0/12 -j DROP iptables -A OUTPUT -d 192.0.2.0/24 -j DROP iptables -A OUTPUT -d 192.168.0.0/16 -j DROP iptables -A OUTPUT -d 224.0.0.0/4 -j DROP iptables -A OUTPUT -d 240.0.0.0/5 -j DROP iptables -A OUTPUT -d 248.0.0.0/5 -j DROP iptables -A FORWARD -i eth1 -s 192.168.1.0/24 -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p TCP! --syn -m state --state NEW -j DROP iptables -A FORWARD -p TCP! --syn -m state --state NEW -j DROP iptables -A INPUT -p ALL -m state --state INVALID -j DROP iptables -A FORWARD -p ALL -m state --state INVALID -j DROP iptables -A OUTPUT -p ALL -m state --state INVALID -j DROP iptables -A FORWARD -p TCP --sport 1024: --dport 747 -m state --state NEW -j ACCEPT iptables -A FORWARD -p TCP --sport 1024: --dport 21 -m state --state NEW -j ACCEPT iptables -A INPUT NEW -j ACCEPT -p TCP -s $SERVICE_IP --sport 1024: --dport 22 -m state --state - 62 -
iptables -N ICMP_HANDLE iptables -F ICMP_HANDLE iptables -A ICMP_HANDLE -p ICMP --icmp-type echo-reply -j ACCEPT iptables -A ICMP_HANDLE -p ICMP --icmp-type network-unreachable -j ACCEPT iptables -A ICMP_HANDLE -p ICMP --icmp-type host-unreachable -j ACCEPT iptables -A ICMP_HANDLE -p ICMP --icmp-type port-unreachable -j ACCEPT iptables -A ICMP_HANDLE -p ICMP --icmp-type fragmentation-needed -j ACCEPT iptables -A ICMP_HANDLE -p ICMP --icmp-type time-exceeded -j ACCEPT iptables -A INPUT -p ICMP -j ICMP_HANDLE iptables -A FORWARD -p ICMP -j ICMP_HANDLE - 63 -