2012.03.21 00:08
CentOS 5 에서 iptables 설정법 프로그래밍

2008/03/15 12:19

복사http://blog.naver.com/cocos2006/50029136645

요즘 CentOS 5.1을 가지고 서버를 구성하고 있는데 특히나 걸리는 부분이 방화벽 설정이었다.

CentOS에서는 iptables로 방화벽을 설정하는데, CentOS 5 부터 iptables의 설정에서 약간의 변경사항들이 있어서

예전부터 CentOS를 사용하지 않았던 사람들이 헷갈리는 경우가 있다. (본인을 포함해서...)

iptables의 설정과 적용에 관해서는 인터넷을 검색해보면 아주 잘 나와있다. 따라서 여기서 설명하는 것은

CentOS 5.1에서 iptables의 설정파일이 어디에 있으며, 설정내용들이 무엇인지, iptables를 적용하는 방법에 관해서

예를 들어 설명하고자 한다.

먼저, iptables의 설정파일이 위치한 곳은 '/etc/sysconfig/iptables'라는 파일이다.

내용은 대충 아래와 같다.

# Generated by iptables-save v1.3.5 on Fri Mar 14 10:42:34 2008
*filter
:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [448:53618]
:RH-Firewall-1-INPUT - [0:0]

-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT

-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -i eth0 -j ACCEPT

-A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p esp -j ACCEPT
-A RH-Firewall-1-INPUT -p ah -j ACCEPT
-A RH-Firewall-1-INPUT -d 224.0.0.251 -p udp -m udp --dport 5353 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Fri Mar 14 10:42:34 2008

각각의 세부설정 옵션에 관해서는 인터넷을 검색하면되고, 가장 위쪽에 위치한

':INPUT ACCEPT [0:0]' 의 뜻은 서버로 들어오는 기본정책으로 '모두 받아들인다'이다. 그 아래 세줄도 모두 비슷한 뜻이다.

':RH-Firewall-1-INPUT - [0:0]' 부분은 이곳에서 설정하고자 하는 정책들을 적용하겠다는 문구이다.

'-A INPUT -j RH-Firewall-1-INPUT' 이 부분이 INPUT에 관한 처리를 RH-Firewall-1-INPUT에 설정된 것을 사용한다는 것이다.

'-A FORWARD -j RH-Firewall-1-INPUT' 이 부분도 위와 비슷하게 FORWARD되는 정책의 설정을 나타낸다.

그 다음에 나오는 두줄이 설정에서 주의할 부분으로 인터페이스로 들어오는 부분에 대한 설정 사항이다.

-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -i eth0 -j ACCEPT

처음줄이 의미하는 것은 localhost에서 생성되는 포트들에 관한 설정 사항으로 모두 ACCEPT하게 설정되어 있다.

만일 이 부분이 없다면 localhost내에서 포트를 생성하여 내부에서 메시지가 교환되는 형태의 프로그램에서 이상이

발생할 수도 있다. 설정을 ACCEPT가 아니라 DROP으로 설정한다면 메시지의 교환이 이루어지지 않게 된다. 이런 상태에서는

데이터베이스서버와 응용프로그램과의 연결이 포트로 이루어 진다면 서로간의 메시지교환은 이루어지지 않게 된다.

두번째줄이 외부와 서버와의 연결을 의미하는데 'eth0'를 통하여 들어오는 연결에 관한 설정으로 여기서는 모두 받아 들여지게된다.

따라서 이 설정대로라면 외부와 서버와는 아무런 방화벽이 작동하지 않는 것과 같은 상태가 된다. 왜냐하면 서버와 클라이언트의 모든 연

결이 네트워크카드를 통해 이루어지기 때문이다. 하지만 이 설정을 DROP으로 만들면 않된다. DROP으로 만들어 적용을 하게되면 적용됨

과 동시에 서버와의 모든 연결은 끊어지게 되고, 원격에서(ssh를 포함해서)의 연결도 종료되고, 서버와 직접연결된 터미널에서만

서버를 제어할 수 있기때문이다.

나머지 아래의 부분들은 http, ftp등등에 관한 연결설정을 나타낸다. 인터넷에서 찾아보면 내용을 알 수 있다.

다른 것은 아마도 iptables라는 명령어가 앞에 생략된 것 뿐일 것이다.

-A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p esp -j ACCEPT
-A RH-Firewall-1-INPUT -p ah -j ACCEPT
-A RH-Firewall-1-INPUT -d 224.0.0.251 -p udp -m udp --dport 5353 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT

위 설정 아래의 부분은 생략하지 않고 남겨 둔다.

" -A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT " 이 부분은 현재 연결이 되어 있는 포트에 관해서는

연결을 유지한다는 뜻이다. 따라서 원격으로 접속하고 있었다 하더라도 연결이 끊어지는 것을 막을 수 있다.

그럼 위와 같이 기본설정으로 된 것을 바꾸어 보도록 하자.

정책은 다음과 같다.

" INPUT과 FORWARD에 관해서는 기본적으로 사용하지 않는 포트들은 모두 막는다. 내가 만든 채팅서버에서 사용하는 3333번포트는 열어

둔다."

사항들을 적용해 보면 아래와 같다.

# Generated by iptables-save v1.3.5 on Fri Mar 14 10:42:34 2008
*filter
:INPUT DROP [0:0] <- 이 부분을 DROP으로 바꾼다.
:FORWARD DROP [0:0] <- 이 부분을 DROP으로 바꾼다.
:OUTPUT ACCEPT [448:53618]
:RH-Firewall-1-INPUT - [0:0]

-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT

-A RH-Firewall-1-INPUT -i lo -j ACCEPT
# -A RH-Firewall-1-INPUT -i eth0 -j ACCEPT <- 이 부분을 주석처리한다.
-A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p esp -j ACCEPT
-A RH-Firewall-1-INPUT -p ah -j ACCEPT
-A RH-Firewall-1-INPUT -d 224.0.0.251 -p udp -m udp --dport 5353 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT <- ssh용

-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT <- http용
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT <-ftp용
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 3333 -j ACCEPT <- 채팅서버가 사용하는 포트
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Fri Mar 14 10:42:34 2008

위와 같이 설정을 하고 "/etc/init.d/iptables restart" 스크립트명령을 실행하면 적용이 된다.

위에서 " # -A RH-Firewall-1-INPUT -i eth0 -j ACCEPT " 부분을 주석처리하는 것을 주의하기 바란다.

이 부분을 그냥 놔두면 이 부분의 아래에 설정된 사항들은 모두 무시되고 모든연결이 이루어 진다.

그리고 적용을 하기 전에 서버에서 서비스할 데몬들이 어떤 것들이 있는지 확인하고, 서비스되어야 할 포트들은 모두 열어주는 설정을 포

함 시켜야 한다. 위에서는 20번포트가 빠져있지만 필요하다면 설정해야 하고, 만일 DNS서버를 운영중이라면 tcp, udp의 53번포트를 열어

주는 설정도 추가되어야 할 것이다.

Posted by k1rha

댓글을 달아 주세요