Linux2008/03/13 12:36
Linux용 방화벽인 iptables에 대해서 문서를 작성해 볼 예정입니다.
인터넷상에 관련 문서는 많이 있지만 체계적으로 정리된 문서가 적고..
제가 이해력이 떨어져서 그런지 활용하기가 좀 어렵더군요.

지금 현재 누군가가 서버에 ftp로 로그인하려고 하는 움직임이 있어서
iptables를 이용해 차단하려고 합니다. +_+

246-colo-bdg1.telkom.net.id

넌 도대체 머하는 놈이냐!! 어제 저녁 7시부터 줄기차게 스크립트 돌리고 있네요. -_-;

리눅스 상에서 iptables를 이용하려면 당연한 이야기이지만 iptables 관련 패키지가 설치되어 있어야 합니다.

# yum list iptables
iptables.i386                            1.3.8-6.fc8            installed

yum으로 확인해본 결과 위 패키지가 설치되어 있네요. +_+

이제 매뉴얼 페이지를 잠깐 보겠습니다.

SYNOPSIS
       iptables [-t table] -[AD] chain rule-specification [options]
       iptables [-t table] -I chain [rulenum] rule-specification [options]
       iptables [-t table] -R chain rulenum rule-specification [options]
       iptables [-t table] -D chain rulenum [options]
       iptables [-t table] -[LFZ] [chain] [options]
       iptables [-t table] -N chain
       iptables [-t table] -X [chain]
       iptables [-t table] -P chain target [options]
       iptables [-t table] -E old-chain-name new-chain-name


포인트는 저거네요........ []로 되어 있는 부분은 생략 가능한 부분이라는거 아시죠 ? 훗;


먼저 Command에 대해서 쭈욱 살펴보겠습니다.

-A, --append chain rule-specification 지정체인에 새로운 룰을 추가
-D, --delete chain rule-specification 지정체인에서 일치하는 첫번째 룰을 삭제
-D, --delete chain rulenum 지정체인에서 특정 룰을 삭제
-I, --insert chain [rulenum] rule-specification 지정체인에 [지정위치에] 새로운 룰을 삽입
-R, --replace chain rulenum rule-specification 지정체인의 [지정위치에] 룰을 교환
-L, --list [chain] 지정체인의 룰 목록을 출력
-F, --flush [chain] 지정체인을 초기화
-Z, --zero [chain] 지정체인의 패킷과 바이트 카운트를 0으로 설정(머지 ?? -0-)
-N, --new-chain chain 새로운 체인 만들기
-X, --delete-chain [chain] 체인 삭제
-P, --policy chain target 지정체인의 정책변경
-E, --rename-chain old-chain new-chain 체인의 이름변경
-h     Help.  도움말 출력

그리고 위 명령어들과 같이 많이 쓰는 옵션들은 아래와 같습니다.
--proto [!]           -p  프로토콜타입을 지정합니다(tcp/udp/icmp/all)
--source [!]         -s  소스 어드레스를 지정합니다(address[/mask])
--destination [!]   -d   타겟 어드레스를 지정합니다(address[/mask])
--in-interface       -i  네트워크 인터페이스를 지정합니다.
--jump                -j  타겟에 대한 룰을 지정합니다(accept/reject/drop)
--numeric            -n  이 옵션을 지정하면 포트번호나 프로토콜 타입들이 숫자로 표시됩니다.
                           (이걸 지정하지 않으면 80번 포트는 http로, 25번 포트는 smtp처럼 표시됩니다)

--source-port         --sport  소스 포트를 지정합니다.
--destination-port    --dport  타겟 포트를 지정합니다.

옵션들은 이외에도 여러가지가 있지만 저도 파악하지 못한 것이 많고 위의 옵션만으로도 일반 운영은 충분히 가능하기에 그냥 빼버렸습니다. -_-;

페도라를 기준으로 해서 다음의 명령으로 현재 iptables의 상태를 파악할 수 있습니다.
# /etc/init.d/iptables status
테이블: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

현재 3개의 기본 체인(이 3개의 체인은 삭제하거나 변경할 수 없습니다)이 있고 아무런 룰도 등록되어 있지 않네요. 자 그럼 기본서비스를 등록해보도록 하겠습니다. 저는 현재 웹서버와 메일 수신서버 그리고 ftp를 공개하고 있으니 이것들을 등록해보도록 할게요.
# iptables -A INPUT -p TCP --dport 80 -j ACCEPT (http 허가)
# iptables -A INPUT -p TCP --dport 443 -j ACCEPT (https 허가)
# iptables -A INPUT -p TCP --dport 25 -j ACCEPT (smtp 허가)
# iptables -A INPUT -p TCP --dport 20:21 -j ACCEPT (ftp, ftp-data 허가)

자 등록이 끝났습니다. 그런데 무언가 허전하지 않나요 ? 네, 맞습니다. 위 서비스 외에는 모든 접속을 불허하는 룰이 있어야겠지요. 일부 상용 제품에선 각 체인(용어는 틀리겠지만요)의 마지막에 "모든 접속 불허"라는 룰이 보이진 않지만 자동으로 지정되기도 하는데 iptables에는 그런게 없는듯 하네요.

# iptables -A INPUT -p TCP --dport 1:30000 -j DROP

이것으로 일단 기본 등록은 끝났습니다. 위에서 포트를 1:30000으로 지정하면 1번부터 30000번까지의 포트를 한번에 지정할 수 있습니다. 그럼 다시한번 상황을 살펴볼까요 ?
# /etc/init.d/iptables status
테이블: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80
2    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443
3    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:25
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:21
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:20
6    DROP         tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpts:1:30000

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

네.. 이쁘게 등록이 잘 되었네요. +_+ 방화벽은 기본적으로 등록된 룰을 위에서부터 적용시키기 때문에 순서에 유의하셔야 합니다. 만약 잘못해서 DROP 밑에 룰이 추가된다면 그 룰은 제대로 동작하지 않으니 주의하세요.
참 하나가 빠졌네요... 서버에 계속 ftp접속 시도하던 호스트를 조사한 결과 인도 자카르타의 IP로 확인되었습니다. 호스트명 자체는 dns에 등록되어 있지 않은지라 어쩔 수 없이 같은 대역에 등록되어 있는 24bit를 모두 블록 시키겠습니다.

# iptables -I INPUT 4 -p TCP -s 202.134.0.xxx/24 --dport 20:21 -j REJECT

네 이번에는 맨끝에 추가하는 append가 아닌 중간에 숫자를 지정하여 insert로 룰을 설정하였습니다. 또한 drop이 아닌 reject를 설정함으로서 넌 내가 거부하고 있어!! 라는 것을 티내고 있는 중입니다. ^^;

참고로 iptables명령어를 사용하면 아래와 같이 나오고 init.d의 스크립트를 이용하면 -n이 적용된 결과가 표시됩니다.
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:https
REJECT      tcp  --  202.134.0.xxx/24    anywhere
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:smtp
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ftp
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ftp-data
DROP       tcp  --  anywhere             anywhere            tcp dpts:tcpmux:30000

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

이제 설정이 모두 끝났는데 이걸로 끝일까요 ? 아닙니다.. 이상태에서 재부팅을 하거나 iptables 서비스를 정지시키거나 하면 등록된 정보들은 모두 날아가버립니다. 메모리에만 등록되어 있는 상태이기 때문이죠. 아래 명령어를 실행시켜 등록한 룰을 하드디스크에 저장하도록 합시다.
# /etc/init.d/iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK ]

이렇게 해서 앞으로 서비스를 재시작 하거나 재부팅을 해도 설정한 룰이 사라지지 않고 제대로 동작해줄거라 생각됩니다. 관심있으신 분은 /etc/sysconfig 디렉토리 밑에 있는 iptables, iptables-config 파일들을 살펴보시는 것도 좋겠네요.

다음에 시간이 나면 설정파일등에 대해서 또한번 다루어보도록 하겠습니다.
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Onedayth

TRACKBACK http://linuxwin.com/trackback/20 관련글 쓰기

댓글을 달아 주세요

  1. 내 집에서 돌리는 서버에는 ssh 줄기차게...
    걍 로그파일만 구경만 하고 있었는데 나도 막아볼까 -ㅅ-;

    집안 대청소 했더니 (화장실 위주로) 온몸이 뻐근... 게다가 상 치르냐고 3일 연속 큰절만 했더니 온몸이 부들부들...

    2008/03/13 22:59 [ ADDR : EDIT/ DEL : REPLY ]
    • Oneday

      어.. 큰일치뤘다야... 그리고 ssh같은거는 포트를 바꿔버려.. 난 포트번호 바꿔서 비밀리에 운영중... ㅋㅋㅋ

      2008/03/14 00:26 [ ADDR : EDIT/ DEL ]
  2. 데이야 근데 테터툴즈에서 파일 업로드가 안되는데 어디 손봐야해?
    파일용량 제한 이런거 관계없이 아예 파일 업로드가 종료되지 않아..

    2008/03/16 14:17 [ ADDR : EDIT/ DEL : REPLY ]
    • Oneday

      훔.. 그건 먼가 이상한데 ? ㅡㅡ?
      첨부터 무언가 설정이 잘못된거 아녀 ?

      2008/03/17 18:50 [ ADDR : EDIT/ DEL ]