RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
'ipchains'에 해당되는 글 1

출처 : 대전국제IT교육센터 정성재 강사

 

1. ipchains란?
리눅스커널 2.2버전 이상에서 부터 사용하는 일종의 방화벽(firewall)이다. 커널에서 들어오고 나가
는 패킷을 선택적으로 구별하는 필터링을 한다. 이 필터링에 규칙을 정하고 자신만의 규칙에 맞게 조
절할 수 있는 것이 ipchains이다. 이것을 이용하여 리눅스서버에 강력한 IP보안 기능을 설정할 수 있
고, 리눅스 박스를 GATEWAY화하여 많은 클라이언트와 다른 서버를 보호할 수 있다.
(참고) ipchains의 버전확인
/sbin/ipchains --version


2. ipchains의 기본구조
(1) 개요: ipchains는 논리적인 3개의 사슬(Chains)으로 구성되어 있고 각각 Input, Forward,
          Output체인이라는 이름을 가지고 있다. 또한 새로운 사용자 정의사슬도 만들 수 있다.
(2) 구성
   1) input체인   : 리눅스박스를 향해 들어오는 패킷들이 거치는 체인
   2) forward체인 : 리눅스박스를 거쳐 output체인을 향하는 체인
   3) Output체인  : 리눅스박스를 나가는 패킷들이 들어가는 체인
(3) 연결단계
    Input Chain => Forward Chain => Output Chain

3. ipchains의 정책(Policy)
(1) 개요: ipchains의 정책이라는 것은 패킷을 어떻게 처리할 것인가를 의미한다. 패킷의 처리는
          크게 수용할 것이냐 거부할 것이냐 두가지 정책이지만, 실질적으로는 ACCEPT, REJECT,
          DENY 세가지 정책이 관리한다. 기타정책으로는 MASQ등이 있다.
(2) 기본정책
   1) ACCEPT : 패킷을 수용한다.
   2) REJECT : 거부메시지와 함께 거부한다.
   3) DENY   : 메시지를 보내지 않고 상대를 무시한다.
   4) 기타
    ㄱ. MASQ : IP 매스커레이딩(Masquerading)에 사용하는 정책이다. 이 정책은 반드시 FORWARD
              사슬에서만 존재한다.

4. 사슬(Chains)의 이용
(1) 개요: 사슬에 관련된 많은 옵션이 존재하며, 옵션을 이용하여 다양한 정책을 지정할 수 있다.
(2) 사용법
   ipchains 옵션 [지정하고자 하는 사슬] [정책]
     => 일반사용자일 경우에는 /sbin/ipchains 라고 입력해야 한다.
(3) 옵션
   -N : 새로운 사슬을 만든다.
   -X : 빈 사슬을 지운다. 참고로 사슬이 비어있지 않으면 지울 수 없고 INPUT, FORWARD, OUTPUT
         은 기본 사슬로서 지울 수 없다.
   -P : 내장 사슬에 대한 기본 정책(Policy)을 변경한다.
   -L : 사슬 속에 든 규칙을 나열한다.
   -F : 사슬 속의 모든 규칙을 방출한다.
   -Z : 사슬 속의 모든 규칙에 대한 패킷, 바이트 카운터 값을 0으로 설정한다.
   -A : 사슬에 새로운 규칙을 추가한다. 보통 -A [사슬명]이 온다.
       예) -A input
   -I : 사슬 속에 어딘가에 새로운 규칙을 추가한다.
   -R : 사슬 속 특정 위치의 규칙을 교체한다.
   -D : 사슬 속 특정 규칙을 삭제한다.
   -M -L : 현재 매스커레이드된 접속 규칙을 나열한다.
   -M -S : 매스커레이딩 타임아웃값을 설정한다.
   -C : 현재의 설정을 테스트한다.
   -s : source 패킷이 들어오는 곳을 위치를 명시한다.
   -d : destination 패킷이 가고자 하는 최종 목적지
   -p : protocol 명시
      예) -p tcp, -p udp, -p icmp등
   -! : inverse역규칙 명시
      예) -p ! tcp : !는 프로토콜, 발신, 수신 등의 표현과 함께 사용 가능하나, icmp프로토콜과
         는 함께 쓸 수 없다.
   -i : interface 명시
      예) -i eth0, -i ppp0
   -y : 접속동기화 요청(SYN)명시
      예) -s any.host.com -y => any.host.com으로부터 오는 접속요청(syn flag)를 명시
   -j : 정책을 설정한다.
      예) -s any.host.com -j DENY => any.host.com에서 들어오는 모든 패킷을 거절한다.
   -l : 패킷을 기록
      예) -s any.host.com -l -j DENY => any.host.com에서 들어오는 모든 패킷을 기록하고 거절
   -b : 양방향 규칙
   -t : 서비스 유형 처리하기
(4) 옵션과 관련된 규칙
   1) -s(발신지), -d(도착지)의 사용
    ㄱ. 개요: 이 두가지 옵션을 각각 발신지(-s)와 도착지(-d)를 IP로 표현하는 옵션으로 4가지
             방법으로 사용가능하다.
    ㄴ. 표현법
     a. 도메인으로 표기하기
       예) -s localhost, -d www.linux.ac.kr
     b. IP주소로 표기하기
       예) -s 192.168.0.3
     c. Netmask값을 이용하여 표기(1)
       예) -s 192.168.1.0/24 : 192.168.1.0 ~ 192.168.1.255
           -s 192.168.0.0/16 : 192.168.0.0 ~ 192.168.255.255
     b. Netmask값을 이용하여 표기(2)
       예) -s 192.168.1.0/255.255.255.0
           -s 192.168.0.0/255.255.0.0
   2) -p의 사용
    ㄱ. 개요: 프로토콜을 명시하는 옵션으로 tcp, udp, icmp와 같은 이름을 사용해서 표현한다.
             또한 "!"를 사용하여 역표현이 가능하다.
    ㄴ. tcp, udp에서의 사용
      a. 설명: tcp, udp포트 또는 포트의 범위를 추가로 지정할 수 있다. 또한 콜론(:)을 사용하여
              포트의 범위를 지정할 수 있다. 예를 들면 7000:7010이면 7000부터 7010까지의 11개의
              포트번호를 의미한다. 여기서 시작값이 생략되면 0으로 간주하고 끝값이 생략되면
              65535로 간주한다.
      b. 사용예
        -p TCP -s 0.0.0.0/0 :1024
          => 1024포트 이하로부터 오는 모든 tcp접속을 말한다.
        -p TCP -d 192.168.0.1 !www
          => 192.168.0.1 시스템으로 들어오는 www포트 이외의 TCP접속을 말한다.
        -p TCP -d ! 192.168.0.1 www
          => 192.168.0.1 시스템을 제외한 모든 시스템의 www포트를 사용하는 TCP접속을 말한다.
    ㄷ. icmp에서 사용
      a. 설명: ICMP는 포트라는 것이 없지만 여러가지 옵션을 가지고 있다.
      b. 사용법:
        -s 유형 -d 코드
         => 유형과 코드는 ipchains -h icmp라고 치면 확인할 수 있고, 유형과 코드는 숫자로 된
           값을 입력하면 된다.

5. ipchains의 사용예
(1) 사슬의 설정값 확인
   1)[root@house /root]# ipchains -L                 // 전체 사슬의 내용을 확인
     Chain input (policy ACCEPT):
     Chain forward (policy DENY):
     target     prot opt     source                destination           ports
     MASQ       all  ------  192.168.0.0/24       anywhere              n/a
     Chain output (policy ACCEPT):
   2)[root@house /root]# ipchains -L forward        // 특정 사슬의 내용만 확인
     Chain forward (policy DENY):
     target     prot opt     source                destination           ports
     MASQ       all  ------  192.168.0.0/24       anywhere              n/a
(2) 사슬의 설정값 지우기
   1) ipchains -F : 전체 사슬의 내용을 지운다.
   2) ipchains -F forward : forward사슬의 내용을 지운다.
   3) ipchains -F input   : input사슬의 내용을 지운다.
(3) 응용예
   1) ipchains를 이용한 ping에 응답하지 않기
     ipchains -A input -p icmp --icmp-type echo-request -j DENY
    (참고1) ping과 관련된 파일 /proc/sys/net/ipv4/icmp_echo_ignore_all
   2) 특정사이트인 www.abc.com의 패킷을 막기
     ipchains -A input -s www.abc.com -d localhost -j DENY
      => 목적지(-d)가 localhost인 모든 패킷(프로토콜이 명시되지 않으면 모든 프로토콜이다.)을
        DENY로 한다.
   3) 192.168.0의 주소를 가진 C클래스의 모든 호스트(192.168.0.1 ~ 192.168.0.255)들의 접근을 거
     부하기
     ipchains -A input -p tcp -s 192.168.0.0/24 -d localhost telnet -j DENY
      => INPUT사슬에 출발지(-s)가 192.168.0.0/24인 모든 호스트로부터 프로토콜은 TCP(-p tcp)를
       사용하고 목적지가 localhost의 telnet서비스 포트인 패킷을 DENY한다.
    (참고2)Netmask값을 이용한 IP표현
      예) 192.168.1.0/24  : 192.168.1.0 ~ 192.168.1.255
          192.168.0.0/16  : 192.168.0.0 ~ 192.168.255.255
          0/0             : 모든 호스트
   4) 웹서비스를 제외한 모든 서비스를 제한하고, 모든 로그를 남기도록 설정하기
     ipchains -A input -p tcp -s 0/0 -d localhost !www -j DENY -l
      => input사슬에 프로토콜은 TCP(-p tcp)이고, 출발지는 모든 호스트(-s 0/0으로 표기하지만 생
        략가능),목적지는 localhost인데 웹서비스 이외에는 모두 DENY한다. 참고로 !www대신에 !80
        이라고 된다. 맨 뒤에 -l은 패킷을 기록하라는 옵션이다.
   5) 어떠한 서비스도 하지 않을 경우의 설정
     ipchains -A input -s DNS_server -d localhost -j ACCEPT
     ipchains -A input -p tcp -s !localhost -d localhost 0:1024 -j DENY -y -l
     ipchains -A input -p udp -s !localhost -d localhost 0:1024 -j DENY -l
      => 첫번째는 DNS와의 통신을 위해 자신의 네임서버와의 통신을 위해 열어놓은 것이고, 두번째
        는 로컬호스트가 아닌(!localhost) 호스트로부터 localhost의 0번부터 1024번포트(-d 0:102
        4)사이로 오는 모든 접속 동기화 요청(SYN)비트가 설정된 TCP(-y)패킷을 거부한다. 0번부터
        1024번까지는 시스템이 사용하는 예약된 포트이므로 대부분의 해킹이 이곳에서 일어난다.
        SYN패킷만 걸러내면 외부로부터의 TCP연결은 원천적으로 봉쇄된다. 그러므로 비교적 안전하
        다고 할 수 있다. 세번째는 같은 내용이지만 프로토콜만 바뀐것이다. 참고로 UDP프로토콜은
        SYN신호가 존재하지 않는다.
   6) 매스커레이딩 설정하기
      ipchains -A forward -s 192.168.0.1/24 -j MASQ

6. ipchains의 규칙 저장하고 불러오기

(1) 개요: 원하는 대로 방화벽 사슬을 설정해 놓은 후, 그 설정을 저장하여 다시 설정할 때 번거로
          움을 덜 수 있다. 이 때 저장하는 명령이 ipchains-save라는 스크립트이고, 불러오는 명령
          은 ipchains-restore이다.
(2) ipchains-save
   1) 설명: 설정한 내용을 저장하는 스크립트이다.
   2) 사용법
     ipchains-save > 파일명
   3) 사용예
    ㄱ. ipchains-save >firewall.txt
       => 현재 설정을 firewall.txt라는 파일로 저장한다.
    ㄴ. ipchains-save -v
       => 저장한 내용을 화면에 출력한다.
(3) ipchains-restore
   1) 설명: ipchains-save로 저장한 사슬을 복구하는 스크립트이다.
   2) 사용법
     ipchains-restore < 파일명

7. ipchains로 막아서는 안될 것들
(1) ICMP: ICMP패킷을 필터링 할 경우에는 주의해야 한다. ICMP프로토콜에는 여러가지 타입이 있는
          이 중 절대로 막아서는 안되는 패킷이 destination-unreachable타입이다. 이는 모든 TCP/
          IP자료 교환시에 필요한 패킷이다. ICMP와 관련된 사항을 보려면 ipchains -h icmp라 입
          력하면 된다.
(2) 도메인 네임 서비스와 관련된 패킷: 도메인 네임 서버는 도메인이름을 IP주소로 바꿔주는 서버
                                      이므로 kr.yahoo.com등의 주소를 사용할 수 없다. 네임 서
                                      버는 UDP프로토콜을 사용하며 53번 포트를 사용하고, TCP도
                                      사용한다. 따라서 네임서버와의 통신(TCP/UDP 53번 포트)는
                                      절대로 막아서는 안된다.
(3) 메일서비스와 관련된 패킷들: 메일 서버의 경우도 마찬가지다. 자신이 메일 서버를 운영한다면
                                다른 메일서버와의 통신로인 25번을 막으면 안된다.
(참고3) 서비스의 확인은 /etc/services 파일에서 확인한다.

8. 로그 파일 분석
(1) 개요: -l 플래그는 기록을 의미한다. 이 기록 파일은 일반적인 리눅스시스템에서는
          /var/log/messages에 남는다.
(2) 로그예
    Packet log: input DENY eth0 PROTO=17 192.168.2.1:53 192.168.1.1:1025 L=34 s=0x00 I=18
      F=0x0000 T=254 (#5)
(3) 로그설명
   input       : 규칙(로그 파일을 남기게 만든)을 포함한 사슬을 나타낸다.
   DENY        : 규칙이 패킷에게 한 행동이다. 만약 이 필드가 '-'라면 룰은 그 패킷에게 아무런
                효과도 주지 않은 것이다.
   eth0        : 패킷이 들어온 인터페이스이다.
   PROTO=17    : 패킷이 17번 프로토콜이라는 뜻이다. 가장 일반적인 프로토콜 번호는 1=icmp, 6=
                tcp, 17=udp정도이다.
   192.168.2.1 : 패킷의 출발지 IP주소
   :53         : 패킷의 출발지 포트 번호
   192.168.1.1 : 패킷의 목적지 IP주소
   :1025       : 패킷의 목적지 포트 번호
   L=34        : 패킷의 총길이 (byte)
   S=0x00      : TOS(Type Of Service)필드
   I=18        : ip의 ID
   F=0x0000    : 16bit fragment offset plus flags.
   T=254       : 패킷의 TTL(Time To Live)값이다. TCP/IP헤더에는 TTL값이 있는데 이것의 내용이
                다. 이것은 모든 홉(hop)들의 값이다. 보통 15 또는 255에서 시작한다.
   (#5)        : 괄호안의 값은 커널 2.2.9이후 버전에서만 볼 수 있다.
(참고4) ipchains 명령후에 즉시 반영시려면 ipchains-save하면 된다.

9. 기본동작 익히기
(1) 정책세우기
   예) 127.0.0.1 이라는 IP주소로부터 오는 ping패킷(ICMP패킷)을 무시하려 한다고 하자.
      => (분석)
        프로토콜: ICMP
        발신주소: 127.0.0.1
        목표(target): DENY
(2) 현재 정책의 확인
   [root@mybestone /root]# ipchains -L
   Chain input (policy ACCEPT):
   Chain forward (policy ACCEPT):
   Chain output (policy ACCEPT):
    => 어떠한 정책도 설정이 안되어 있음을 알 수 있다.
(3) 정책설정
   1) ping 테스트해보기
     [root@mybestone /root]# ping localhost
     PING localhost.localdomain (127.0.0.1) from 127.0.0.1 : 56(84) bytes of data.
     Warning: time of day goes back, taking countermeasures.
     64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=0 ttl=255 time=116 usec
      => 현재 ping이 됨을 알 수 있다.
   2) 정책설정하기
     [root@mybestone /root]# ipchains -A input -s 127.0.0.1 -p icmp -j DENY
     [root@mybestone /root]# ping -c 1 localhost
     PING localhost.localdomain (127.0.0.1) from 127.0.0.1 : 56(84) bytes of data.

     --- localhost.localdomain ping statistics ---
     1 packets transmitted, 0 packets received, 100% packet loss
      => ping이 되지 않음을 알 수 있다.
   3) 정책확인
     [root@mybestone /root]# ipchains -L
     Chain input (policy ACCEPT):
     target     prot opt     source                destination           ports
     DENY       icmp ------  localhost.localdomain anywhere              any ->   any
     Chain forward (policy ACCEPT):
     Chain output (policy ACCEPT):
(4) 정책지우기
   1) 번호로 지우기
    ㄱ. 개요: ipchains -L 했을 때 리스트를 보면 각 정책(현재는 input만 설정)의 리스트번호가
             위에서부터 차례로 1,2,3.. 번호가 설정되었다고 생각하면 된다. 그러므로 현재는
             input중에서 1번만 설정되었다.
    ㄴ. 사용예
       [root@mybestone /root]# ipchains -D input 1
        => 1번 규칙을 지운다.
   2) 전체명령으로 지우기
    ㄱ. 개요: 원래 설정한 명령에서 -A대신에 삭제하는 옵션인 -D를 사용하면 된다.
    ㄴ. 사용예
       [root@mybestone /root]# ipchains -D input -s 127.0.0.1 -p icmp -j DENY
    ㄷ. 정책확인
       [root@mybestone /root]# ipchains -L
       Chain input (policy ACCEPT):
       Chain forward (policy ACCEPT):
       Chain output (policy ACCEPT):
        => 삭제되었음을 알 수 있다.

10. 전체사슬 관련 동작익히기

(1) 개요: ipchains는 연관된 규칙을 묶어서 사용자가 정의한 사슬로 만들 수 있다. 사슬이름은
          기본 사슬명인 input, output, forward와 기본정책인 ACCEPT, DENY, REJECT, MASQ등을
          제외하고 정하면 되고 8자까지만 가능하다.
(2) 새로운 사슬 만들기
   [root@mybestone /root]# ipchains -N firewall
    => firewall이라는 사슬을 생성한다.
(3) 생성된 사슬의 확인
   [root@mybestone /root]# ipchains -L
   Chain input (policy ACCEPT):
   Chain forward (policy ACCEPT):
   Chain output (policy ACCEPT):
   Chain firewall (0 references):
    => firewall이라는 사슬이 생성되었음을 알 수 있다.
(4) 사슬 지우기
   [root@mybestone /root]# ipchains -X firewall
    => firewall이라는 사슬을 지운다. 사슬을 지우려면 사슬에 정책이 없는 빈사슬이어야 하고
      내장사슬을 지울 수 없다.
(5) 사슬비우기
   1) 개요: -F를 사용하여 사슬에 설정된 규칙을 지울 수 있다.
   2) 사용법
      ipchains -F [사슬명]
   3) 사용예
    ㄱ. ipchains -F
       => 전체 사슬에 대한 내용을 지운다.
    ㄴ. ipchains -F input
       => input 사슬에 대한 규칙만을 지운다.
(6) 사슬 규칙보기
   1) 개요: -L을 사용하여 사슬 속의 규칙을 볼 수 있다.
   2) 사용법
     ipchains -L [사슬명]
   3) 사용예
    ㄱ. ipchains -L
       => 전체 사슬의 내용을 출력한다.
    ㄴ. ipchains -L input
       => input사슬의 내용만을 출력한다.

11. IP 마스커레이드(Masquerade)
(1) 개요: IP Masquerade란 하나의 공인 IP를 가지고 여러 대의 컴퓨터가 인터넷을 이용하도록 하는
          기능을 말한다. 즉, TCP/IP패킷에 비공인 IP가 발신지일 경우 이를 실시간에 공인 IP로
          치환시켜주는 기능이다. 공인IP부여뿐만아니라, 동시에 여러 대의 클라이언트를 보호하는
          방화벽이 된다.
(2) IP 마스커레이드설정하기
   1) LAN CARD 추가 장착하기
     기존의 실질적으로 IP를 부여한 랜카드가 eth0로 세팅되어 있다. 여기에 추가로 랜카드를 하나
    더 장착한다. 이 랜카드는 리눅스상에서 eth1로 장착된다.
   2) eth1에 IP부여하기.
    ㄱ. 설명: 공인 IP대역말고 내부IP대역으로 할당된 것들중에서 IP를 부여한다. IP의 부여는
             /etc/sysconfig/network-scripts/ifcfg-eth1 이라는 파일에 적는다.
    ㄴ. 사용예: 여기서는 내부IP대역중에서 192.168.0.0대역을 쓰는 것으로 하고, IP는 192.168.0.1
               을 부여한다.
       DEVICE=eth1
       BOOTPROTO=static
       BROADCAST=192.168.0.255
       IPADDR=192.168.0.1
       NETMASK=255.255.255.0
       NETWORK=192.168.0.0
       ONBOOT=yes
   3) /etc/sysconfig/network 설정하기
     이 파일은 eth0의 게이트웨이값과 hostname을 지정해주는 파일이다. 이 파일에
    FORWARD_IPV4=true라는 항목을 추가한다.
   4) /etc/rc.d/rc.local파일에 다음의 항목을 추가한다.(대소문자 구분할 것.)
     ㄱ. 설명: /etc/rc.d/rc.local파일은 dos나 windows로 말하면 autoexec.bat파일에 해당하는
              것으로 부팅시 마다 참조하는 파일이다. 즉, 부팅할 때마다 마스커레이드 기능을
              이용하도록 설정하는 것이다.
     ㄴ. 설정예
       /sbin/ipchains -P forward DENY        // 기본정책은 모두 거부이다.
       /sbin/ipchains -A forward -s 192.168.0.0/24 -j MASQ  // C클래스대역의 내부아이피를 모두
                                                             사용
       echo 1 > /proc/sys/net/ipv4/ip_forward      // 내부아이피를 사용하도록 값을 인위적으로
                                                     부여
       /sbin/modprobe ip_masq_ftp            // 내부사용자들이 외부로 ftp서비스를 사용가능하게
                                              해줌
   5) 재부팅한다.
   6) eth1으로 부터 랜선을 뽑아 hub로 연결한다.
   7) 클라이언트(PC) 세팅
     ㄱ. 192.168.0.2부터 IP를 부여하여 세팅한다.
     ㄴ. 클라이언트 PC의 게이트웨이는 192.168.0.1(리눅스서버의 eth1의 값)로 세팅하고, Netmask
        는 255.255.255.0으로 세팅한다.

Trackback
Reply
우주곰:지구곰이 아닙니다.
지구곰이 아닙니다.
Categories (190)
Information (5)
About uzoogom (5)
My Advanced Linux (73)
Learning Linux (96)
OperatingSystem (5)
Databases (4)
OpenSource (1)
Tips! (1)
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31