iptables 설정하기 > 리눅스 Tip

본문 바로가기
 

iptables 설정하기

페이지 정보

작성자 no_profile 차동박 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 댓글 0건 조회 15,279회 작성일 11-08-07 07:42

본문

http://cafe.naver.com/q69/114433
iptables는 커널 2.4로 올라가면서 새롭게 나타난 것이다. 이 것은 기존의 ipchains를 교체 한 것이다. 여기에서는 간단히 외부에서 들어오는 것을 필터링 하는 것으로 설정하는 방법을 모색한다.
iptables는 테이블 형식으로 관리를 한다. 그리고 먼저 등록 된것이 효력을 발생하기때문에 등록을 하는 순서가 중요하다. 모든 것을 거부하는 설정이 먼저오게 되면 드 이후에 포트를 열어주는 설정이 와도 효과가 없다. 그러므로 허용하는 정책이 먼저오고 나서 거부하는 정책이 와야한다.

예) iptables -A INPUT -p tcp --dport 22:30 -j DROP
iptables -A INPUT -p tcp --dport 25 -j ACCEPT

이 경우에는 먼저 22번부터 30번까지의 포트를 목적지로 하는 패킷이 들어오면 무시하라는 줄이 먼저 들어 있다. 그리고 다음에 25번 포트를 열라는 명령이 있다. 그러나 이 명령은 먼저온 거부 메시지때문에 패킷이 이미 거부된 상태이어서 효력이 없다. 따라서 이 경우는 잘못 설정한 것으로 볼 수가 있다. 그러므로 제대로 설정을 하려면 이렇게 바꾸어야한다.

예) iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --dport 22:30 -j DROP

이렇게 하면 먼저 25번 포트로 들어오는 것을 허용하고 난후에 다른 것을 막아내기 때문에 제대로 된 설정이 된다.

Usage: iptables -[ADC] chain rule-specification [options]
iptables -[RI] chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LFZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)

이 부분은 전체적인 옵션을 적는 것을 간략히 보여주는 것이다.
아직 커널 2.4대를 써보는 것이 얼마되지 않아서 정확한 개념과 고급적인 설정은 파악이 되지 않은 상태이다. 다만 iptable을 추가하고 삭제하고 필수적인 부분을 이해해보자.
iptables을 이용해서 추가하는 것은

iptables -A 체인이름 옵션

의 형식을 사용한다. 이 때에 iptables에 등록이 되는데 이것을 확인하는 것은 iptables -L로 확인이 가능하다.

예) iptables -L

나타나는 목록은 다음과 같다.

Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

아직은 아무것도 등록이 되지않은 상태이다. 여기에 등록을 하는 것이다.

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

이 명령을 사용하면 한줄이 등록이 된다. 결과는 다음과 같다.

Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

처음에 한줄이 등록이 된다. 여기에 등록된 라인은 ssh를 사용하는 것을 허용하는 것이다.
이 한줄을 설명하면
먼저 -A 옵션은 추가하도록하는 것이다. 그리고 따라오는 INPUT은 chain명이다. 그리고 다음에 따라오는 -p는 protocol에 관한 옵션이다. 여기에서는 tcp에 관한 설정임을 명시하였다. 그리고 source와 destination은 명시하지 않았기 때문에 전체포트와 아이피가 대상이 된다. -dport는 패킷이 대상으로 삼는 포트를 명시한 것이다 여기에서 22라고 표기한 것은 ssh서비스 포트이다. 그리고 마지막에 -j ACCEPT는 허용하도록 정책을 정하는 것이다. 따라서 여기로의 ssh서비스를 요청하는 패킷은 허용되도록 설정을 한 것이다.
다음은 전체적인 설정을 한 것이다.

#!/bin/sh
# iptables 모듈 등록하기
modprobe iptable_filter
# ssh 열기
/usr/local/bin/iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# httpd 열기
/usr/local/bin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# pop3 열기
/usr/local/bin/iptables -A INPUT -p tcp --dport 109 -j ACCEPT
# pop2 열기
/usr/local/bin/iptables -A INPUT -p tcp --dport 110 -j ACCEPT
# imap 열기
/usr/local/bin/iptables -A INPUT -p tcp --dport 143 -j ACCEPT
# mysqld 열기
/usr/local/bin/iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
# ftpd 열기
/usr/local/bin/iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# ftp-data 열기
/usr/local/bin/iptables -A INPUT -p tcp --dport 20 -j ACCEPT
# ircd 열어주기
/usr/local/bin/iptables -A INPUT -p tcp --dport 6667 -j ACCEPT
/usr/local/bin/iptables -A INPUT -p udp --dport 6667 -j ACCEPT
# 전부 거절하기
/usr/local/bin/iptables -A INPUT -p tcp --dport 1:30000 -j DROP
/usr/local/bin/iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

이 것은 허용하는 서비스가 한정적이다. 우선 ssh, http, pop3, pop2, imap, mysql, ftp, ircd를 위해서 서비스를 요청하는 패킷은 허용하고 나머지는 전부 거부하는 설정이다. 이 설정을 자세히 보면 tcp와 icmp를 대상으로 하였다. icmp는 그 중에서 ping을 막은 것이다. 특히 echo-request만을 막아서 핑 요청은 거부하지만 서버에서의 핑테스트는 가능하다. 또한 거절하는 줄인
/usr/local/bin/iptables -A INPUT -p tcp --dport 1:30000 -j DROP
이 라인에서 --dport 다음에 1:30000으로 지정되어 있다. 이 부분은 서버를 경유하여서 다른 곳으로 가고자하는 경우에 클라이언트 프로그램이 사용할 포트를 남겨주기 위함이다. 1번포트에서 30000번 포트까지는 완전히 tcp에 대헤서 막는 것이다. 알려진 포트는 1024이나 해킹 프로그램붕에서 그이후를 사용하여서 소켓을 여는 경우를 방지하기 위함이다. 만약에 서버에서 나갈 이유가 없으면 전부 막으면 된다. 1:65535로 설정하면 전체 포트가 막힌다.

다음의 출력은 결과이다.

Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:www
ACCEPT tcp -- anywhere anywhere tcp dpt:www
ACCEPT tcp -- anywhere anywhere tcp dpt:pop2
ACCEPT tcp -- anywhere anywhere tcp dpt:pop3
ACCEPT tcp -- anywhere anywhere tcp dpt:imap2
ACCEPT tcp -- anywhere anywhere tcp dpt:mysql
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp-data
ACCEPT tcp -- anywhere anywhere tcp dpt:ircd
ACCEPT udp -- anywhere anywhere udp dpt:ircd
DROP tcp -- anywhere anywhere tcp dpts:tcpmux:30000
DROP icmp -- anywhere anywhere icmp echo-request

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

이와 같이 설정을 한다면 대부분의 것에 대해서 설정 할수가 있다. NAT와 MASQUERADE는 좀더 다양한 설정을 이용하여서 적용할 수가 있다. 이러한 iptables는 원하지 않은 서비스에 의해서 서버가 위험에 노출되지 않도록 하는 것이 목적이다. 좀더 나은 설정을 하게 되면 서버의 보안은 굳건히 하는 것에 도움이 된다.
이 iptables 설정은 조금만 공부를 하면 쉽게 습득이 가능하다. 그러므로 문서를 보는 것이 중용하다. 이 설정은 기본이므로 좀더 많은 것은 관련 문서를 이용하기를 바란다.


참고 문서

http://netfilter.kernelnotes.org/unreliable-guides/packet-filtering-HOWTO.html

 

 

#
# iptables 설정 예
# by hsmok (at) systemadmin.co.kr
# 2003. 12. 18
#


##########################
# 웹서버용 IPTABE 설정
# (포트 범위: 1~65535)
##########################
# 열어둘 포트
#   21: ftp
#   22: ssh
#   23: telnet
#   80: http
#   111: portmap (NFS)
#   873: rsync (백업용 포트)
#  3306: mysql

iptables -F
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 23 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --sport 111 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.1.1 --dport 873 -j ACCEPT

iptables -A INPUT -p tcp --dport 1:30000 -j DROP

service iptables save
=> 설정한 내용을 저장한다.

iptables -L
=> 설정 내용을 확인해본다.

 

 

 

* filter 라는 테이블에 -A (해당 체인의 맨 밑에 추가) 하는 구조이다..
serv 컴: iptables  -t  filter  -A  INPUT  -s 1.1.1.1  -d  2.2.2.2 
   -p tcp   --dport  80  -j   ACCEPT
 iptables  -L
 iptables  -t  filter  -A  INPUT  -s  3.3.3.3  -j  DROP
 iptables  -L
* -I 는 삽입될 체인의 위치를 지정할수 있다.. 생략하게 되면 맨위에 추가가 된다..
 iptables  -t  filter  -I  INPUT  -s  192.168.x.1  -j   REJECT
 iptables  -L
* 해당 체인의 3번째에 룰이 삽입 되는 모습이다..
 iptables  -t  filter  -I  INPUT  3   -s  192.168.x.20  -j  LOG
 iptables  -L
* 특정위치의 룰을 -D 라는 옵션으로 제거를 한다..
 iptables  -t  filter  -D  INPUT  4   
 iptables  -L
* 특정위치의 룰을 다시 재설정 하는 장면이다.. -s 는 192.168.x.30, -j ACCEPT 허용으로 ~
 iptables  -t  filter  -R  INPUT  3  -s  192.168.x.30  -j  ACCEPT
 iptables  -L
* iptables 의 정보를 보여주는데 -v를 써서 패킷과 바이트 까지 보여주게 된다.
 iptables  -L   -v   =  iptables  -vL
* iptables 의 정보를 패킷 즉 전체 체인의 패킷을 숫자형태로 보여주게 된다.
 iptables  -L   -n  =  iptables  -nL
* iptables 의 정보를 줄넘버를 붙여 보여준다.
 iptables  -L  --line-numbers
* iptables -Z 는 해당 패킷 및 바이트를 Zero로 초기화 하는 장면..!!
 iptables  -vL    ->   iptables  -Z    ->  iptables  -vL
* -X 는 사용자 정의 체인을 지우는 장면.. INPUT, FORWARD, OUTPUT 는 지울수 없다.
 iptables   -X   RH-Firewall-1-INPUT
 iptables  -L
* 밑에처럼 해보면 안지워짐을 알것이다..
 iptables  -X   INPUT
* 사용자 정의 체인을 TEST라는 이름으로 생성하는 모습.
 iptables  -N  TEST &&   iptables  -nL
* 사용자 정의 체인을 TEST 에서 SSH로 Rename을 하는 모습.
 iptables  -E   TEST   SSH   &&  iptables  -nL
* 사용자 정의 채인에 룰을 생성한다.. 해당체인의 맨 밑에 시작지의 ip를 허용을 한다.
 iptables  -A  SSH  -s  192.168.x.1  -j   ACCEPT
* 하지만 사용자 정의 체인에 허용을 한다고 했음에도 불구하고 INPUT에서  192.168.x.1을 차단하여
   xp 는 접속이 않됨을 알수 있다.. 접속이 되기 위해선 링크를 걸어주자...
 iptables  -nL
  -> xp 에서 serv 로 접속이 되는지 확인
* INPUT 1번째 라인에 xp를 DROP 했으니 우리는 그 위에 룰을 하나 생성하자..
   해당 룰 위치에 오면 SSH 사용자 정의 체인으로 점프를 시켜준다..
   이리 하여 이제 xp 에서 접속이 됨을 알수 있다..
 iptables  -I  INPUT  1  -j   SSH   &&  iptables  -nL
 
* 사용자 정의 체인을 삭제하기 위해선 아래와같은 순서가 필요하다..
 -> 실습 확인 다 하신 분은  사용자 정의 체인 SSH 를 삭제
       1. 링크 연결 해제
  iptables  -D  INPUT  1
       2. 사용자 정의 체인내의 모든 rule 삭제
  iptables  -F  SSH
       3. 사용자 정의 체인 삭제
  iptables  -X  SSH
 
* iptables (-t filter) 괄호 안의 부분은 생략이 가능하다.. 왜냐하면 filter 라는 테이블이 기본이기
   때문이다..
 
* -P 라는 옵션은 INPUT, FORWARD, OUTPUT의 Policy 기본정책을 의미한다..
   기본정책은 처음설정시 ACCEPT 로 허가가 되어있다.. 
* 그리하여 우리는 기본정책을 거부로 바꿔준다..
serv 컴: iptables  -P  INPUT  DROP
 iptables  -P  FORWARD  DROP
 iptables  -nL
 iptables  -D  INPUT  1   &&  iptables  -nL
* 하지만 OUTPUT 체인은 ACCEPT가 되어있다.. 그런데 ping 며 모든게 되지 않는다...
   아.......왜일까..???
확인> input,forward chain 의 기본정책을 DROP 바꾼후 serv 컴에서
        work로, 외부로 핑에 대한 응답이 오는지, "yum -y install  lynx"
        명령어 실행이 되는지 확인해 보세요.
* 잘 들어보자.. ping를 실행시켰을때 맨처음일어나는 일들이 무엇일까??.....
   3 way hand shake 계념을 잘 생각해보면 왜 ping가 않되는지 알것이다...
   그렇다 -0-;; 바로 설명하겠다..
   1 way -> SYN 을 보낸다. (즉 접속할라는데 괜찬냐??)
   2 way <- ACK/SYN 을 받는다.. (나 괜찬아.. 접속해~)
   3 way -> ACK 을 보낸다.. (알았어 접속한다~!!!)
   이리하여 tcp 세션이 맺어졌다.. 신뢰성있는 통신을 하기위해서 하는 과정이다..
 
   OUTPUT는 ACCEPT 인데 INPUT 가 DROP 라서 2 way 가 왔지만 거부당한다..
 
* 상태추적테이블이 있다.. 내가 나가면서 시작지 주소와 목적지 주소를 상태추적테이블에 저장한다.
   내가 목적지에 SYN 을 날려서 ACK/SYN을 유도한다.. 그러면 상태추적테이블에서 방화벽 룰
   검사를 하지 않고 내가 요청한거에 대해서는 허용을 해준다.. 그게 바로 ESTABLISHED 이다..
 
1. 상태추적은 메모리에 적재가 된다.. 그리하여 일정 시간이 지나면 자동으로 free가 된다..
   메모리를 바로 볼수 없으니 cat  /proc/net/ip_conntrack 를 통해 임시로 저장된 파일을
   볼수 있다..  이리하여 -m state --state ESTABLISHED 로 설정을 한다...
 
2. 또하나 그럼 RELATED는 무엇인가?? FTP 를 예로 들어보자.. FTP는 접속할때 21번 포트로 접속
   을 한다.. 모든 TCP 세션처리는 21번 포트에서 실행되지만 정작..데이터를 주고 받음에는
    20번 포트를 사용하게 된다.. 3way hand shake 로 21번 포트로 상태추적테이블에 저장이
    되었는데.. 전혀 생소한 20번 포트로 데이터가 전송이 되면 우리 컴퓨터는 당연히 INPUT에서
    DROP 된다.. ESTABLISHED의 이런점을 보안하고자 RELATED가 생겨났다..
    RELATED = 연관성을 가진 패킷을 허용한다.. 라는 의미로 알고 넘어가자!!!
 
* 이제 밑에처럼 설정 후 다시한번 ping 를 날려보자~ 그럼 시원하게 답이 올것이다..
serv 컴: iptables  -I  INPUT  -m  state  --state  ESTABLISHED,
 RELATED  -j   ACCEPT
 
* 아까 말했던 상태추적 메모리를 직접적이 아닌 간접적 으로 볼수 있는 파일이다..
 cat  /proc/net/ip_conntrack
serv 컴: telnet   localhost
 iptables  -A  INPUT  -i  lo  -j  ACCEPT
 telnet   localhost
 iptables  -F
 
퀴즈>  serv 컴에는 많은 서비스(ssh,telnet,ftp)가 동작중이다. 이러한
         서비스중 xp에는 telnet 서비스만 접속허용하고, work 에는
         ssh 서비스만 접속을 허용할 수 있도록 rule 셋팅하세요.
 iptables  -A  INPUT  -s  192.168.x.1  -d  192.168.x.10 
  -p  tcp  --dport  23  -j   ACCEPT
 
 iptables  -A  INPUT  -s  192.168.x.20  -d  192.168.x.10 
  -p  tcp  --dport  22  -j   ACCEPT
 

댓글목록

등록된 댓글이 없습니다.

Total 138건 3 페이지
리눅스 Tip 목록
번호 제목 글쓴이 조회 날짜
102 no_profile 차동박 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 15208 09-06
101 no_profile 차동박 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 15178 08-09
100 no_profile 차동박 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 9281 08-09
열람중 no_profile 차동박 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 15280 08-07
98 no_profile 차동박 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 14004 05-25
97 no_profile 차동박 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 11396 05-10
96 no_profile 차동박 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 16730 05-08
95 no_profile 차동박 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 16426 05-07
94 no_profile 차동박 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 21603 02-03
93 no_profile 차동박 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 13680 08-23
92 no_profile 차동박 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 9874 07-20
91 no_profile 차동박 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 7846 07-20
90 no_profile 차동박 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 15808 07-19
89 no_profile 차동박 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 14928 07-19
88 no_profile 차동박 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 18389 07-17
87 no_profile 차동박 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 16278 06-28
86 no_profile 차동박 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 14829 05-24
85 no_profile 차동박 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 10876 05-23
게시물 검색