블로그 이미지
GUCCI

카테고리

전체보기 (111)
여행 (1)
기기 (2)
쇼핑 (0)
게임 (0)
etc. (6)
취업이야기 (0)
업무일지 (5)
리눅스 (38)
웹프로그래밍 (2)
네트워크 (4)
JAVA (17)
Android (0)
IOS (2)
LUA (8)
C/C++ (1)
Objective C (2)
SERVER (2)
그누보드4 (1)
MSSQL (2)
Programming (1)
자바스크립트 (4)
HTML/CSS (1)
LGNAS (0)
Total
Today
Yesterday

'네트워크'에 해당되는 글 4건

  1. 2012.02.10 리눅스 - 포트포워딩
  2. 2012.02.10 NAT - KLDP 4
  3. 2012.02.10 NAT 3
  4. 2012.02.10 마스커레이드란? (IP MASQUERADING) 4


포트 포워딩(Port Forwarding)


1. port forwarding 을 왜 필요로 하게 되었는가?

    포트 포워딩(port forwarding)이 왜 필요하게 되었는지를 설명하는게 좋겠다. 아래 설명은 리눅스 초보자를 위해 자세히 썼으므로 리눅스에서 IP masquerade를 설정하여 사용하는 사람들은 다음 2 번으로 건너가도 된다.

    필자가 관리하는 네트워크 중 한 곳이 한국통신의 co-lan을 통해 인터넷을 사용하고 있다. co-lan은 VDM(Voice Data Multiplexer) 이란 장비를 사용하여 라우터를 사용 않고 피시의 시리얼포트에 직접 연결하므로 호스트 접속이다. 즉 IP 주소(공인)는 한 개만 나온다.

    co-lan이 연결된 피시에는 리눅스를 깔아 IP Masq를 설정하였으므로 리눅스와 랜으로 연결한 윈95 피시는 내부 어드레스(192.168.1.X)를 부여해 리눅스의 IP 주소를 공유해 인터넷을 사용한다.

    그리고 이 리눅스 호스트는 윈95의 파일서버, 프린터서버 등으로 사용되며 486이다. 그 외에 telnet, ftp 서버, DNS 서버로도 사용되고 있다. 웹서버는 설치되어 있지 않다.
    연결은 아래와 같다.
    이런 설정은 요즘 흔히 사용되므로 리눅스에서 IP masquerade만  알면 설치가 가능하다. 케이블모뎀이나 ADSL로 인터넷을 연결한 경우도 이런 형태로 구성해 여러 대의 피시에서 동시에 인터넷 사용이 가능하다.

    그런데 이 네트워크에 웹서버를 설치할 필요가 발생했다. 필자가 아는 업체서 전자상거래 프로그램 개발을 필자에게 의뢰했는데 개발용 서버를 이 네트워크에 설치하기로 했다. 개발에는 여러 사람이 참여하는데 집에서 인터넷을 통해 이 서버로 접속해 개발을 진행하기로 했다.

    전자상거래 개발에는 MySQL 및 PHP 등이 사용되고 접속도 많으므로 펜티엄급을 필요로 하는데 기존의 리눅스 서버는 486 급이다. IP는 한 개 밖에 없으므로 전자상거래용 웹서버를 펜티엄 피시에 설치하려면 기존의 486을 없애고 새로운 펜티엄 피시로 대치 후 기존의 486에서 사용되던 각종 데이터 및 서버 프로그램을 펜티엄 피시에 다시 설치해야 했다. 이 정도라면 별로 시간이 걸리지는 않지만 다른 문제가 발생한다.

    펜티엄 피시는 개발용이므로 외부에서 다른 사람들이 수시로 root 권한으로 들어오는데 여기에 다른 데이터를 넣는 건 보안에 문제가 발생한다.

    또 개발용이므로 여러 파일들을 수시로 설치 및 제거하므로 서버가 다운될 가능성도 있다. 그러면 그 네트워크의 전체 인터넷 사용이 중단된다. 개발이 끝나면 그 서버는 의뢰인에게 돌려 주어야 하므로 그때 또 데이터를 원래의 486으로 옮겨야 하는 문제도 있다.

    결론은 서버를 한 대 더 설치하여 서비스 종류(즉 포트 번호)에 따라 다른 서버로 연결되도록 하는 기능이 필요하다. 여기서는 인터넷에서 웹(포트 80)과 telnet(포트 23), ftp(포트 20, 21) 서비스 요청이 들어오면 펜티엄 피시에서, 그리고 메일이나 DNS 등 기타는 기존의 486에서 서비스하도록 설정해야 한다. 단 ip 즉 도메인네임(정확히는 FQDN)은 같아야 한다.

 

2. port forwarding 의 원리

    필요한 이유가 설명되었으니 아래는 port forwarding의 작동 원리를 간단한 그림으로 보자.

    IP Masquerade 가 클라이언트 쪽에서의 IP 공유라면 port forwarding은 서버에서의 IP 공유이다.

    리눅스A(486 피시)에 port forwarding을 구현한다면 네트워크는 아래와 같다.

    기본적인 구성은 위의 경우와 같다. 단지 내부 네트워크에(192.168.1.X) 리눅스 서버를 한대 더 추가해 내부 주소(192.168.1.11)를 부여한다. 이 서버는 내부 어드레스를 갖고 있으므로 인터넷에서 직접 연결할 수 없다.

    그러나 위의 리눅스 A에 port forwarding 기능을 부여하면 인터넷에 연결된 피시의 웹브라우저에서  http://168.126.127.6 으로 연결하면 192.168.1.11 내부 주소를 갖는 리눅스 B의 웹서버로 연결된다.

    이유는 간단하다. http 연결은 80번 포트를 사용하므로(별도의 지정이 없을 경우) 리눅스 A의 port forwar ding 프로그램이 인터넷에서 80번 포트로 연결 요청이 들어오면 그 패킷을 내부 주소를 갖는 리눅스 B(192.168.1.11)의 80번 포트로 방향을 바꾸어 주는 것이다.

    이 원리를 적용하면 telnet 은 192.168.13 번 서버로 ftp는 192.168.1.15번 서버로 등등 서비스별로 다른 내부 주소를 갖는 서버가 응답하게 할 수 있다. 한 대의 서버를 사용할 경우보다 시스템의 부하를 분산할 수 있는 이점이 있다.

    또 내부 서버의 포트 번호는 임의로 지정이 가능하다. 내부 서버에서 아파치 웹서버를 가동할 때 꼭 80번으로 할 필요는 없다. 아파치의 실행 포트 번호를 80번 외의 다른 번호로 httpd.conf에서 지정하고 port forwarding 설정에서 그 포트를 지정해 주면 된다. 외부 사용자는 여전히 웹브라우저에서 80번으로 연결하면 되므로 포트 변경 사실을 알 필요도 없다.

    (인터넷에서 http://192.168.1.11 명령은 사용할 수 없다는 것을 알아야 한다. 192.168.1.101 주소를 갖는 윈95에서만 가능하다. 그 이유를 알지 못한다면 이 글이 별 소용이 없다.)

    주의]  포트포워딩을 리눅스 A(168.126.127.6)에 설치했다 하더라도 내부 랜(192.168.1.0) 
              에서는 port forwarding이 작동하지 않는다. 
              즉 내부 랜에 연결된 윈95 피시 (192.168.1.101) 에서 http://168.126.127.6 명령을 
              해도 192.168.1.11에 설치된 웹서버가 응답하지 않는다. 내부 랜에서는
              http://192.168.1.11 로 연결해야 한다. 이는 port forwading의 한계라기 보다 tcp/ip
              네트워킹에서 이러한 라우팅을 허용하지 않기 때문이다.

    따라서 port forwarding 작동 여부를 확인하려면 인터넷의 다른 호스트에서 168.126.127.6 호스트로 연결해야 한다.

    앞으로 아래 글에서 포워딩서버는 포트포워딩 코드가 설치되는 서버(그림 2에서 리눅스 A)를 말하고 리시빙서버는 실제로 인터넷 서비스를 제공하는 내부랜에 설치된 서버(그림 2에서 리눅스 B)를 말한다.

 

3. 포트 포워딩 활용

    3.1 방화벽

    요즘 웹서버 보안이 중요한 문제로 대두되고 있는바 가장 설치가 간편한 웹서버 보안 대책으로 포트포워딩을 사용할 수 있다.

    리시빙 서버에 웹서버(apache)를 올려주고 포워딩서버의 포워딩 설정에 웹(http)만 리시빙 서버로 연결하고 telnet, ftp, mail 등 다른 모든 서비스는 포워딩서버나 다른 서버로 지정하든가, 또는 차단하면 웹서버로의 접근은 웹 자체를 제외한 다른 방법으로는 거의 불가능할 것이다. 즉 해킹에 필요한 웹서버의 정보를 알아내기가 힘들기 때문이다.

    왜냐하면 다른 모든 서비스는 포워딩서버에서 응답하므로 웹서버는 외부에 전혀 노출이 안된다. 비록 포워딩서버로 해킹에 성공해도 다시 웹서버로 접근하려면 웹서버의 보안망을 돌파해야 한다.

    3.2 게이트웨이

    요즘 랜카드는 100메가가 일반화되고 있지만 라우터는 아직 10메가를 사용하고 있다. 그래서 라우터와 웹서버(리눅스) 및 클라이언트(윈9x)를 같은 랜에 설치해 10메가로 연결하면 인터넷에서 서버로의 접근은 랜의 트래픽이 많으면 상당히 지체된다.

    자세히 설명하겠다.

    리눅스에 웹서버가 설치되어 있고 랜은 이더넷을 사용한다고 가정한다. 인터넷과 연결된 라우터도 같은 랜에 있다고 가정한다

    예를들어 윈95피시에서 웹서버나 윈98 피시로 큰 파일을 전송한다면 인터넷에서 웹서버로의 접근은 상당한 지체가 발생할 것이다. 이더넷의 원리를 안다면 그 이유를 짐작할 것이다. 랜에 피시가 많이 연결돼 있고 상호간에 데이터 전송이 빈번하다면 이로 인해 인터넷에서 웹서버로의 연결은 상당한 장애를 받는다.

    웹서버가 속도를 중시하는 전자상거래나 실시간으로 연결하는 예약 시스템 등으로 사용된다면 이러한 지체도 별로 바람직하지 못하다. 이걸 해결하는 방법은 3 가지 정도 존재한다.

    첫 번 방법은 랜 구조를 변경해 사내의 랜에서의 트래픽과 인터넷에서 웹서버로의 트래픽이 충돌하지 않도록 랜을 두 개로 분리하는 것이다. 가장 좋은 방법은 브리지를 사용해 랜을 두 개로 분리하는 것이다.(라우터로도 가능하나 복잡하다. 성능은 브리지가 낫다.)

    두 번째 방법은 스위칭허브를 사용하는 것인데 위의 브리지와 효과는 비슷하나 돈이 더 많이 든다.

    세 번째 방법은 가장 쉽고 간편하다. 즉 랜의 속도를 100메가로 올리는 것이다. 그런데 여기에 한가지 문제가 존재한다. 허브나 랜카드, 케이블은 100메가로 올리는게 쉬우나 라우터가 문제다.

    100메가를 지원하는 라우터가 있으나 무척 고가이고 또 우리나라의 ISP 들이 임대해 주는 라우터는 다 10메가 용이다.

    이 고민을 포트포위딩이 쉽게 해결해 줄 수 있다. 즉 포워딩서버에 랜카드를 두 개 꼽아 인터넷과 연결된 라우터 쪽은 10메가로 하고 웹서버가 연결된 내부 랜은 100메가로 하면 된다. 즉 포워딩서버가 10메가 100메가 게이트웨이 구실을 하는 것이다.

    인터넷에서 웹서버로 연결할 때는 라우터에서 리눅스 까지는 10메가로 연결되나 라우터와 리눅스를 연결하는 랜에는 다른 피시가 전혀 없으므로 아무런 지체가 발생하지 않는다. 내부 랜에는 여러 피시가 연결되어 있지만 속도가 100메가 이므로 지체는 훨씬 줄어들 것이다.

    3.3 시스템 부하 분산

    한 대의 서버에 한 개의 도메인네임(정확히는 FQDN, 예를들면 www.linuxlab.co.kr)을 부여해 웹, 메일, telnet. ftp 등 여러 서비스를 다 제공하는 경우 사용이 너무 많아 서버의 용량이 부족하면 그 기계를 버리고 새로운 기계로 대치해야 한다.

    만약 최고급 사양의 피시로 대체해도 감당할 수 없다면 그 때는 워크스테이션급으로 교체해야 하는데 비용도 문제지만 기존의 데이터나 소프트웨어를 새로운 기계로 옮기는게 만만치 않은 비용과 시간을 요한다.

    여기에 포트포워딩을 이용하면 한 대의 서버가 담당하던 서비스를 여러 대로 분산할 수 있다. 한 대는 웹서버, 다른 한 대는 메일 및 bbs(telnet) 서버, 또 다른  한 대는 ftp 서버 등 등이다.

    서비스 종류에 따라 여러 대의 기계로 분산할 수 있어 기존 서버를 교체하지 않고도 간편히 성능을 수 배로 늘릴 수 있다. 워크스테이션을 필요로 하는 용량을 피시 몇대로 가능케 해주는 좋은 해결책이다.

 

4. port forwarding 설치 절차

    port forwarding은 ip masquerade와 관련이 있다. 실제 구현에는 IP masq 코드를 상당 부분 그대로 사용한다. 단지 그 반대의 기능을 수행해 줄 따름이다. 따라서 port forwarding을 설치하려면 우선 ip masq를 설치할 줄 알아야 한다.

    우선 간략한 절차를 설명하고 다음에 각 절차별로 상세히 설명한다. 모든 셋업은 공인 IP 주소를 갖는 게이트웨이 서버(위의 그림에서 리눅스 A)에서 이루어 지고 서비스를 제공하는 내부 랜의 서버(리눅스 B)는 서버 프로그램만 올려주면 된다.

    1) 커널 소스 설치

    커널 소스는 꼭 필요치는 않다. 그러나 ipmasqadm 패키지를 소스를 받아 컴파일해서 설치하고자 한다면 커널 소스가 /usr/src/linux에 설치돼 있어야 한다. 또 커널 내에 IP masq와 port forwarding 코드를 넣어 컴파일할 경우도 필요하다.

    2) ipchains 패키지 설치

    ip masquerading에 필요하다. 모든 배포본이 리눅스 설치시 기본으로 이 패키지를 설치하므로 별도의 설치 절차가 필요 없다. port forwarding 을 구현하려면 우선 ip masq가 먼저 작동 되야 한다.

    혹시 설치되지 않았으면 레드햇의 경우 CD에서 rpm -i 명령으로 설치한다.

    3) ipmasqadm 설치

    port forwarding에 필요한 패키지다. 아직 시험용이지만 필자가 사용해 본 결론은 당장 사용해도 별 문제가 없다. 소스를 받아 설치할 수도 있고 배포본 CD에 있는 것을 설치할 수도 있다. CD에는 들어 있으나(레드햇의 경우 ipmasqadm-0.4.2-3.i386.rpm) 설치에는 빠져 있을 수 있다.

    4) 커널 컴파일

    커널 컴파일도 필수는 아니다. ipmasquerade 와 port forwarding 코드를 모듈로 올려 주어도 된다. 커널 코드에 내장하는 경우와 모듈로 올리는 경우 장단점이 있다. 그러나 자주 사용하는 기능이라면 커널코드에 포함시켜 컴파일 하는게 좋다.

    5) port forwarding 구현

    port forwarding 을 해 주는 서버(리눅스 A)에  ipmasq uerading, port forwarding, 네트워크 파일 설정 과정이다.

    6) 내부 서버 셋업

    내부에 설치되는 서버(리눅스 B) 즉 실제로 외부에서 연결이 되는 서버의 셋업 이다. 특별한 패키지는 필요 없다. 네트워크 설정에서 디폴트게이트웨이를 port forwarding을 해주는 서버의 이더넷카드 ip 주소(192.168.1.1)로 지정해주면 된다. 그러나 이 서버가 웹서버로 사용된다면 웹서버를 올려주어야 하고 telnet, ftp 를 제공해 준다면 telnet, ftp 연결이 가능하도록 설정 되야 한다. 위의 그림의 윈95 피시에서 192.168.1.11 주소로 웹, telnet, ftp 연결이 되면 셋업에 문제가 없다. 이 부분은 별도의 설명을 않는다.

     

5. port forwarding 설치 실제 예

    필자가 port forwarding을 실제로 설치한 사례를 여기에 상세히 설명한다.

    여기서는 2 대의 서버를 갖는 네트워크를 구성했다. 포워딩서버(port forwarding 이 설치되는 서버)는 데비안(2.1 R2),  리시빙 서버는 수세 (6.3)을 사용했고  웹(http)과 telnet, ftp만 리시빙서버로 포워딩하는 설정이다.

    위에 말한 것처럼 모든 설치는 데비안에서 이루어 진다. 수세에서의 네트워크 설정은 설명하지 않는다.

    5.1  커널 소스 설치

    커널소스는 ipmasqadm 패키지를 직접 컴파일해서 설치하는 경우와 ip masquerade 및 ip port forwarding 코드를 모듈로 올리지 않고 커널코드에 포함시킬 때 필요하다.

    그러나 ipmasqadm 패키지는 레드햇(6.1)의 경우 CD에 있으므로 rpm으로 설치하면 되고 masquerade 및 port forwarding 코드는 모듈로 만들어져 있으므로 modprobe 명령으로 추가 시켜 주면 된다.

    필자는 데비안 2.1 R2 버전을 사용하고 있으므로 커널을 최신 커널인 2.2.14 로 바꾸면서 커널을 새로 컴파일해  커널 내에 masquerade 및 port forwarding 코드를 넣었다. ipmasqadm 패키지도 소스를 받아 컴파일해 만들었다.

    커널 소스를 새로 설치하는 방법은 아래와 같다.(2.2.14 버전을 기준으로 한다)

    (커널 컴파일 방법은 여러가지가 가능하나 여기서는 가장 일반적인 방법만 설명한다)

    1) 웹브라우저에서 ftp://ftp.kernel.org/pub/linux/kernel/v2.2/를 실행해서
        linux-2.2.13.tar.gz 파일을 받는다.

    2) 이 파일을 /usr/src 디렉토리에 넣는다.

    3) 이미 다른 버전의 커널 소스가 설치되어 있을 수 있으므로 아래 명령으로 기존의 
        커널 소스를 제거한다.

      cd /usr/src
      rm -rf linux

    4) 커널 소스 압축을 푼다.

      tar   zxvf   linux-2.2.14.tar.gz

    5) 필요한 링크를 해 준다.

      cd  /usr/include
      rm -rf asm linux scsi
      ln -s /usr/src/linux/include/asm-i386  asm
      ln -s /usr/src/linux/include/linux linux
      ln -s /usr/src/linux/include/scsi scsi

    아래처럼 나와야 한다

    hansol!root:/usr/src$ cd /usr/include/
    hansol!root:/usr/include$ ls -l asm linux scsi
    lrwxrwxrwx   1 root     root   32 Feb  5 13:09 asm -> /usr/src/linux/include/asm-i386/
    lrwxrwxrwx   1 root     root   29 Feb  5 13:09 linux -> /usr/src/linux/include/linux/
    lrwxrwxrwx   1 root     root   27 Feb  5 13:09 scsi -> /usr/src/linux/include/scsi

    6) cd  /usr/src/linux

    7) make menuconfig
        커널에 ip masquerade와 ip port fortforwarding 코드를 넣어 컴파일하려면 아래 선택에서
        yes를 해 준다.(모듈로 올려도 된다)

      Code maturity level options  --->
      [*] Prompt for development and/or incomplete code/drivers
      General setup  --->
      [*] Networking support
      Block devices  --->
          <*> Loopback device support
      Networking options  --->
      [*] Network firewalls
      <*> Unix domain sockets
      [*] TCP/IP networking
      [*] IP: advanced router
      [*] IP: firewalling (NEW)
      [*] IP: masquerading (NEW)
      [*] IP: ICMP masquerading (NEW)
      [*] IP: masquerading special modules support (NEW)
      <*> IP: ipportfw masq support (EXPERIMENTAL) (NEW)

    여기에 나열한 것은 포트포워딩과 직접 관련된 것만 예시했다. 이외에도 랜 및 랜카드 관련 옵션들은 시스템에 맞게 설정해야 한다.

    8)  make dep
    9)  make clean
    10)  make bzImage

    컴파일이 실행된다. 피시 기종에 따라 5 ~ 30분이 소요된다.

    아래는 커널 모듈을 컴파일 및 설치해 준다.

    11)  make modules
    12) make modules_install
    13) 만들어진 커널을 /boot에 넣고 lilo를 실행한다.

    5.2  ipchains 패키지 설치

    모든 배포본이 기본으로 설치해 주므로 별도의 설치 절차가 필요 없다. 데비안의 경우 /sbin/ipchains 파일이다.

    5.3  ipmasqadm 패키지 설치

    rpm으로 설치하는게 간편하나 소스를 받아 직접 설치하면 그 안에 각종 문서가 있으므로 자세한 사항을 알 수 있다.

      5.3.1 소스 있는 곳

      http://juanjox.linuxhq.com에 있다고 하나 찾지를 못해서 sunsite.unc.edu 의 slackware 에서 소스를 가져왔다. 파일명은  ipmasqadm-0.4.2.tar.gz이다.

      5.3.2 소스 설치

      아무 디렉토리에서 tar  zxvf  ipmasqadm-0.4.2.tar.gz 명령을 주면 ipmasqadm-0.4.2 디렉토리가 만들어 지며 그 안에 소스 및 도큐먼트 파일이 위치함.

      아래는 디렉토리의 내용임

      [root]/apps/ipmasqadm-0.4.2$
      -rw-r--r--   1 240      714           801 Nov 26  1998 ChangeLog
      -rw-r--r--   1 240      714           428 Nov 26  1998 Common.mk
      -rw-r--r--   1 240      240          1040 Dec  5  1998 Makefile
      drwxr-xr-x    2 240      714          1024 Dec  5  1998 doc
      drwxr-xr-x    2 240      714          1024 Nov 17  1998 include
      drwxr-xr-x    2 240      714          1024 Dec  5  1998 ipmasqadm
      -rw-r--r--   1 240      240          1055 Dec  5  1998 ipmasqadm-0.4.spec
      drwxr-xr-x    2 240      714          1024 Dec  5  1998 lib
      drwxr-xr-x    2 240      714          1024 Dec  5  1998 man
      drwxr-xr-x    2 240      714          1024 Dec  5  1998 modules

      doc 디렉토리에 도큐먼트가 있다.

      5.3.3 컴파일 및 관련 파일 설치

      *. 컴파일 전에 리눅스 커널 소스가 /usr/src/linux에 있어야 한다.

      1)  cd ipmasqadm-0.4.2

      2) Makefile 을 수정함.

      20번 라인의 
      @test -f $(KSRC)/include/linux/ip_masq.h 라인을 
      @test -f /usr/src/linux/include/linux/ip_masq.h 으로 수정

      3) make

      4) make install

      관련 파일들이 해당 디렉토리에 설치된다.
      실행 파일(ipmasqadm)은 /usr/sbin에 위치함.

    5.4 ip masquerade 설정

    포트포워딩은 ip masq를 먼저 잡아주어야 한다.

    Ip masq를 설정하기 위해 우선 두 개의 모듈을 올려 준다. 필자는 필요한 모든 코드를 커널에 넣었지만 모듈로만 가능한 부분이 있어 아래처럼 데비안의 /etc/rc.boot 디렉토리에 파일을 만들어 넣었다.

    데비안의 경우 rc.boot 디렉토리의 스크립트들이 부팅 때 실행하고자 하는 사용자 쉘스크립트를 넣는 곳인데 여기에 나열된 순서대로 실행된다.

      1) 모듈 올리기

        hansol!root:/etc/rc.boot$ cat 10module
        #!/bin/bash
        /sbin/depmod -a
        /sbin/modprobe ip_masq_ftp.o

      ip masq 관련 다른 모듈이 여럿 있으나 필자는 쓰지 않으므로 넣지 않았다.

      2) ip forwarding 및 ipchains 실행

      데비안은 외부 네트워크 와 내부 네트워크를 연결하는 게이트웨이 구실을 하므로 ip forwarding을 가능케 해야 한다.

      레드햇은 /etc/sysconfig/network 파일에서 FORWARD_IPV4=true 로 해주면 된다.

      필자는  /etc/rc.boot/20ipchain 파일에 ip forwarding과 ipchains 를 같이 넣었다.

        #!/bin/bash
        echo “1” > /proc/sys/net/ipv4/ip_forward
        /sbin/ipchains -P forward DENY
        /sbin/ipchains -A forward -s 192.168.1.0/24 -j MASQ

      3) 포트포워딩 설정

      아래는 웹(httpd), telnet, ftp 세가지 서비스를 192.168.1.11 어드레스를 갖는 내부 서버로 포워딩해주는 설정이다.

      23은 telnet, 80은 httpd, 20,21은 ftp 에서 사용하는 포트 번호다.

      hansol!root:/etc/rc.boot$ cat 30port_forwd
      #!/bin/bash
      /usr/sbin/ipmasqadm portfw -a -P tcp -L 168.126.127.6 23 -R 192.168.1.11 23
      /usr/sbin/ipmasqadm portfw -a -P tcp -L 168.126.127.6 80 -R 192.168.1.11 80
      /usr/sbin/ipmasqadm portfw -a -P tcp -L 168.126.127.6 20 -R 192.168.1.11 20
      /usr/sbin/ipmasqadm portfw -a -P tcp -L 168.126.127.6 21 -R 192.168.1.11 21

    5.5 점검

    포트포워딩 설정이 정확한지를 확인하는 절차다.

      1) ip masq 설정 점검

      netstat  -nM 명령을 주면 ip masq 상태를 알 수 있다.
      단, 실제로 사용 중이어야 아래 출력이 나온다.

      netstat -nM
      IP masquerading entries
      prot   expire source                     destination            ports
      udp   4:46.96 192.168.1.105        168.126.63.1         1582 -> 53 (64273)
      udp   2:41.26 192.168.1.105        168.126.63.1         1571 -> 53 (64262)
      udp   1:46.70 192.168.1.105        168.126.63.1         1567 -> 53 (64258)
      udp   0:52.03 192.168.1.105        168.126.63.1         1565 -> 53 (64256)

      2) 포트포워딩 점검

      hansol!root:~$ ipmasqadm portfw -ln
      prot    localaddr               rediraddr              lport    rport   pcnt   pref
      TCP  168.126.127.6        192.168.1.11           21       21      10     10
      TCP  168.126.127.6        192.168.1.11           20       20      10     10
      TCP  168.126.127.6        192.168.1.11           80       80      10     10
      TCP  168.126.127.6        192.168.1.11           23       23      10     10

      위에서 168.126.127.6은 공인어드레스 (www.linux journal.co.kr)이고 192.168.1.1은 내부어드레스이다.

      이제 외부에서 http://www.linuxjournal.co.kr 명령을 주거나 telnet www.linuxjournal.co.kr ftp www.linuxjournal.co.kr 명령을 주면 192.168.1.11 주소를 갖는 서버가 응답을 한다.

      그러나 주의할 건 연결하는 측에서 볼 때 연결된 서버의 어드레스는 168.126.127.6 어드레스로 나타난다는 것이다. (당연한 이야기인데 왜 하느냐고요?)

      아래는 210.126.21.62 호스트(리눅스)에서 telnet 168.126.127.6 명령을 준 경우 세 호스트의 netstat 출력 내용이다.

      1) 210.126.21.62 (연결하는 측)

      [root@ppp /root]# netstat -n
      Active Internet connections (w/o servers)
      Proto Recv-Q Send-Q   Local Address         Foreign Address          State
      tcp        0          0      210.126.21.62:1044   168.126.127.6:23    ESTABLISHED

      2) 168.126.127.6(포워딩서버)

      hansol!root:~$ netstat -nM
      IP masquerading entries
      prot   expire      source                destination             ports
      tcp  13:34.78 192.168.1.11         210.126.21.62        23 -> 1044 (23)
      tcp  10:36.35 192.168.1.101       210.126.21.62        1106 -> 23 (61119)
      tcp  13:34.97 192.168.1.101       210.126.21.62        1103 -> 23 (61070)

      3) 192.168.1.1(리시빙서버)

      joa:~ # netstat -n
      Active Internet connections (w/o servers)
      Proto   Recv-Q Send-Q  Local Address     Foreign Address           State
      tcp          0         126     92.168.1.11:23    210.126.21.62:1044    ESTABLISHED

      주의] 포트포워딩을 테스트할 때는 인터넷의 다른 호스트에서 해야 함을 명심할 것

      포트 포워딩 테스트시 각 인터페이스에서의 패킷 이동 상황을 파악하려면 iptraf 프로그램을 사용해 보기 바란다.

이 기사는 리눅스 월드 2000년 3월호에 실려 있습니다.




▲ top

리눅스 월드

'네트워크' 카테고리의 다른 글

NAT - KLDP  (4) 2012.02.10
NAT  (3) 2012.02.10
마스커레이드란? (IP MASQUERADING)  (4) 2012.02.10
Posted by GUCCI
, |

NAT - KLDP

네트워크 / 2012. 2. 10. 00:21

1. 들어가는 글

친애하는 독자 여러분, 반갑습니다.

여러분은 이제 NAT(Network Address Translation, 네트워크 주소 변환)라는 매혹적인 세계(때론 끔찍하기도 하지만)로 들어서려 합니다. 이 HOWTO 문서는 여러분에게 2.4 리눅스 커널 및 그 이후 버젼에 대한 꽤 정확한 가이드가 될겁니다.

리눅스 2.4에서는 넷필터(netfilter)라 불리는 패킷 변경을 위한 인프라가 깔려있습니다. 이를 기반으로 하여 NAT기능이 작동됩니다. 이번 버젼은 예전 커널과 다르게 완전히 새로운 방식으로 구현된 것입니다.

(C) 2000 Paul `Rusty' Russell. Licensed under the GNU GPL.

2. 공식 웹 사이트와 관련 리스트는 어디에 있나요?

세개의 공식 사이트가 존재합니다:

여러분은 http://www.netfilter.org/ 과 http://www.iptables.org/ 를 경유하여 round-robin DNS를 사용해 그 사이트들에 접속 가능합니다.

공식적인 메일링 리스트를 알아보시고 싶으신 분은 netfilter List를 보세요.

2.1 네트워크 주소 변환이란 무엇입니까?

보통 네트워크 상의 패킷들은 발신지(예를들어 여러분 가정의 컴퓨터)를 출발하여 수신지(예를 들어 www.gnumonks.org라는 사이트)에 도착할때까지 때 여러 링크를 거쳐 전송됩니다. 제가 있는 호주에서는 그 사이트까지는 보통 19개 정도 거칩니다. 이들 링크들은 모두 전송 패킷을 변환시키지 않고 바로 목적지로 보냅니다.

이러한 링크중 하나가 NAT 를 한다고 하면 그 패킷이 통과할 때 발신지 혹은 수신지를 변환시킵니다. 쉽게 짐작되듯 이것은 일반적인 시스템의 동작 방식이 아닙니다. 그러므로 NAT를 거는 것은 언제나 필수가 아닌 선택사양입니다. 보통 NAT를 걸었던 링크는 패킷을 어떻게 변경했는지를 기억할겁니다. 그리고나서 응답 패킷이 다른 길을 통해 그 링크를 통과할 때 패킷을 역으로 변경하여 원복할겁니다. 그렇게되면 모든게 문제없이 돌아가겠죠?

2.2 NAT가 필요한 이유는 무엇입니까?

당신이 완벽한 세상을 산다면 그럴 필요가 없겠죠. 하지만 그렇지 않고 주로 다음과 같은 이유가 있기에 사용됩니다:

모뎀으로 인터넷에 연결하기

대부분의 ISP들은 dial-up 접속을 할 때 단 한개의 IP 주소만을 부여합니다. 패킷을 외부 네트워크로 전송할 때 아무 발신지 주소를 달아서 내보낼 수 있지만 부여받은 IP주소를 발신지로 달아 보냈을 때만 그에 대한 응답이 돌아옵니다. 여러 대의 컴퓨터 머신들이(예를 들어 홈 네트워크) 모두 이 하나의 링크를 통해서 인터넷과 연결되길 원한다면 그 때 NAT가 필요합니다.

이것이 가장 보편적인 사용 이유입니다. 보통 리눅스 세계에서는 이를 매스커레이딩(masquerading)라 하지만 저는 이를 SNAT라고 부르겠습니다. 그 이유는 첫 패킷의 발신지(source) 주소를 바꾸기 때문입니다.

여러대의 서버 운영하기

종종 외부에서 내부 네트워크로 들어오는 패킷들의 수신지를 바꿀 필요가 있습니다. 보통 사용자들이 단 한개의 IP 주소만(위에서 설명된 바와 같이) 할당받아 사용하기 때문입니다. 그러한 환경에서도 부여 받은 단 하나의 실제 IP주소를 가지고 외부에서 내부에 존재하는 여러대의 컴퓨터 박스로 접속되게 하고 싶다는 생각이 들 때가 있습니다. 이 경우 들어오는 패킷의 수신지 주소를 다시 쓰는 방법으로 이 문제를 해결할 수 있습니다. 이러한 형태의 NAT를 전 버젼의 리눅스에서는 포트 포워딩(port forwarding)이라고 불렀습니다.

실제 IP주소 하나를 여러대의 컴퓨터 머신들과 매핑하여 패킷들을 여러대의 머신들로 분산시키는 것은 일반적으로 사용되는 부하 분산 방식 중 하나입니다. 큰 규모의 부하 분산을 원한다면 아래를 참조하세요.

리눅스 가상 서버.

투명 프록시 기능(Transparent Proxying)

종종 투명 프록시를 만들고 싶어 리눅스 박스를 통과하는 패킷들을 박스 내부에 동작중인 프로그램으로 향하는 것처럼 방향을 조작하고 싶을 때가 있습니다. 프록시란 내부 네트워크와 외부 네트워크사이에 존재하며 그 둘 사이의 통신을 재조정하는 프로그램을 말합니다. 투명하다는 말이 붙은 이유는 프록시가 동작함에도 불구하고 내부 네트워크가 (실제로는) 프록시와 통신하는 것을 전혀 알지 못하기 때문입니다.

Squid가 이 방식으로 작동되도록 설정 가능합니다. 전 리눅스 버젼에서는 방향 변경(redirection) 혹은 투명 프록시 기능 이라고 불렀습니다.

3. NAT의 두가지 형태

제 경우 NAT를 두가지 형태로 분류했습니다. 하나는 발신지 NAT(SNAT)이고 다른 하나는 수신지 NAT(DNAT)입니다.

발신지 NAT는 첫 패킷의 발신지 주소를 바꾸는 경우를 말합니다. 즉 접속을 시작하는 지점의 주소를 바꾸는 것입니다. 발신지 NAT는 라우팅 후(post-routing)에, 즉 통신선을 타고 밖으로 나가기 직전의 패킷에 대해 이루어집니다. 매스커레이딩은 SNAT의 특별한 형태중 하나입니다.

수신지 NAT는 첫 패킷의 수신지 주소를 전환하는 경우를 말합니다. 즉 패킷의 접속 목적지의 주소를 바꾸는 것입니다. 수신지 NAT는 언제나 라우팅 전에(즉, 패킷이 통신선에서 방금 들어온 시점) 이루어집니다. 포트 포워딩, 부하 분산, 투명 프록시 기능들은 모두 DNAT 방식으로 구현됩니다.

4. 2.0과 2.2 커널에서 현재 방식으로 간단하게 전환하기

2.0(ipfwadm)에서 2.2(ipchains)으로 전환하느라 고생한 분께 미안하군요. 좋은 소식과 나쁜 소식 둘다 있습니다.

좋은 소식부터 말하면 2.4 버젼에서 전과 마찬가지로 ipchains와 ipfwadm를 간단히 사용할 수 있습니다. 예전 것을 사용하고 싶으면 최신 배포반에 있는 `ipchains.o' 이나 `ipfwadm.o' 커널 모듈을 insmod로 올려야 합니다. 한가지 주의할 점은(전에도 말씀드렸지만) 이들은 상호 배타적이어서 신구 버젼을 동시에 사용할 수 없습니다.

이들 신구 버젼중 하나가 인스톨되면 보통때처럼 ipchains나 ipfwadm을 사용할 수 있습니다. 단 차이점은 다음과 같습니다:

  • ipchains -M -S 나 ipfwadm -M -s를 이용하여 매스커레이딩 종료시간을 세팅해도 효과없습니다. 종료시간이 새로운 NAT 인프라보다 길기 때문에 아무 의미가 없습니다.
  • 마스커레이드 리스트를 상세(verbose) 조회를 해도 init_seq, delta, previous_delta 필드는 언제나 0 으로 보입니다.
  • 동시에 두 인자 `-Z -L'를 사용하여 카운터를 0으로 만들고 관련 리스트를 보여주는 기능은 더이상 동작하지 않습니다: 이젠 카운터가 0이 안됩니다.
  • 구버젼 호환용으로 사용되는 방화벽은 scalable하지 않아서 대규모 접속이 이루어지는 네트워크에 사용되기 힘듭니다. 회사 게이트웨이(gateway)같은 곳에는 사용치 말기 바랍니다!

해커들이라면 다음의 경우도 알 필요가 있을지 모르겠군요:

  • 이젠 매스커레이딩 기능이 사용중이어도 포트 61000-65095번을 바인드(bind)할 수 있게 되었습니다. 예전에는 매스커레이딩 코드가 이 범위 내의 포트가 사용중이라고 가정하여 프로그램들이 이 포트를 사용 못했습니다.
  • 이젠 정식 사용법으로 문서화되지 않은 `getsockname' 의 편법적인 사용(해킹)이 더 이상 통하지 않습니다. 접속한 연결의 실제 수신지를 알아내는 투명 프록시 프로그램이 더 이상 그 방법으로 동작하지 않습니다.
  • 외부 주소와 바인드(bind)하는 (정식 사용법이 아닌) 해킹도 이젠 더 이상 작동되지 않습니다. 예전엔 이 방법을 통해 프록시를 완전 투명하게 만들었습니다.

4.1 전 매스커레이딩만 하면 되요! 어쩌죠!

대부분 이게 궁금할 것입니다. 동적으로 IP를 할당받는 PPP dialup을 사용한다면(당신이 그게 무언지 모른다면 바로 당신이 지금 사용하고 있는 그 접속법이다), 내부 네트워크에서 발생한 모든 패킷들이 PPP dialup 박스에서 발생한 것처럼 보이게 하고 싶을겁니다.

# NAT 모듈을 올려라(다른 것들도 따라 올라간다).
modprobe iptable_nat

# NAT 테이블(-t nat)에, 라우팅후(POSTROUTING)  
#ppp0를 통해 나가는 모든 패킷(-o ppp0) 이 
#마스커레이드(-j MASQUERADE)되도록 규칙을 첨가(-A)
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

# IP 패킷이 포워딩되도록 설정
echo 1 > /proc/sys/net/ipv4/ip_forward

매스커레이딩을 하는 지점에서는 패킷 필터링을 하지 않는다는 사실을 알고 있어야 합니다. 무슨 말인지 좀더 자세히 알고 싶으면 패킷 필터링 HOWTO에서 ‘NAT와 패킷 필터링 함께 쓰기’ 편를 보세요.

4.2 ipmasqadm의 경우는 어떻게 하죠?

이것은 현재 소수의 특정 사용자만 이용하고 있습니다. 그래서 저는 이 구 버전과 현재의 것의 호환을 별 신경쓰지 않고 있습니다. 포트 포워딩을 하기 위해서라면 간단히 `iptables -t nat' 를 사용하면 됩니다. 예를 들어 리눅스 2.2에서 아래 방법으로 구현하였다면:

# 리눅스 2.2
# 1.2.3.4 의 포트 8080으로 오는 패킷을 192.168.1.1의 포트 80으로 바꿔 전송
ipmasqadm portfw -a -P tcp -L 1.2.3.4 8080 -R 192.168.1.1 80

현재 버전에서는 다음처럼 하면 됩니다:

# 리눅스 2.4
# 라우팅 전에(-A PREROUTING)  1.2.3.4(-d 1.2.3.4) 의 포트 8080(--dport 8080)으로 
# 들어오는 TCP 패킷이(-p tcp)  192.168.1.1의 포트 80(--to 192.168.1.1:80)으로
# 매핑되도록 NAT 테이블에(-t nat)  규칙을 더하라.
iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 --dport 8080 \
        -j DNAT --to 192.168.1.1:80

5. NAT 대상 패킷 정하기

iptables 툴(매우 다목적을 사용됩니다)을 사용하면 어떤 연결을 변경할지와 그것을 어떤 식으로 변환할지 정하는 NAT 규칙을 만들어 커널에 설정할 수 있습니다. ‘-t nat’ 옵션을 가지고 이 툴을 이용하면 NAT 테이블이 변경됩니다.

NAT 테이블은 ‘chains’라는 세 종류의 리스트로 구성되어 있습니다 : 패킷이 들어오면 일치하는 규칙을 찾을 때까지 순차적으로 하나씩 검사됩니다. 머신 안으로 막 들어온 패킷의 수신지 주소를 변환하는 PREROUTING chain과 머신 밖 나가는 패킷의 발신지 주소를 변환하는 POSTROUTING chain이 있습니다. 세번째 chain으로 OUTPUT이라는 것이 있는데 일단 이건 논외로 합시다.

아래 도식이 그들 관계를 잘 보여줍니다.(제가 그림을 잘 그린다면):

      _____                                     _____
     /     \                                   /     \
   PREROUTING -->[Routing ]----------------->POSTROUTING----->
     \D-NAT/     [Decision]                    \S-NAT/
                     |                            ^
                     |                            |  
                     |                            |
                     |                            |
                     |                            |
                     |                            |
                     |                            |
                     --------> Local Process ------

위 그림에서 보이는 각 지점을 패킷이 통과할 때 그것이 어떤 연결과 관련되어있는지를 조사합니다. 그것이 만약 새로운 연결이라면 그 패킷을 어떻게 처리할지를 결정하는 해당 chain(NAT 테이블에 존재)를 뒤집니다. 그 테이블에서 찾은 답으로 그 연결에 관련되어 앞으로 올 패킷에 적용시킵니다.

5.1 iptables를 이용한 기본 설정

iptables는 아래에 열거될 많은 표준 옵션을 가지고 있습니다. iptables는 다른 옵션들과 구분 가능하다면 이중 dash(-) 옵션들을 모두 약자화(abbreviation)하여 사용할 수 있습니다. 커널이 iptables를 지원한는 모듈을 가지고 있는경우 먼저 ip_tables.o 모듈을 올려야 겠죠. `insmod ip_tables'하면 됩니다.

여기서 가장 중요한 옵션은 테이블을 선택케 하는 `-t' 옵션입니다. NAT 작동을 하려면 언제나 NAT테이블에 `-t nat' 인자를 사용해야 합니다. 그 다음으로 중요한 옵션이 chain 끝에 새로운 규칙을 추가하는 ‘-A’옵션(사용 예 : `-A POSTROUTING') 입니다. chain처음에 넣고 싶다면 ‘-I’옵션을 쓰면 됩니다.(사용 예 : `-I PREROUTING')

패킷이 변환된 후의 발신지와 수신지는 각각 `-s' (혹은 `--source')와 `-d'(혹은 `--destination')로 설정합니다. 그 다음으로 IP 주소 한 개 혹은 도메인 이름이나 네트워크 주소를 써야합니다. 예를 들어 IP주소(한개)는 192.168.1.1 과 같이, 도메인 이름은 www.gnumonks.org 그리고 네트워크 주소의 경우 192.168.1.0/24 혹은 192.168.1.0/255.255.255.0 와 같은 식으로 써넣으면 됩니다.

그리고 규칙 일치 대상으로 패킷이 나가고 들어오는 네트워크 인터페이스를 정할 수 있습니다. 들어오는 경우 `-i' 혹은 `--in-interface' 옵션을 사용하고 나가는 경우 `-o' 혹은 `--out-interface' 옵션을 사용합니다. 그러나 이 옵션은 규칙을 집어넣는 위치에 따라 특정 옵션만 들어갈 수 있습니다. PREROUTING 위치에서는 들어오는 인터페이스만 정할 수 있고 POSTROUTING 위치에서는 나가는 인터페이스만 정할 수 있습니다. 틀리게 설정할 경우 iptables가 에러를 냅니다.

5.2 변환 대상 패킷을 더 정교하게 선정하기

변환 대상이 되는 발신지와 수신지 주소를 설정할 수 있다고 앞서 말씀드렸지만 그 발신지 주소 옵션을 생략한 경우 모든 발신지 주소가 변환됩니다. 변환 대상 수신지 주소 옵션을 생략하면 모든 수신지 주소가 변환되버립니다.

그리고 `-p' 혹은 `--protocol'을 사용하여 변환의 대상이 되는 프로토콜을 선정할 수 있습니다. 옵션 인자로 TCP, UDP등을 줄 수 있죠. 이 프로토콜에 해당하는 패킷들만 규칙에 걸립니다. 보통 이 옵션은 그 다음에 추가적으로 따라붙는 발신지/수신지 포트 옵션을 정하기 위해 사용됩니다. 발신지 포트는 `--source-port'로 설정하고 수신지 포트 옵션은 `--destination-port'로 정합니다. 약자로 `--sport' 와 `--dport'이 사용됩니다.

이 옵션을 사용하면 해당 발신지/수신지 포트만 규칙에 걸리죠. 이 설정은 주로 다른 패킷들은 그대로 두고 웹 연결 요청(TCP 포트 80 혹은 8080) 패킷만 자신이 원하는 방향으로 변경되도록 하는 설정을 위해 사용됩니다.

이 옵션 다음에 반드시 ‘-p’ 옵션을 써야합니다.(이 옵션을 쓰면 관련 프로토콜을 위한 확장용 공유 라이브러리가 따라서 올라갑니다) 이 옵션 다음에 포트 번호나 서비스 이름(/etc/services 파일에 존재하는)을 인자로 넣을 수 있습니다.

변환 대상 패킷을 선정을 더 정교하게 하는 다른 방법들은 매뉴얼 페이지(man iptables)에 상세히 기술되어 있습니다.

6. 패킷을 변경하는 방법을 배워봅시다

이제까지 변경 대상 패킷의 선정법을 배웠죠. 지금부터는 그 패킷 대상을 어떻게 변경할지를 커널에 설정하는 법을 배워봅니다. 이것까지 배우면 규칙 설정법을 완전히 익히게 된겁니다.

6.1 발신지 NAT

발신지 NAT 즉 연결에서 발신지 주소를 다르게 변경하는 것은 POSTROUTING chain(즉, 패킷이 머신 밖으로 나가기 직전)에서 이루어집니다. 여기서 변경된다는 사실은 결국 리눅스 박스 그 자체(라우팅, 패킷 필터링을 하는 콤포넌트)는 패킷이 변경되기 전의 것만 본다는 것(매우 중요한 사실입니다)을 뜻합니다. 그리고 이것은 또한 `-o' (패킷을 밖으로 내보내는 인터페이스) 옵션을 사용할 수 있음을 뜻합니다.

`-j SNAT' 옵션을 통해 발신지 주소를 변환시킨다는 것을 지정하고 `--to-source'옵션을 통해 변경될 IP 주소, IP 주소의 범위 그리고 포트 번호나 포트 범위(선택사양임. UDP, TCP 프로토콜만 가능)를 지정합니다.

## 발신지 주소를 1.2.3.4 로 변경하기
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4

##발신지 주소를 1.2.3.4, 1.2.3.5 혹은 1.2.3.6 중 하나로 변경하기
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4-1.2.3.6

## 발신지 주소를 1.2.3.4이고 포트 범위가 1-1023인 상태로 변경하기
# iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to 1.2.3.4:1-1023

매스커레이딩

발신지 NAT의 특수한 케이스중 하나로 매스커레이딩이라는 것이 존재합니다. 이것은 표준 dialup과 같이 동적으로 IP 주소에 할당받는 경우만 사용가능합니다.(정적으로 IP 주소를 할당받는 경우 위의 SNAT를 사용하세요)

매스커레이딩 설정시에 변경될 발신지 주소를 명시적으로 적을 필요없습니다. 매스커레이딩은 자동으로 패킷이 밖으로 나갈때 밖으로 내보내는 인터페이스의 발신지 주소로 바꾸어 나가도록 합니다. 발신지 주소를 적을 필요가 없는 더 큰 이유는 링크가 다운되어 연결이 끊겼다가 새로운 IP 주소를 할당받아 연결이 재개되어도 장애가 크게 발생하지 않는다는 점입니다.

## ppp0로 나가는 모든 패킷을 마스커레이드하라.
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

6.2 수신지 NAT

이건 PREROUTING chain에서 즉 패킷이 들어온 직후에 이루어지죠. 그러므로 그 리눅스 박스 자체(라우팅, 패킷 필터링 콤포넌트)는 패킷이 실제(즉 변경 후의) 수신지를 보게되죠. 이 때문에 `-i' (패킷을 받아들이는 인터페이스)옵션을 사용할 수 있죠.

수신지 NAT는 `-j DNAT'을 사용하여 지정됩니다. IP주소(한 개), IP 주소 범위, 그리고 선택사양으로 들어갈 수 있는 포트 범위(TCP, UDP프로토콜만)는 `--to-destination' 옵션을 사용하여 지정됩니다.

## 수신지 주소를 5.6.7.8로 변경한다.
# iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 5.6.7.8

## 수신지 주소를 5.6.7.8., 5.6.7.9, 5.6.7.10으로 변경한다.
# iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 5.6.7.8-5.6.7.10

## 웹 트래픽의 수신지 주소를 5.6.7.8, 포트 8080으로 변경한다.
# iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 \
        -j DNAT --to 5.6.7.8:8080

방향 변경(redirection)

방향 변경은 수신지 NAT의 특수한 형태중 하나입니다. 그 설정을 사용하면 간편하게 안으로 들어온 패킷을 그것을 받아들인 인터페이스 주소로 DNAT시킵니다.

## 들어오는 포트-80 웹 트래픽을 suid(투명) 프록시로 보낸다
# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 \
        -j REDIRECT --to-port 3128

이 때 주의할 점은 squid를 투명 프록시로 설정해야한다는 것입니다!

6.3 고급 매핑 설정

대부분의 사용자가 신경쓰지 않는 난해한 NAT 설정이 존재합니다. 궁금하신 분들을 위해 여기에 적어놓았습니다.

일정 범위를 가진 다수의 주소로 선정한 경우

IP주소가 일정 범위를 가진 다수로 주어지면 변환용으로 사용될 IP주소는 주어진 범위내의 IP주소중 현재 연결 수가 가장 적은 IP로 선정됩니다. 이를 통해 초보적인 부하 분산 기능을 제공합니다.

널(Null) NAT 매핑 만들기

`-j ACCEPT' 을 target으로 잡으면 연결이 맺어질 때 변환없이 그대로 통과합니다.

표준적인 NAT 행동양식

가능하면 기본적으로 사용자가 정한 규칙 한도내에서 연결 패킷이 최소한만 전환되도록합니다. 이러한 행동양식에 따라 꼭 필요한 경우가 아니라면 포트를 변환시키지 않습니다.

암묵적으로 이루어지는 발신지 포트 매핑

NAT가 필요없이 연결이 맺어질 때에도 발신지 포트 변환이 암묵적으로 이루어질 수 있습니다. 이미 성립된 다른 연결의 매핑이 이번에 새로 만들어질 것과 중첩된 케이스가 바로 그런 경우입니다. 흔히 매스커레이딩이 사용될 때 발생합니다:

  1. 192.1.1.1 박스에서 포트 1024를 달고 www.netscape.com의 포트 80으로 웹 연결을 맺으려 합니다.
  2. 이 발신지 주소는 IP 주소(1.2.3.4)를 할당받아 사용하는 매스커레이딩 박스에 의해 그 IP주소로 머스커레이드됩니다.
  3. 그 후 매스커레이딩 박스 자체가 자신의 외부용 인터페이스 주소 1.2.3.4를 발신지로 하여 포트 1024를 달고 www.netscape.com 의 포트 80으로 웹 연결을 맺으려 합니다.
  4. NAT 코드는 두번째로 맺어지는 연결의 발신 포트를 1025로 전환합니다. 그렇기 때문에 두 연결은 충돌이 나지 않습니다.

이러한 암묵적인 발신 매핑이 발생할 때 포트는 세 부류로 나뉘어지게 됩니다:

  • 512 아래의 포트
  • 512와 1023 사이의 포트
  • 포트 1024 이상.

포트가 변환될 때 암묵적으로 다른 부류로는 매핑되지 않습니다.

NAT가 실패하면 어떻게 되나

사용자가 맺고자 하는 연결에 대해 고유 매핑을 만들 수 없는 경우 이 패킷을 파기합니다. 이 외에 패킷이 네트워크 연결의 일환이라고 볼수 없는 기형적인 상태의 경우 혹은 박스의 메모리가 고갈된 상태 및 기타 등등의 상황에서 그 패킷은 파기됩니다.

다중 매핑, 중첩 및 충돌

NAT규칙들을 정할 때 패킷들을 동일 범위로 매핑되도록 중첩해서 정하는 경우가 있습니다. NAT코드는 이러한 경우에도 충돌이 발생하지 않도록 잘 만들어져 있습니다. 그래서 두 개의 규칙이 존재하고 각각의 발신지 주소가 192.168.1.1과 192.168.1.2이고 이것이 둘다 1.2.3.4로 변환되도록 설정해도 문제없이 작동합니다.

게다가 실제 사용되는 다수의 IP주소들을(그 주소들이 박스를 통과해주기만 한다면) 매핑할 수 있습니다. 그래서 만약 실제 네트워크가 1.2.3.0/24 로 되어 있고 이 주소를 사용하는 내부 네트워크가 존재하며 그 내부 사설 인터넷 주소가 192.168.1.0/24라고 가정한다면 아무 충돌없이 간단히 발신지 주소 192.168.1.0/24 를 1.2.3.0 네트워크로 NAT할 수 있습니다:

# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 \
        -j SNAT --to 1.2.3.0/24

같은 원리가 NAT 박스 자체에도 사용됩니다. 바로 마스커레딩에 적용되는 논리입니다.(그 원리를 통해 마스커레이드되는 패킷과 박스 자체가 만들어낸 실제 패킷이 하나의 인터페이스 주소를 공유합니다)

동일한 종류의 패킷들을 변환 목표가 여러 개인 상태로 매핑하는 것 또한 가능합니다. 이들 변환 목표가 되는 주소들이 모두 함께 사용됩니다. 예를 들어 1.2.3.5로만 매핑하고 싶지 않다면 다음과 같이 설정할 수 있습니다:

# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 \
        -j SNAT --to 1.2.3.0-1.2.3.4 --to 1.2.3.6-1.2.3.254

머신 내부에서 발생시킨 연결의 수신지를 변환하기

OUTPUT chain에서도 DNAT 규칙을 넣을 수 있습니다. 그러나 2.4에서는 완벽히 지원되는 기능이 아닙니다.(제대로 되게 할 순 있습니다. 그러나 그렇게 하려면 새로운 설정 옵션들이 만들어져야 하고 많은 테스트와 상당 분량의 코딩이 필요합니다. 만약 누군가 Rusty에게 그것을 만들겠노라고 약속하지 않는 이상 쉽게 개발되진 않을 것입니다)

현재는 수신지를 다른 머신이 아닌 자체 머신의 주소로만 변환할 수 있습니다. 예를 들어 `j DNAT --to 127.0.0.1'라고 설정할 수 있습니다. 그렇지 않으면 그 응답 패킷이 올바르게 변환되지 않을 것입니다.

7. 특수한 프로토콜들

일부 프로토콜들은 NAT를 걸기 마땅치 않다. 올바른 동작을 위해 각 프로토콜에 대해 두가지 확장 프로그램이 개발되어야한다. 하나는 그 프로토콜의 연결을 추적하는 코드이고 나머지 하나는 그 프로토콜용 NAT코드가 필요하다.

넷필터 배포판에는 현재 FTP를 위한 모듈은 들어있다. 모듈 이름은 각각 ip_conntrack_ftp.o 와 ip_nat_ftp.o이다. 커널에 이들을 insmod로 삽입하거나 영구적으로 컴파일하여 포함시킬 경우 FTP에 대한 모든 종류의 NAT가 올바르게 작동된다. 그것이 없으면 passive FTP만 가능하다. 심지어 이조차 단순한 발신지 NAT만 되고 그 이상으로 복잡하게 동작시켜려 하면 오작동이 날 수 있다.

8. NAT사용시 주의 사항

어떤 연결에 대해 NAT를 걸고자 한다면 그 연결 패킷들 양방향(네트워크 외부로 나가는것과 내부로 들어오는 것) 모두 NAT가 걸리는 박스를 통과하도록 해야 한다. 그렇지 않으면 올바른 작동을 보장할 수 없다. 특히나 잘못된 경우 단편화된 IP 패킷들을 재조립하여 연결을 추적하는 코드가 추적을 제대로 못하게 될 뿐 아니라 단편화된 패킷들이 박스 내부에 잡혀있게 되어 사용자가 그 패킷들을 받지 못하게 된다.

9. 발신지 NAT와 라우팅

SNAT가 올바로 작동되게 하기 위해선 SNAT가 걸린 패킷이 경유하는 모든 컴퓨터 머신들은 해당 응답 패킷의 종착지가 그 NAT 박스임을 알고 있도록 설정해야 한다. 예를 들어, 머신 밖으로 나가는 패킷들이 1.2.3.4라는 발신지 주소를 달고 나가도록 매핑을 한 경우 외부의 라우터들은 그 응답 패킷(수신지 주소가 1.2.3.4로 잡혀있는)의 종착지가 이 박스임을 알도록 설정을 잡아줘야 한다. 이것들은 다음과 같은 방법으로 구현된다:

  1. 박스 자체에 할당된 주소(그 주소에 대해서는 라우팅을 비롯한 모든 것이 작동되도록 이미 설정되어 있다)를 가지고 SNAT를 하면 조치를 취할 것이 없다.
  2. NAT박스가 속한 지역 LAN주소중 사용되지 않고 있는 것을 가지고 SNAT를 할 경우가 있다. 예를 들어, 어떤 NAT 박스가 1.2.3.0/24라는 네트워크에 존재하는데1.2.3.99라는 사용되지 않는 IP(그 네트워크에 속하긴 하지만)를 달고 나가도록 매핑할 수 있다. 그러한 경우 그 매핑 주소에 대해서도 자기 자신에 할당된 IP주소와 마찬가지로ARP 요구에 대해 응답토록 해야 한다. 가장 간편한 방법은 아래와 같이 IP 앨리어스(alias)를 주는 것이다:
    # ip address add 1.2.3.99 dev eth0
    
  3. 자신의 네트워크와 완전히 다른 주소로 SNAT되게 하려면 이 SNAT된 패킷이 전송되며 경유하는 각 머신들이 해당 응답 패킷에 대해 다시 NAT 박스로 되돌아오게 할 수 있도록 경로 설정을 잡아주어야 한다. NAT 박스가 이미 그 경유 머신들의 기본 게이트웨이로 잡혀 있다면 달리 할 일은 없다. 그렇지 않은 경우 그 주소에 대한 라우트를 광고하거나(라우팅 프로토콜을 사용중이라면) 아니면 수동적으로 관련된 머신들에 해당 주소에 대한 라우트를 추가해주어야 한다.

10. 같은 네트워크안에서 수신지 NAT

동일 네트워크에서 발생한 패킷이 올바르게 포트 포워팅되어 다시 내부로 되돌아가게 해야할 경우 먼저 그 다음에 올 패킷들도(응답 패킷 포함) 계속 그 NAT 박스(그래야 그 패킷들의 주소가 전환된다)를 통과하도록 설정해야 한다. 현재 NAT 코드(2.4.0-test6과 그 이후 버전)는 NAT된 패킷이 자신을 받아들인 인터페이스를 향해 다시 나가도록 할 때 발생하는 ICMP redirect 에러 메시지를 차단한다. 그러나 이 패킷을 수신한 서버는 여전히 클라이언트에게 직접 응답하려고(클라이언트는 이것을 올바른 응답 패킷으로 인식하지 않는다) 할 것이다.

그 전형적인 케이스가 내부 직원들이 내부 웹서버의 공인 IP주소로 접속하려할 경우이다. DNAT에 의해 공인 주소(1.2.3.4)에서 내부 머신(192.168.1.1)으로 변환된다. 아래는 그 예이다:

# iptables -t nat -A PREROUTING -d 1.2.3.4 \
        -p tcp --dport 80 -j DNAT --to 192.168.1.1

해결 방안 중 하나는 내부 네트워크에는 공식 웹 사이트의 실제(내부) IP 주소를 알고 있는 내부용 DNS서버를 운영하고 그 외 지역의 DNS 요청은 외부용 DNS서버가 답하도록 하면 된다. 이렇게 되면 내부자들에게는 웹서버의 주소가 내부 IP주소가 보이게 된다.

또 다른 해결 방법이 있는데 NAT박스가 그러한 종류의 연결에 대해서는 발신지 IP 주소를 자기 자신의 내부 주소로 매핑하면 된다. 그리되면 서버가 그 박스를 발신지로 알고 박스에게 해당 응답 패킷을 날린다. 예를 들어 다음과 같은 설정을 할 수 있다(NAT박스의 내부 IP 주소가 192.168.1.250이라고 가정하자):

# iptables -t nat -A POSTROUTING -d 192.168.1.1 -s 192.168.1.0/24 \
        -p tcp --dport 80 -j SNAT --to 192.168.1.250

PREROUTING 규칙을 먼저 타기 때문에 패킷의 목적지는 이미 내부 웹서버 주소로 바뀐 상태이다: 패킷들이 그러한 변환 대상인지 여부는 그 발신지 IP주소를 보고 출처가 내부라는 사실 여부로 구분된다.

11. 감사의 글

먼저 WatchGuard와 David Bonn에게 감사드립니다. 이들은 작업중 넷필터에 대해 좋은 아이디어를 내어 많은 도움을 줬습니다.

그리고 제가 NAT에 있는 불미스러운 문제점을 발견하여 성질을 내어도 이것을 참고 넘어가준 모든 분들과 -특히- 제 다이어리를 읽어준 분들께도 감사의 말씀을 드립니다.

Rusty.

역자 후기 : 원번역자인 김상훈님에게 미리 변경사실을 말씀드리고 싶었지만 연락처가 없어서
어쩔 수없이 통보안하고 덮어 썼습니다. 완전히 덮어쓰게된 명분중 하나는 김상훈님은 v1.0 NAT HOWTO를 번역하셨지만
전 그 개정판인 v1.18을 번역했기 때문입니다. 최대한 어색하지 않으면서도 정확하게 번역하려 했습니다. 오탈자나
 그릇된 번역이 있으면 제게 연락 바랍니다.
---- CategorySoftware

'네트워크' 카테고리의 다른 글

리눅스 - 포트포워딩  (0) 2012.02.10
NAT  (3) 2012.02.10
마스커레이드란? (IP MASQUERADING)  (4) 2012.02.10
Posted by GUCCI
, |

NAT

네트워크 / 2012. 2. 10. 00:20

NAT의 필요성 

NAT은 다음과 같은 요구사항을 충족하기 위해서 탄생하였습니다. 

  • 공인 IP의 부족
    NAT하위에서는 사설 IP를 사용하고, 외부 Internet주소로 접속시 사설 IP를 공인 IP주소로 변환하도록 함으로써 공인 IP주소의 부족문제를 해결합니다. 

  • NAT하위의 네트웍을 외부로부터 보호
    직접적으로 외부로부터 NAT의 내부로 접근이 제한되며 내부 사설 IP대역의 트래픽이 외부 Internet으로 접속하려는 경우가 아니면 기본적으로 Routing되지 않으므로 외부로부터 보호됩니다. 

  • NAT의 종류 

    일반적으로 NAT은 주소변환을 하기 위하여 Packet의 다음사항을 조정합니다. 

  • IP header의 IP address부분
  • UDP header의 port부분
  • TCP header의 port부분 

    다음은 Internal위치에서 OutputBound시에 어떻게 External위치로 바뀌는가의 주소변환규칙에 의거한 분류에 의한 명칭입니다. 

  • Full Cone
    Internal위치에서 UDP packet을 목적지로 보낼때 NAT에서는 해당 Interal IP와 Port를 일시적으로 기억하고 NAT의 Port와 mapping하여 주며 해당 Port로 Data가 들어오면 출발지를 상관하지 않고 기억하였던 Internal위치로 forward해줍니다. 

  • Port Restricted Cone
    Internal위치에서 UDP packet을 목적지로 보낼때 NAT에서는 해당 Interal IP와 Port, 그리고 목적지 IP와 Port를 일시적으로 기억하고 NAT의 Port와 mapping하여 주며 해당 Port로 Data가 들어오면 출발지IP 및 Port와 기억하고 있는 목적지 IP 및 Port가 같을때 해당 Internal위치로 forward해줍니다. 

  • Restrict Cone
    Internal위치에서 UDP packet을 목적지로 보낼때 NAT에서는 해당 Interal IP와 Port, 그리고 목적지 IP를 일시적으로 기억하고 NAT의 Port와 mapping하여 주며 해당 Port로 Data가 들어오면 출발지IP와 기억하고 있는 목적지 IP가 같을때 해당 Internal위치로 forward해줍니다. 

  • Symmetric Cone
    Internal위치에서 UDP packet을 목적지로 보낼때 NAT에서는 해당 Interal IP와 Port, 그리고 목적지 IP와 Port를 일시적으로 기억하고 NAT의 Port와 mapping하여 주는데 목적지 Port가 바뀌면 역시 새로운 Port로 mapping합니다. 해당 Port로 Data가 들어오면 출발지IP 및 Port와 기억하고 있는 목적지 IP 및 Port가 같을때 해당 Internal위치로 forward해줍니다. 

    NAT의 구현방법에 따라서 다음과 같이 분류됩니다. NAT은 Exclude => Redirect => Reverse => Normal 의 순서로 적용되도록 구현하는것이 일반적이며 적용순서가 다른 경우 정상적으로 동작하지 않을수도 있습니다. 

  • Normal NAT
    사설 IP를 1개의 공인 IP로 바꾸는 형태로 동시에 Session을 약 50000~65535개정도까지만 처리할수 있는것이 보통이며 이것은 더이상 Port를 할당할수 없기 때문에 발생하는 제약사항입니다. 그러나 이 경우 공인IP를 2개이상을 묶어서 구현하게 되면 그 만큼 동시처리 Session 을 연장할수 있기도 합니다. 

  • Reverse NAT
    Normal NAT에서 설정된 공인 IP로부터 내부 사설망으로 접속요구를 받는 경우 여러개의 사설 IP중에서 어떤 IP로 변환해야 하는지 알수 없게 됩니다. 이 경우에 주소변환에 대한 설정이 따로 있어야 합니다. 이때 설정을 Reverse NAT로 1:1 Mapping 또는 Static mapping이라고 부르기도 합니다. 

  • Redirect NAT
    목적지 주소를 재지향(변환)하는것을 말합니다. 

  • Exclude NAT
    NAT과 Router사이에 서버가 있고 내부 사설IP사용자가 이 서버로 접속을 할수 있도로 하기 위해서 Normal NAT의 적용을 받지 않도록 하는 것을 말합니다. 

  • UDP Hole-punching 

    STUN개요.png


  • Client A와 B는 모두 일반적으로 30초(NAT공유기의 설정에 의존적)를 넘지 않는 간격으로 Server와 UDP송수신을 수행합니다. 이때 ClientA 와 B는 Server로 먼저 UDP packet을 전송하게 되며 이때 반드시 Server 는 수신된 UDP packet의 Source IP와 Source Port로 응답해주어야 합니다. 

  • (1) : Client A와 B에서 Server로 전송한 Packet은 NAT을 통과하면서 SourceIP는 ExternalIP로 변환되며 SourcePort는 임의의 ExternalPort로 일시적인 시간동은 Mapping되어 유지됩니다.
  • (2) : Server로 도착된 Packet은 SourceIP:SourcePort가 NAT의 ExternalIP와 임의로 Mapping된 Port로 하여 수신됩니다.
  • (3) : Server는 도착된 Packet의 SourceIP:SourcePort로 응답패킷을 전송합니다.
  • (4) : Server로부터 전송된 Packet은 NAT에 도달하면 해당 Port mapping이 유효할때 해당 PrivateIP와 Port로 변환하여 Client로 전달합니다. 이로써 해당 주소와 포트를 통해서 상호간 양방향 통신이 가능해집니다.
  • (5) : 이제 Server로부터의 응답패킷에 각각의 Client는 상대방 Client의 ExternalIP와 ExternalPort를 수신하여 해당 주소로 Packet을 전송합니다.
  • (6) : 적어도 한쪽Client의 Packet이 전송에 성공하게 되며(단, 양단이 Symmetric Cone인 경우는 실패할수 있음) 이후 상대방 Client로부터 도착한 Packet의 SourceIP:SourcePort로 전송할수 있게 됩니다.
  • (7) : 만약 Client A와 Client B가 같은 NAT에 있다면 서로 같은 NAT에서 ExternalIP로 전송하는것은 전달되지 않을수 있으며 이 경우 서로 Broadcast등을 통해서 확인해야 합니다. 

  • 통상적으로 이 방식은 양단이 둘다 Symmetric Cone이 아닌 경우에 한해서 성공확률이 매우 높다는데 커다란 장점이 있다. 그러나 UDP protocol을 사용하므로 양단간에 신뢰성을 보장할수 있는 방안이 보완되어야 하며 전송효율을 위해서 재전송을 효율적으로 관리하도록 설계해야 한다는 점에서 단점이라면 단점이라고 할수 있다. 

  • [edit]

    TCP Hole-punching 

    TCPHolePunchingSequence.png

  • TCP의 기초지식 사항 - 3 way handshake (일반적인 Connection에 대한 절차)
    • A에서 B로 연결하는 경우 A는 SYN flag가 ON이고 Seq값을 임의로 설정한 패킷을 B로 전송합니다.
      • A는 SYN_SENT 상태
      • B는 SYN_RECEIVED 상태
    • B는 ACK flag와 SYN flag가 ON이고 AckSeq?는 A로 부터 받은 Seq에 1을 더한값으로 설정하고 Seq값을 임의로 설정한 패킷을 A로 전송합니다.
      • A와 B는 HALF_OPEN 상태
      • 이 경우 B에서는 HALF_OPEN상태는 Backlog Queue에서 관리됩니다.
    • A는 ACK flag만 ON이고 AckSeq?는 B로부터 받은 Seq에 1을 더한값을 설정하고 B로 전송하여 연결성립을 완성합니다.
      • A와 B는 ESTABLISHED 상태 

  • TCP Hole-punching의 기본 원리는 SYN-ACK의 패킷을 받아들이도록 한다는데 있다.
  • 통상적으로 이 방식이 성공하기는 매우 어렵다. 하지만 제대로 성공한다면 트래픽이 100% Client양단간에서 처리하게 되고 TCP를 기반으로 하기 때문에 신뢰성도 어느정도 혜택을 얻을수 있으며 트래픽이 Server로 집중되는 것을 막을수 있다. 
  • '네트워크' 카테고리의 다른 글

    리눅스 - 포트포워딩  (0) 2012.02.10
    NAT - KLDP  (4) 2012.02.10
    마스커레이드란? (IP MASQUERADING)  (4) 2012.02.10
    Posted by GUCCI
    , |

    2.1 IP 마스커레이드란 무엇인가?

    IP 마스커레이드는 리눅스의 네트워킹 기능으로, 상용 방화벽(firewall)이나 네트웍 라우터(network router)에서 흔히 볼 수 있는 1 대 다(one-to-many) 방식의 NAT(Network Address Translation: 네트웍 주소 해석)와 유사하다. 예을 들어서, 어떤 리눅스 호스트가 PPP(역자주: 윈도우즈의 전화접속 네트워킹에 해당함), 이더넷(Ethernet), 기타등등의 방법으로 인터넷에 연결되어 있다면, 이 리눅스 박스에 연결된(PPP, Ethernet, 기타등등) 내부의 컴퓨터들도 IP 마스커레이드를 통해서 인터넷에 연결할 수 있다. 리눅스 IP 마스커레이드를 통하면, 내부의 컴퓨터들이 공식적으로 할당된 IP 주소가 없더라도 가능하다.

    MASQ를 사용하면, MASQ 게이트웨이(gateway: 통로가 되는 컴퓨터)를 통해서 몇대의 컴퓨터들이 숨어서 인터넷을 사용할 수 있다. 즉, 인터넷에 있는 다른 컴퓨터들에게는, IP MASQ를 통해서 바깥으로 나오는 정보들은 IP MASQ Linux 서버 자체가 보내는 것처럼 보인다. 이러한 기능에 덧붙여서, IP 마스커레이드는 대단히 안전한 네트웍 환경을 제공한다. 잘 구성된 마스커레이딩 시스템과 내부 LAN의 보안을 깨는 것은, 잘 구성된 방화벽의 보안을 깨는 것 만큼이나 어렵다.

    2.2 현재 상황

    IP 마스커레이드는 처음 개발된지 수년이 지났고, 리눅스 커널이 2.2.x 로 들어서면서 매우 성숙해졌다. 리눅스 커널은 1.3.x 버젼부터 MASQ 기능을 자체 지원했다. 현재는 수많은 개인, 또는 상업 기관들이 훌륭하게 사용하고 있다.

    웹 페이지 보기, TELNET 접속, FTP, PING, TRACEROUTE, 기타등등의 통상적인 네트웍 기능은 IP 마스커레이드를 통해서 잘 작동한다. FTP, IRC와 Real Audio와 같은 것도, 적절한 IP MASQ 모듈을 적재하면 잘 작동한다. MP3나 트루 스피치(True Speech)등의 스트리밍 오디오(streaming audio)와 같은 네트웍 관련 프로그램들도 역시 작동한다. 메일링 리스트의 어떤 동료 사용자들은 화상회의 소프트웨어에서까지 좋은 결과를 얻은 바 있다.

    지원되는 전체 소프트 웨어 목록은 Supported Client Software section에서 확인하기 바란다.

    IP 마스커레이드는 여러가지 다른 OS와 하드웨어 플랫폼을 사용하는 사용자 컴퓨터들(client machines)에게도 서버로서 잘 동작한다. MASQ 내부에서 성공적으로 동작한 시스템들은 다음과 같다 :

    • Unix: Sun Solaris, *BSD, Linux, Digital UNIX, 기타등등
    • Microsoft Windows 95/98, Windows NT와 Windows for Workgroups (TCP/IP 패키지가 설치된 상태)
    • IBM OS/2
    • MacTCP or Open Transport를 사용하는 Apple Macintosh MacOS machine들
    • packet 드라이버와 NCSA Telnet 패키지를 사용하는 DOS 기반 시스템
    • VAXen
    • 리눅스나 NT를 사용하는 Compaq/Digital Alpha 시스템
    • AmiTCP 나 AS225-stack을 사용하는 Amiga 컴퓨터까지..

    리스트는 더 계속될 수 있지만 요점은 다음과 같다. TCP/IP로 통신할 수 있는 OS를 사용한다면 반드시 IP 마스커레이드와 함께 동작할 수 있어야 한다!

    2.3 누가 IP 마스커레이드를 사용해서 이득을 얻는가?

    • 당신이 인터넷에 연결된 리눅스 호스트를 가지고 있고,
    • TCP/IP가 설치되어 있고 로컬 서브넷(local subnet)을 통해서 리눅스 호스트에 연결된 컴퓨터 몇대를 가지고 있거나,
    • 당신의 리눅스 호스트가 두개 이상의 모뎀을 가지고 PPP나 SLIP서버로 동작하면 내부의 다른 컴퓨터들과 연결되어 있고,
    • 그 다른 컴퓨터들이 공식적인 IP 주소를 할당받지 않았다면,
    • 그리고 물론, ISP로부터 공식적인 IP 주소를 할당받고 리눅스를 라우터(router)로 설정하거나 외부 라우터를 구입하는등의 추가비용을 들이지 않고 그 다른 컴퓨터들이 인터넷을 사용하도록 하고 싶다면.

    2.4 누구에게 IP 마스커레이드가 필요 없는가?

    • 당신의 컴퓨터가 단독으로 설치되어 있고 인터넷에 연결되어 있거나 (그러나 단독으로 존재하더라도 방화벽을 설정하는 것은 좋은 생각일 수 있다),
    • 다른 컴퓨터들을 위해서 할당된 여러개의 IP 주소를 가지고 있다면,
    • 그리고 물론, 당신이 리눅스을 사용하는 '무임 승차'라는 것을 좋아하지 않고, 오히려 같은 일을 하기 위해 비싼 대가를 지불하는 것을 더 편하게 생각한다면.

    2.5 IP 마스커레이드는 어떻게 동작하는가?

    >Ken Eves의 IP 마스커레이드 FAQ로부터 :

      가장 간단한 설치의 예는 다음 그림과 같다:
    
       SLIP/PPP         +------------+                         +-------------+
       ISP 제공자로     |  Linux     |         SLIP/PPP        | 다른 컴퓨터 |
      <---------- modem1|    #1      |modem2 ----------- modem3|             |
        111.222.333.444 |            |           192.168.0.100 |             |
                        +------------+                         +-------------+
    
        위의 그림에서, IP_MASQUERADING이 설치된 리눅스 box가 Linux #1으로 설정되어
      있고 modem1을 통한 SLIP 혹은 PPP로 인터넷에 연결되어 있다. Linux #1은  
      111.222.333.444라는 IP 주소가 할당되어 있다. Linux #1은 modom2를 통해서 다른 
      컴퓨터가 SLIP 혹은 PPP로 접속할 수 있도록 되어 있다.
    
        두번째 시스템(다른 컴퓨터: 반드시 리눅스를 사용할 필요는 없다) Linux #1으로
      SLIP 혹은 PPP 접속을 한다. 다른 컴퓨터는 공식적으로 할당된 IP 주소를 가지고
      있지 않다. 그래서 내부 주소인 192.168.0.100이라는 주소가 할당되어 있다.
      (아래 참조)
    
        라우팅 정보가 제대로 설정되어 있으면 IP 마스커레이드를 통해서 "다른 컴퓨터"는
      마치 인터넷에 직접 연결되어 있는 것처럼(몇가지를 제외하고) 인터넷을 사용
      할 수 있다.
    
    Pauline Middelink에 의하면:
    
      "다른 컴퓨터"는 Linux #1을 게이트웨이(gateway)로 설정해야 한다는 사실을 잊지
      말아야 한다(기본 라우터(default route)인가 단지 서브넷(subnet)인가는 상관없다.)
      만약 "다른 컴퓨터"가 Linux #1을 게이트웨이로 설정하지 않는다면, Linux #1은 
      proxy arp를 지원하도록 설정되어야 하는데, proxy arp에 관한 것은 이 문서의
      범주를 벗어나는 내용이다.
    
    다음은 comp.os.linux.networking에 포스팅된 글에서 발췌한 것으로 위의 예에서의
    이름에 맞도록 수정된 것이다:
    
       o 나는 "다른 컴퓨터"가 PPP혹은 SLIP으로 연결된 나의 Linux #1을 gateway로 인식
         하도록 하였다.
       o "다른 컴퓨터"로부터 Linux #1으로 패킷이 전달될 때, Linux #1은 그 패킷에
         새로운 발신포트번호(source port number)를 할당하고 원래의 주소는 따로 
         저장해 둔다. MASQ서버는 수정된 패킷을 SLIP/PPP를 통해서 인터넷으로 
         전송한다.
       o 인터넷으로부터 Linux #1으로 패킷이 되돌아올 때, Linux #1은 포트번호(port
         number)를 검사해서 "다른 컴퓨터"로부터 요청되었던 것인지 확인한다. 맞다면,
         MASQ 서버는 저장해뒀던 원래의 포트번호와 IP 주소를 인터넷으로부터 온
         패킷에 다시 할당하고 "다른 컴퓨터"로 보내준다.
       o 인터넷에서 패킷을 보낸 호스트는 이런 일이 일어나는 것을 전혀 알 수 없다.
    

    IP Masquerading의 또다른 예:

    아래 그림에 전형적인 예가 있다:

        +----------+
        |          |  Ethernet
        | A-box    |::::::
        |          |.2   : 192.168.0.x
        +----------+     :
                         :      +----------+   
        +----------+     :   .1 |  Linux   |   PPP 접속
        |          |     :::::::| Masq-Gate|:::::::::::::::::::// Internet
        | B-box    |::::::      |          |  111.222.333.444
        |          |.3   :      +----------+
        +----------+     :
                         :
        +----------+     :
        |          |     :
        | C-box    |::::::
        |          |.4
        +----------+
    
        |                       |          |
        | <----내부 네트웍----> |          | <------외부 네트웍------>
        |                       |          |
    

    이 예에서는 모두 네개의 컴퓨터가 있다. 이 경우에도 마찬가지로 오른쪽 끝에는 PPP접속을 할 수 있는 서버가 있고, 더 오른족에는 정보를 교환하고자 하는 인터넷상의 호스트들이 있다고 가정한다. 리눅스 시스템인 Masq-Gate가 내부 네트웍의 A-boxB-boxC-box를 외부의 인터넷으로 연결하도록 해주는 IP Masquerading 게이트웨이이다. 내부 네트웍은 RFC-1918에 정해진 몇가지 내부 네트웍 주소중 한가지를 사용는데, 이 경우에는 C 클래스 네트웍인 192.168.0.0이다. 리눅스 박스가 192.168.0.1의 IP 주소를 사용하며, 다른 시스템들은 다음과 같은 주소를 갖는다:

    • A-Box: 192.168.0.2
    • B-Box: 192.168.0.3
    • C-Box: 192.168.0.4

    세 개의 컴퓨터, A-boxB-box and C-box는 TCP/IP를 사용할 수 있다면 어떤 OS를 사용하고 있더라도 상관 없다. 윈도우즈 95매킨토시 MacTCP 또는 OpenTransport나 다른 리눅스 박스라도 IP MASQ를 통해서 인터넷에 연결될 수 있다. 연결되는 동안, 마스커레이딩을 하는 시스템, 혹은 MASQ-gate는 내부로부터의 연결을 모두 MASQ-gate 자체에서 보내는 것처럼 전환하게 된다. MASQ는 외부로부터 신호(또는 정보)가 오면, 내부에 있는 원래의 컴퓨터로 가도록 재정렬한다. 그래서 내부 네트웍에게는 마치 인터넷에 직접 연결되어 있는 것처럼 보여지고, 마스커레이딩을 사용하고 있는지 아닌지를 구별할 수 없게 된다. 이것을 "투명한" 연결이라 한다.

    NOTE: 다음 사항에 대한 자세한 것은 FAQ 를 참조하기 바람:

    • NAT, MASQ, proxy 서버간의 차이점.
    • 패킷 방화벽이 동작하는 방법.

    2.6 리눅스 2.0.x 버젼에서 IP Masqeurade를 사용하기 위한 요구사항들

    ** 가장 최근의 정보는 IP Masquerade Resource를 참조하기 바란다. **

    • 가능한 하드웨어사양. 자세한 사항은 FAQ-Hardware 참조.

    • 커널 2.0.x 소스는 http://www.kernel.org/에서 구할 수 있다.
      (레드햇 5.2와 같은 최근의 리눅스 MASQ-supported-Distributions 에서는 IP 마스커레이드 모두 모듈로 지원되도록 컴파일되어 있는 커널을 제공한다. 그런 경우에는 커널을 새로 컴파일할 필요가 없다. 만약 현재 사용하는 커널을 업그레이드 하려 한다면, 관련된 다른 프로그램들도 업그레이드해야 한다.(추후에 언급됨)

    • 적재가능한 커널 모듈들, 2.1.85이상 권장. http://www.pi.se/blox/modules/에서 구할 수 있다.
      (modules-1.3.57가 최저 요구사항이다)

    • TCP/IP 네트웍이나 LAN 구성은 Linux NET-3 HOWTO와 Network Administrator's Guide에서 다루고 있다.
      TrinityOS도 확인해 보기 바란다. TrinityOS는 리눅스상에서의 네트워킹에 대한 아주 좋은 안내서이며, IP MASQ, security, DNS, DHCP, Sendmail, PPP, Diald, NFS, IPSEC기반의 VPNs, 그리고 각각의 성능에 관한 것들을 다루고 있다. 약 50개 가량의 섹션들이 있다!!

    • 리눅스 호스트를 인터넷에 연결하는 것에 관한 내용은 Linux ISP Hookup HOWTOLinux PPP HOWTO,TrinityOSLinux DHCP mini-HOWTOLinux Cable Modem mini-HOWTO에서 확인할 수 있다.

    • Ipfwadm 2.3 혹은 그 이상의 버젼은 ftp://ftp.xos.nl/pub/linux/ipfwadm/ipfwadm-2.3.tar.gz에서 구할 수 있다.
      각 프로그램의 버젼 요구사항에 대한 추가정보는 Linux IPFWADM page에서 확인할 수 있다.

    • 새로운 커널의 설정, 컴파일, 설치하는 것은 Linux Kernel HOWTO에서 확인할 수 있다.

    • 다음에 언급된 여러가지 패치를 사용해서 IP 마스커레이드에 다른 기능들을 추가할 수도 있다:

      • TCP/IP port-forwarders 또는 re-directors: 이 툴들을 사용해서, 대개는 MASQ와 같이 동작하지 않는 프로그램들을 작동하도록 할 수 있다. 이 외에도, 외부의 인터넷 사용자들이 내부의 WWW, TELNET, SMTP, FTP(패치 필요) 등등의 서버에 연결하도록 MASQ서버를 설정할 수도 있다. 더 자세한 사항은 이 HOWTO의 Forwarders 섹션을 참조하기 바란다. 2.0.x 커널을 위한 IP Masquerading 패치 리스트:

        PORTFWed FTP:

        • 외부로부터의 FTP접속을 내부의 FTP 서버로 연결하고 싶다면 Fred Viles's FTP server patch를 내려받아 사용하라. 이에 관한 자세한 사항은 이 HOWTO의 Forwarders 섹션에서 확인할 수 있다.

        X-Windows에서의 display 연결(forwarders):

        MASQ를 통한 ICQ를 사용하기 위한 모듈

        PPTP (GRE)와 SWAN (IPSEC) VPNs의 터널링 연결(tunneling forwarders):

        게임 관련 패치들:

        • Glenn Lamb의 LooseUDP for 2.0.36+ 패치.

          WWW 브라우저에 따라서, .gz 확장자의 화일을 자동으로 열수도 있다. 다운로드만 하기 위해서는 SHIFT키를 누른상태에서 위의 URL을 클릭하라.

          더 자세한 사항을 알려면 Dan Kegel의 NAT Page을 확인하기 바란다. Game-Clients 섹션과FAQ 섹션에서 다른 정보도 확인할 수 있다.

      위의 패치들에 대한 더 많은 정보와 그외의 다른 정보들을 IP Masquerade Resource 에서 확인할 수 있다.

    2.7 리눅스 2.2.x 버젼에서 IP Masqeurade를 사용하기 위한 요구사항들

    ** 가장 최근의 정보는 IP Masquerade Resource 를 참고하기 바란다. **

    위의 패치들에 대한 더 많은 정보와 그외의 다른 정보들을 IP Masquerade Resource 에서 확인할 수 있다.

    3. IP 마스커레이드 설정

    만약 당신의 네트웍에 중요한 정보가 있다면, IP 마스커레이드를 구현하기 이전에 "보안"이라는 것을 생각해 보길 바란다. 기본적으로, IP MASQ는 당신이 인터넷에 연결할 수 있도록 하는 통로이지만, 인터넷상의 누군가가 당신의 내부 네트웍으로 들어오는 통로가 될 수도 있다.

    일단 IP MASQ가 동작하게 되면, IPFWADM/IPCHAINS 방화벽에 매우 강력한 정책(ruleset)을 사용할 것을 강력히 권고한다. 더 자세한 정보는 Strong-IPFWADM-Rulesets 과 Strong-IPCHAINS-Rulesets 섹션을 참조하기 바란다.

    3.1 커널에서 IP 마스커레이드를 지원하도록 컴파일 하기

    만약 당신의 리눅스 배포본이 다음항목들을 지원하도록 컴파일 되어져 있고 마스커레이드에 관계된 모듈들이 컴파일되어서 제공되고 있다면 커널 컴파일을 할 필요가 없다(대부분의 배포본에 포함되어 있을 것이다.):
    • IPFWADM/IPCHAINS
    • IP forwarding
    • IP masquerading
    • IP Firewalling
    • 기타 등등
    당신의 배포본이 마스커레이드를 지원하는지 확실하지 않다면, MASQ-supported-Distributions 섹션이나 IP Masquerade Resource 에서 자세한 사항을 확인할 수 있다. 당신의 패포본이 IP 마스커레이딩을 지원하는지 알 수가 없다면, 지원하지 않는다고 생각하고 다음 단계로 넘어가라.

    지원하도록 되어 있든지 아니든지 상관없이, 이 섹션에는 다른 유용한 정보들이 많이 있으므로 읽어두기를 권장한다.

    리눅스 2.0.x 커널

    필요한 소프트웨어와 패치 등은 2.0.x-Requirements 섹션을 참조하기 바란다.

    • 우선, 커널 소스가 필요하다.(가장 최근 버젼인 2.0.36이나 그 이상 버젼)

    • 만약 커널 컴파일이 처음이라도 겁먹지 말기 바란다. 실제로 해 보면, 그다지 어렵지 않고 2.0.x-Requirements 섹션에 나오는 몇몇 URL에서 컴파일 방법에 대해 설명하고 있다.

    • tar xvzf linux-2.0.x.tar.gz -C /usr/src 라고 명령하여 커널을 /usr/src/ 에 푼다.(2.0.x는 커널 버젼) 압축을 푼 다음에, /usr/src/linux/ 라는 디렉토리나 심볼릭 링크가 있는지 확인한다.

    • 패치를 가할 것이 있으면 압축을 푼 커널 소스에 패치를 가한다. 2.0.36 이상 버젼에서는, IP 마스커레이딩을 하기 위해 특별한 패치가 필요하지는 않다. IPPORTFW, PPTP, Xwindows forwarders 와 같은 기능들은 꼭 필요하지는 않은 선택사항들이다. URL들은 2.0.x-Requirements 섹션을 참조하고, 최신 정보와 그외의 패치에 관련된 URL들은 IP Masquerade Resources 을 참조하길 바란다.

    • 아래에 커널에 포함되어야 하는 최소한의 옵션들의 목록이 있다. 현재 설치되어 있는 네트웍 인터페이스(LAN 카드, 모뎀 등등)를 사용할 수 있도록 설정하는 것도 잊지 말아야 한다. 커널을 컴파일하는 더 자세한 방법에 대해서는 Linux Kernel HOWTO 와 커널 소스 디렉토리 내의 README 화일을 참조하기 바란다.

      다음의 옵션들에서 YES인가 또는 NO인가를 확인하기 바란다. 이 HOWTO에서 나중에 설명하는 적절한 패치를 가하지 않는다면 아래의 옵션들이 모두 보이지 않을 수도 있다:

      * Prompt for development and/or incomplete code/drivers (CONFIG_EXPERIMENTAL) [Y/n/?]
        - YES: 이렇게 해야 나중에 IP 마스커레이드 기능을 선택할 수 있다.
    
      * Enable loadable module support (CONFIG_MODULES) [Y/n/?]
        - YES: IP 마스커레이드 모듈들을 적재할 수 있도록 한다.
    
      * Networking support (CONFIG_NET) [Y/n/?]
        - YES: 네트웍을 사용 가능하게 한다.
    
      * Network firewalls (CONFIG_FIREWALL) [Y/n/?]
        - YES: IPFWADM 방화벽을 사용 가능하게 한다.
    
      * TCP/IP networking (CONFIG_INET)
        - YES: TCP/IP 프로토콜을 사용 가능하게 한다.
    
      * IP: forwarding/gatewaying (CONFIG_IP_FORWARD)
        - YES: 리눅스 네트웍 패킷 포워딩과 라우팅을 가능하게 한다. 
               - IPFWADM 에 의해서 제어된다.
    
      * IP: syn cookies (CONFIG_SYN_COOKIES) [Y/n/?]
        - YES: 기본적인 네트웍 보안을 위해서 강력히 권장한다.
    
      * IP: firewalling (CONFIG_IP_FIREWALL) [Y/n/?]
        - YES: 방화벽 기능을 사용 가능하게 한다.
    
      * IP: firewall packet logging (CONFIG_IP_FIREWALL_VERBOSE) [Y/n/?]
        - YES: (꼭 필요하지는 않지만 강력히 권장):  방화벽의 접근 기록을 남길 수 
               있도록 한다.
    
      * IP: masquerading (CONFIG_IP_MASQUERADE [Y/n/?]
        - YES: IP 마스커레이딩 기능을 사용하여 내부 네트웍의 특정 주소로부터의 
               패킷을 주소를 변경하여 외부의 TCP/IP네트웍으로 내보내게 한다.
    
      * IP: ipautofw masquerade support (EXPERIMENTAL) (CONFIG_IP_MASQUERADE_IPAUTOFW) [Y/n/?]
        - NO:  IPautofw 은 TCP/IP 포토를 포워딩하는 구시대적인 방법이다. 물론 
               작동하기는 하지만, IPPORTFW 가 더 나은 방법이다. 그러므로 IPAUTOFW은 
               추천하지 않는다.
    
      * IP: ipportfw masq support (EXPERIMENTAL) (CONFIG_IP_MASQUERADE_IPPORTFW) [Y/n/?]
        - YES: 이 옵션을 2.0.x 커널에서 사용하기 위해서는 패치를 해야 한다. 
    
               이 옵션을 설정하면, 인터넷에 있는 외부 컴퓨터가 마스커레이드된 
               내부의 특정 컴퓨터로 직접 연결할 수 있게 된다. 이 기능은 통상적으로
               내부의 SMTP, TELNET, WWW 서버에 접근하는 데 사용된다. FTP 포트 
               포워딩을 하기 위해서는 FAQ섹션에 언급되어 있는 추가적인 패치를 적용
               해야 한다. 포트 포워딩에 대한 추가적인 정보는 이 HOWTO의 
               Forwards 섹션을 참조하기 바란다.
    
      * IP: ICMP masquerading (CONFIG_IP_MASQUERADE_ICMP) [Y/n/?]
        - YES: ICMP 패킷을 마스커레이딩할 수 있도록 한다. 꼭 필요하지 않을 수도
               있으나, ICMP 지원 없이는 많은 프로그램들이 제대로 동작하지 않을 
               수 있다.
    
      * IP: loose UDP port managing (EXPERIMENTAL) (CONFIG_IP_MASQ_LOOSE_UDP) [Y/n/?]
        - YES: 이 옵션을 2.0.x 커널에서 사용하기 위해서는 패치를 해야 한다. 
    
               이 옵션을 통해서, 내부의 컴퓨터들에서 NAT와 같은 식으로 작동하는
               네트웍 게임들을 인터넷을 통해 즐길 수 있다. 더 자세한 사항은 
               이 HOWTO의 FAQ섹션에서 확인할 수 있다.
    
      * IP: always defragment (CONFIG_IP_ALWAYS_DEFRAG) [Y/n/?]
        - YES: 이 기능은 IP 마스커레이딩 접속을 최적화 준다. - 강력히 추천
    
      * IP: optimize as router not host (CONFIG_IP_ROUTER) [Y/n/?]
        - YES: 이 기능은 커널의 네트웍 기능을 최적화 준다.
    
      * IP: Drop source routed frames (CONFIG_IP_NOSR) [Y/n/?]
        - YES: 기본적인 네트웍 보안을 위해서 강력히 추천한다.
    
      * Dummy net driver support (CONFIG_DUMMY) [M/n/y/?]
        - YES: 꼭 필요하지는 않지만, 이 옵션은 문제가 발생해서 디버깅을 할 때
               도움을 줄 것이다.
    
      * /proc filesystem support (CONFIG_PROC_FS) [Y/n/?]
        - YES: 리눅스 네트웍 포워딩을 사용하기 위해서 필요하다.
    

    NOTE: 이 옵션들은 단지 IP 마스커레딩이 동작하기 위한 요소들이다. 특정한 네트웍과 특정 하드웨어를 설정하기 위해서는 필요한 다른 옵션들을 더 선택해야 한다.

    • 커널 자체를 컴파일하고 나서는, 다음과 같은 명령으로 커널의 IP 마스커레딩 관련 모듈들을 컴파일하고 설치해야 한다:
      make modules; make modules_install
      
    • 다음에는, /etc/rc.d/rc.local 화일에 다음과 같이 몇줄을 추가해서 IP 마스커레이드를 사용하기 위한 스크립트를 load하도록 해야 한다. 이렇게 하면 리부팅을 할 때마다 자동적으로 IP 마스커레이딩 기능을 사용할 수 있다:
              .
              .
              .
              #rc.firewall script - Start IPMASQ and the firewall
              /etc/rc.d/rc.firewall
              .
              .
              .
      

    리눅스 2.2.x 커널

    필요한 소프트웨어와 패치 등은 2.2.x-Requirements 섹션을 참조하기 바란다.

    • 우선, 2.2.x 버젼의 커널 소스가 필요하다. (최근 버젼인 2.2.11이나 그 이상의 버젼)

      NOTE #1: 리눅스 2.2.x 버젼중에서 2.2.11 이하의 버젼은 IPCHAINS fragmentation bug를 가지고 있다. 이런 이유로, 강력한 IPCHAINS ruleset들을 지정하면 공격에 노출되게 된다. 커널을 업그레이드하여 문제를 해결하기 바란다.

    • 만약 커널 컴파일이 처음이라도 겁먹지 말기 바란다. 실제로 해 보면, 그다지 어렵지 않고 2.2.x-Requirements 섹션에 나오는 몇몇 URL에서 컴파일 방법에 대해 설명하고 있다.

    • tar xvzf linux-2.2.x.tar.gz -C /usr/src 라고 명령하여 커널을 /usr/src/ 에 푼다.(2.2.x는 커널 버젼) 압축을 푼 다음에, /usr/src/linux/ 라는 디렉토리나 심볼릭 링크가 있는지 확인한다.

    • 패치를 가할 것이 있으면 압축을 푼 커널 소스에 패치를 가한다. 2.2.1 이상 버젼에서는, IP 마스커레이딩을 하기 위해 특별한 패치가 필요하지는 않다. PPTP, Xwindows forwarders 와 같은 기능들은 꼭 필요하지는 않은 선택사항이다. URL들은 2.2.x-Requirements 섹션을 참조하고, 최신 정보와 그외의 패치에 관련된 URL들은IP Masquerade Resources 을 참조하길 바란다.

    • 아래에 커널에 포함되어야 하는 최소한의 옵션들의 목록이 있다. 현재 설치되어 있는 네트웍 인터페이스(LAN 카드, 모뎀 등등)를 사용할 수 있도록 설정하는 것도 잊지 말아야 한다. 커널을 컴파일하는 더 자세한 방법에 대해서는 Linux Kernel HOWTO 와 커널 소스 디렉토리 내의 README 화일을 참조하기 바란다.

      다음의 옵션들에서 YES인가 또는 NO인가를 확인하기 바란다. 이 HOWTO에서 나중에 설명하는 적절한 패치를 가하지 않는다면 아래의 옵션들이 모두 보이지 않을 수도 있다:

      * Prompt for development and/or incomplete code/drivers (CONFIG_EXPERIMENTAL) [Y/n/?]
        - YES: IP 마스커레이드를 위해 꼭 필요한 것은 아니지만, 이 옵션을 선택하면
               마스커레이드 모듈을 생성하고 포트 포워딩(port forwarding)을 할 수가
               있다.
    
      * Enable loadable module support (CONFIG_MODULES) [Y/n/?]
        - YES: IP 마스커레이드 모듈들을 적재할 수 있도록 한다.
    
      * Networking support (CONFIG_NET) [Y/n/?]
        - YES: 네트웍을 사용 가능하게 한다.
    
      * Packet socket (CONFIG_PACKET) [Y/m/n/?]
        - YES: 꼭 필요하지는 않지만, 이 기능은 TCPDUMP를 사용해서 IP 마스커레이딩과
               관련한 문제들을 디버깅할 수 있으므로 선택할 것을 권장한다.
    
      * Kernel/User netlink socket (CONFIG_NETLINK) [Y/n/?]
        - YES: 꼭 필요하지는 않지만, 이 기능은 방화벽의 접근 기록을 남길 수 있도록
               한다.
    
      * Routing messages (CONFIG_RTNETLINK) [Y/n/?]
        - NO:  이 옵션은 패킷 방화벽이 기록을 남기는 것과 아무 상관이 없다.
    
      * Network firewalls (CONFIG_FIREWALL) [Y/n/?]
        - YES: IPCHAINS 방화벽 도구를 사용할 수 있게 한다.
    
      * TCP/IP networking (CONFIG_INET) [Y/n/?]
        - YES: TCP/IP 프로토콜을 사용할 수 있게 한다. 
    
      * IP: advanced router (CONFIG_IP_ADVANCED_ROUTER) [Y/n/?]
        - NO:  CONFIG_IP_ROUTE_VERBOSE 를 설정하기 위해서 필요하고 깔끔한 라우팅을
               위해서 필요하다. (ipchains/마스커레이드 와는 관계없다.)
    
      * IP: verbose route monitoring (CONFIG_IP_ROUTE_VERBOSE) [Y/n/?]
        - YES: 이 기능은 IP 스푸핑(속임) 패킷을 제거하고 그 기록을 남기는 코드를 
               사용한다면 매우 유용할 것이다.
    
      * IP: firewalling (CONFIG_IP_FIREWALL) [Y/n/?]
        - YES: 방화벽 기능을 사용할 수 있게 한다.
    
      * IP: firewall packet netlink device (CONFIG_IP_FIREWALL_NETLINK) [Y/n/?]
        - YES: 꼭 필요하지는 않지만, 이 기능은 방화벽의 접근 기록을 남기는 기능을
               향상시켜 줄 것이다.
    
      * IP: always defragment (required for masquerading) (CONFIG_IP_ALWAYS_DEFRAG) [Y/n/?]
        - YES: 이 기능을 선택해야지 IP 마스커레이드와 투명한 프록시 기능을 선택할 
               수 있다. 이 기능은 IP 마스커레이드 접속을 최적화 하기도 한다.
    
      * IP: masquerading (CONFIG_IP_MASQUERADE) [Y/n/?]
        - YES: 내부 주소를 외부로 내보낼 패킷으로 변환해 주는 IP 마스커레이딩 기능을
               사용 가능하게 한다.
    
      * IP: ICMP masquerading (CONFIG_IP_MASQUERADE_ICMP) [Y/n/?]
        - YES: ICMP 핑 패킷을 마스커레이드 하기 위해 사용된다. (선택하지 않더라도
               ICMP 에러 코드 자체는 마스커레이드 될 것이다.) 접속에 문제가 생겼을
               때 해결하기 위해 사용되는 중요한 기능이다.
    
      * IP: masquerading special modules support (CONFIG_IP_MASQUERADE_MOD) [Y/n/?]
        - YES: 꼭 필요하지는 않지만, 이 기능은 나중에 TCP/IP 포트 포워딩을 사용 
               가능하게 하기 위해서 선택해야 한다. 포트 포워딩을 통해서 외부로부터
               마스커레이드되는 내부의 컴퓨터로 직접 연결할 수 있다.
    
      * IP: ipautofw masq support (EXPERIMENTAL) (CONFIG_IP_MASQUERADE_IPAUTOFW) [N/y/m/?]
        - NO:  IPautofw 기능은 포트 포워딩을 사용하기 위해서 사용되던 구시대적인
               방법이다. 이 기능은 프로토콜 단위의 모듈을 사용하는 것이 더 낫다.
    
      * IP: ipportfw masq support (EXPERIMENTAL) (CONFIG_IP_MASQUERADE_IPPORTFW) [Y/m/n/?]
        - YES: IPPORTFW를 사용가능하게 한다.
    
               이 옵션을 선택하면, 인터넷상의 외부의 컴퓨터들이 내부의 
               마스커레이드되는 컴퓨터와 직접 통신할 수 있게 된다. 이 기능은 
               통상적으로 내부의 SMTP, TELNET, WWW 서버에 접속하기 위해서 사용된다.
               FTP 포트 포워딩은 FAQ 섹션에 설명되는 추가 패치를 사용해야 한다.
               포트 포워딩에 대한 추가적인 정보는 이 HOWTO의 Forwards 섹션에서
               다루고 있다.
    
      * IP: ip fwmark masq-forwarding support (EXPERIMENTAL) (CONFIG_IP_MASQUERADE_MFW) [Y/m/n/?]
        - NO:  IPCHAINS로 부터 직접 IP 포워딩을 할 수 있게 한다. 현재 이 코드는 
               시험용이며, 권장하는 방법은 IPMASQADM 와 IPPORTFW를 사용하는 것이다.
    
      * IP: optimize as router not host (CONFIG_IP_ROUTER) [Y/n/?]
        - YES: 이 기능은 커널의 네트웍 기능을 최적화 해 준다.
    
      * IP: GRE tunnels over IP (CONFIG_NET_IPGRE) [N/y/m/?]
        - NO:  이 기능은 꼭 필요하지는 않으며, IP 마스커레이딩을 통해서 PPTP와 
               GRE 터널을 사용가능하게 한다.
    
      * IP: TCP syncookie support (not enabled per default) (CONFIG_SYN_COOKIES) [Y/n/?]
        - YES: 기본적인 네트웍 보안을 위해서 선택할 것을 강력히 권장한다.
    
      * Network device support (CONFIG_NETDEVICES) [Y/n/?]
        - YES: 리눅스의 네트웍 장치를 사용할 수 있게 한다.
    
      * Dummy net driver support (CONFIG_DUMMY) [M/n/y/?]
        - YES: 꼭 필요하지는 않지만, 문제가 발생했을 때 디버깅 할 때 도움이 될 
               것이다.
    
      * /proc filesystem support (CONFIG_PROC_FS) [Y/n/?]
        - YES: 리눅스의 네트웍 포워딩 시스템을 사용하기 위해서 필요하다.
    

    NOTE: 이 옵션들은 단지 IP 마스커레이딩이 동작하기 위한 요소들이다. 특정한 네트웍과 특정 하드웨어를 설정하기 위해서는 필요한 다른 옵션들을 더 선택해야 한다.

    • 커널 자체를 컴파일하고 나서는, 다음과 같은 명령으로 커널의 IP 마스커레이딩 관련 모듈들을 컴파일하고 설치해야 한다:
        make modules; make modules_install
        
      

    • 다음에는, /etc/rc.d/rc.local 화일에 다음과 같이 몇줄을 추가해서 IP 마스커레이드를 사용하기 위한 스크립트를 load하도록 해야 한다. 이렇게 하면 리부팅을 할 때마다 자동적으로 IP 마스커레이딩 기능을 사용할 수 있다:

              .
              .
              .
              #rc.firewall script - Start IPMASQ and the firewall
              /etc/rc.d/rc.firewall
              .
              .
              .
        
      

    3.2 내부 LAN에 비공식적인 내부 IP 주소를 할당하기

    모든 내부의 마스커레이드 된 컴퓨터들에 공식적인 인터넷 주소가 할당되어져 있지 않기 때문에, 외부의 인터넷 주소와 충돌하지 않도록 그 컴퓨터들에 주소를 할당할 방법이 있어야 한다.

    >IP 마스커레이드 FAQ의 원본으로부터 인용:

    RFC 1918 은 외부와 연결되지 않는 "개인용" 네트웍에 사용되는 IP 주소들에 관한 공식적인 문서이다. 이러한 경우에 사용되기 위해서 세 가지의 주소 영역이 있다.

    Section 3: 개인용 주소 영역
    
    인터넷 주소 할당 기구(The Internet Assigned Numbers Authority : IANA)는 
    IP 주소중에서 다음 세가지 영역을 개인용 네트웍을 위해서 예약해 두었다:
    
                  10.0.0.0        -   10.255.255.255
                  172.16.0.0      -   172.31.255.255
                  192.168.0.0     -   192.168.255.255
    
    첫번째 영역은 "24-bit 영역", 두번째는 "20-bit 영역", 세번째는 "16-bit 영역"으로
    부르기로 한다. 첫번째 영역은 class A 네트웍 주소 영역이며, 두번째는 class B 
    네트웍 주소의 연속된 16개의 번호들이고, 세번째는 class C 네트웍 주소의 연속된 
    255개의 번호들이다. 
    

    설명을 위해서, 필자는 192.168.0.0 네트웍과 255.255.255.0의 class-C 서브넷 마스크를 사용했고, 이 HOWTO에서도 이 주소를 사용할 것이다. 그러나, 위에 있는 개인용 네트웍 주소중에서 어떤 것을 사용해도 무방하다. 단, 각각의 경우에 적절한 서브넷 마스크를 사용해야 한다.

    만약 Class-C 네트웍을 사용한다면, 마스커레이딩을 사용할 컴퓨터들에 192.168.0.1, 192.168.0.2, 192.168.0.3, ..., 192.168.0.x 등과 같이 주소를 할당해야 한다.

    192.168.0.1 은 보통 내부 게이트웨이 혹은 리눅스 마스커레이드 머신의 주소로서 외부로 연결되는 통로이다. 192.168.0.0과 192.168.0.255는 각각 "네트웍" 자체의 주소와 "브로드캐스트" 주소이다. (이 주소들은 예약된 주소들이다.) 이 주소들을 컴퓨터들에게 할당면, 네트웍이 제대로 동작하지 않을 것이다.

    3.3 IP 포워딩 정책 설정하기

    이제, 커널과 기타 필요한 패키지들이 준비되어 있어야 한다. 리눅스 마스커레이드 서버에도 모든 네트웍 IP 주소들과, 게이트웨이, DNS 주소들을 설정해야 한다. 네트웍 카드들을 설정하는 방법을 모른다면, 2.0.x-Requirements 혹은2.2.x-Requirements 섹션에 언급된 HOWTO들을 참조하기 바란다.

    이제 남은 것은 IP 방화벽 도구들을 설정해서 포워딩과 마스커레이딩을 하도록 하는 것이다:

    ** 설정은 여러가지 방법으로 할 수가 있지만, 필자는 다음에 예로 든 방법을 사용해서 성공했다. 하지만, 여러분은 다른 방법을 사용할 수도 있을 것이다.

    ** 이 섹션에서 제공하는 것은 IP 마스커레이드 기능이 작동하기 위한 최소한의 방화벽 정책이다. 일단 IP 마스커레이드가 제대로 동작하면(이 HOWTO에서 나중에 언급한다) Strong-IPFWADM-Rulesets와 Strong-IPCHAINS-Rulesets 섹션에서 보안 강도가 보다 높은 정책들에 대해 알아보기 바란다. 더 자세한 사항은 IPFWADM (2.0.x) 혹은 IPCHAINS(2.2.x) man 페이지를 참조하기 바란다.

    리눅스 2.0.x 커널

    다음과 같은 "간단한" 초기 정책으로 /etc/rc.d/rc.firewall 화일을 생성한다:

    # rc.firewall - Initial SIMPLE IP Masquerade setup for 2.0.x kernels using IPFWADM
    #
    # Load all required IP MASQ modules
    #
    #   NOTE:  Only load the IP MASQ modules you need.  All current available IP MASQ modules
    #          are shown below but are commented out from loading.
    
    # Needed to initially load modules
    #
    /sbin/depmod -a
    
    # Supports the proper masquerading of FTP file transfers using the PORT method
    #
    /sbin/modprobe ip_masq_ftp
    
    # Supports the masquerading of RealAudio over UDP.  Without this module,
    #       RealAudio WILL function but in TCP mode.  This can cause a reduction
    #       in sound quality
    #
    #/sbin/modprobe ip_masq_raudio
    
    # Supports the masquerading of IRC DCC file transfers
    #
    #/sbin/modprobe ip_masq_irc
    
    # Supports the masquerading of Quake and QuakeWorld by default.  This modules is
    #   for for multiple users behind the Linux MASQ server.  If you are going to play
    #   Quake I, II, and III, use the second example.
    #
    #Quake I / QuakeWorld (ports 26000 and 27000)
    #/sbin/modprobe ip_masq_quake
    #
    #Quake I/II/III / QuakeWorld (ports 26000, 27000, 27910, 27960)
    #/sbin/modprobe ip_masq_quake ports=26000,27000,27910,27960
    
    # Supports the masquerading of the CuSeeme video conferencing software
    #
    #/sbin/modprobe ip_masq_cuseeme
    
    #Supports the masquerading of the VDO-live video conferencing software
    #
    #/sbin/modprobe ip_masq_vdolive
    
    
    #CRITICAL:  Enable IP forwarding since it is disabled by default since
    #
    #           Redhat Users:  you may try changing the options in /etc/sysconfig/network from:
    #
    #                       FORWARD_IPV4=false
    #                             to
    #                       FORWARD_IPV4=true
    #
    echo "1" > /proc/sys/net/ipv4/ip_forward
    
    # Dynamic IP users:
    #
    #   If you get your Internet IP address dynamically from SLIP, PPP, or DHCP, enable this following
    #       option.  This enables dynamic-ip address hacking in IP MASQ, making the life
    #       with DialD, PPPd, and similar programs much easier.
    #
    #echo "1" > /proc/sys/net/ipv4/ip_dynaddr
    
    
    # MASQ timeouts
    #
    #   2 hrs timeout for TCP session timeouts
    #  10 sec timeout for traffic after the TCP/IP "FIN" packet is received
    #  160 sec timeout for UDP traffic (Important for MASQ'ed ICQ users)
    #
    /sbin/ipfwadm -M -s 7200 10 160
    
    
    # DHCP:  For people who receive their external IP address from either DHCP or BOOTP
    #        such as ADSL or Cablemodem users, it is necessary to use the following
    #        before the deny command.  The "bootp_client_net_if_name" should be replaced
    #        the name of the link that the DHCP/BOOTP server will put an address on to?
    #        This will be something like "eth0", "eth1", etc.
    #
    #        This example is currently commented out.
    #
    #
    #/sbin/ipfwadm -I -a accept -S 0/0 67 -D 0/0 68 -W bootp_clients_net_if_name -P udp
    
    
    # Enable simple IP forwarding and Masquerading
    #
    #  NOTE:  The following is an example for an internal LAN address in the 192.168.0.x
    #         network with a 255.255.255.0 or a "24" bit subnet mask.
    #
    #         Please change this network number and subnet mask to match your internal LAN setup
    #
    /sbin/ipfwadm -F -p deny
    /sbin/ipfwadm -F -a m -S 192.168.0.0/24 -D 0.0.0.0/0
    

    /etc/rc.d/rc.firewall 화일을 편집해서 정책을 생성하고 나면, "chmod 700 /etc/rc.d/rc.firewall" 라고 명령해서 실행가능한 화일로 만든다.

    위의 방법처럼 전체 TCP/IP 네트웍에 대해서가 아니라, 각각의 머신별로 IP 마스커레이딩을 설정할 수도 있다. 예를 들어서, 192.168.0.2와 192.168.0.8의 주소를 갖는 호스트는 인터넷에 접근가능하도록 하고 다른 내부의 머신들은 접근하지 못하도록 하고자 한다면, 위의 /etc/rc.d/rc.firewall 화일에서 "Enable simple IP forwarding and Masquerading" 이라고 되어 있는 부분을 바꿔주면 된다.

    # Enable simple IP forwarding and Masquerading
    #
    #  NOTE:  The following is an example to only allow IP Masquerading for the 192.168.0.2
    #         and 192.168.0.8 machines with a 255.255.255.0 or a "24" bit subnet mask.
    #
    #         Please use the following in ADDITION to the simple ruleset above for specific
    #         MASQ networks.  Also change the network numbers and subnet masks to match your
    #         internal LAN setup
    #
    /sbin/ipfwadm -F -p deny
    /sbin/ipfwadm -F -a m -S 192.168.0.2/32 -D 0.0.0.0/0
    /sbin/ipfwadm -F -a m -S 192.168.0.8/32 -D 0.0.0.0/0
    

    IP 마스커레이딩을 처음 사용하는 사람들이 흔히 저지르는 실수는 다음과 같이 명령하는 것이다:

    ipfwadm -F -p masquerade
    

    디폴트로 마스커레이딩을 하도록 해서는 안된다. 만약 그렇게 설정하면 라우팅 테이블을 다룰 줄 아는 어떤 누군가가 여러분의 게이트웨이를 통해서 자신의 신분을 숨기고서 어딘가로 접속할 수가 있게 된다!

    위의 설정화일 내용은, /etc/rc.d/rc.firewall 화일이나 혹은 원하는 다른 rc 화일에 넣을 수도 있고, 아니면 IP 마스커레이드가 필요할 때마다 수동으로 명령할 수도 있다.

    Strong-IPFWADM-Rulesets 과 Strong-IPCHAINS-Rulesets 섹션에서 IPFWADM에 관한 자세한 안내와 더 강력한 IPFWADM 정책들의 예를 볼수가 있다.

    리눅스 2.2.x 커널

    2.1.x 나 2.2.x 커널에서 IP 마스커레이딩 정책들을 다루기 위한 방화벽 도구로서 IPFWADM은 더이상 사용되지 않는다 이 새 버젼의 커널들은 이제 IPCHAINS라는 도구를 사용한다. 이렇게 된 자세한 이유는 FAQ 섹션을 참조하기 바란다.

    다음과 같은 "간단한" 초기 정책으로 /etc/rc.d/rc.firewall 화일을 생성한다:

    #!/bin/sh
    #
    # rc.firewall - Initial SIMPLE IP Masquerade test for 2.1.x and 2.2.x kernels using IPCHAINS
    #
    # Load all required IP MASQ modules
    #
    #   NOTE:  Only load the IP MASQ modules you need.  All current IP MASQ modules
    #          are shown below but are commented out from loading.
    
    # Needed to initially load modules
    #
    /sbin/depmod -a
    
    # Supports the proper masquerading of FTP file transfers using the PORT method
    #
    /sbin/modprobe ip_masq_ftp
    
    # Supports the masquerading of RealAudio over UDP.  Without this module,
    #       RealAudio WILL function but in TCP mode.  This can cause a reduction
    #       in sound quality
    #
    #/sbin/modprobe ip_masq_raudio
    
    # Supports the masquerading of IRC DCC file transfers
    #
    #/sbin/modprobe ip_masq_irc
    
    
    # Supports the masquerading of Quake and QuakeWorld by default.  This modules is
    #   for for multiple users behind the Linux MASQ server.  If you are going to play
    #   Quake I, II, and III, use the second example.
    #
    #Quake I / QuakeWorld (ports 26000 and 27000)
    #/sbin/modprobe ip_masq_quake
    #
    #Quake I/II/III / QuakeWorld (ports 26000, 27000, 27910, 27960)
    #/sbin/modprobe ip_masq_quake ports=26000,27000,27910,27960
    
    
    # Supports the masquerading of the CuSeeme video conferencing software
    #
    #/sbin/modprobe ip_masq_cuseeme
    
    #Supports the masquerading of the VDO-live video conferencing software
    #
    #/sbin/modprobe ip_masq_vdolive
    
    
    #CRITICAL:  Enable IP forwarding since it is disabled by default since
    #
    #           Redhat Users:  you may try changing the options in /etc/sysconfig/network from:
    #
    #                       FORWARD_IPV4=false
    #                             to
    #                       FORWARD_IPV4=true
    #
    echo "1" > /proc/sys/net/ipv4/ip_forward
    
    
    # Dynamic IP users:
    #
    #   If you get your IP address dynamically from SLIP, PPP, or DHCP, enable this following
    #       option.  This enables dynamic-ip address hacking in IP MASQ, making the life
    #       with Diald and similar programs much easier.
    #
    #echo "1" > /proc/sys/net/ipv4/ip_dynaddr
    
    
    # MASQ timeouts
    #
    #   2 hrs timeout for TCP session timeouts
    #  10 sec timeout for traffic after the TCP/IP "FIN" packet is received
    #  160 sec timeout for UDP traffic (Important for MASQ'ed ICQ users)
    #
    /sbin/ipchains -M -S 7200 10 160
    
    
    # DHCP:  For people who receive their external IP address from either DHCP or BOOTP
    #        such as ADSL or Cablemodem users, it is necessary to use the following
    #        before the deny command.  The "bootp_client_net_if_name" should be replaced
    #        the name of the link that the DHCP/BOOTP server will put an address on to?
    #        This will be something like "eth0", "eth1", etc.
    #
    #        This example is currently commented out.
    #
    #
    #/sbin/ipchains -A input -j ACCEPT -i bootp_clients_net_if_name -s 0/0 67 -d 0/0 68 -p udp
    
    # Enable simple IP forwarding and Masquerading
    #
    #  NOTE:  The following is an example for an internal LAN address in the 192.168.0.x
    #         network with a 255.255.255.0 or a "24" bit subnet mask.
    #
    #         Please change this network number and subnet mask to match your internal LAN setup
    #
    /sbin/ipchains -P forward DENY
    /sbin/ipchains -A forward -s 192.168.0.0/24 -j MASQ
    
    

    /etc/rc.d/rc.firewall 화일을 편집해서 정책을 생성하고 나면, chmod 700 /etc/rc.d/rc.firewall라고 명령해서 실행가능한 화일로 만든다.

    위의 방법처럼 전체 TCP/IP 네트웍에 대해서가 아니라, 각각의 머신별로 IP 마스커레이딩을 설정할 수도 있다. 예를 들어서, 192.168.0.2와 192.168.0.8의 주소를 갖는 호스트는 인터넷에 접근가능하도록 하고 다른 내부의 머신들은 접근하지 못하도록 하고자 한다면, 위의 /etc/rc.d/rc.firewall 화일에서 "Enable simple IP forwarding and Masquerading" 이라고 되어 있는 부분을 바꿔주면 된다.

    #!/bin/sh
    #
    # Enable simple IP forwarding and Masquerading
    #
    #  NOTE:  The following is an example to only allow IP Masquerading for the 192.168.0.2
    #         and 192.168.0.8 machines with a 255.255.255.0 or a "24" bit subnet mask.
    #
    #         Please change this network number and subnet mask to match your internal LAN setup
    #
    /sbin/ipchains -P forward deny
    /sbin/ipchains -A forward -s 192.168.0.2/32 -j MASQ
    /sbin/ipchains -A forward -s 192.168.0.8/32 -j MASQ
    

    IP 마스커레이딩을 처음 사용하는 사람들이 흔히 저지르는 실수는 다음과 같이 명령하는 것이다:

    /sbin/ipchains -P forward masquerade

    디폴트로 마스커레이딩을 하도록 해서는 안된다. 만약 그렇게 설정하면 라우팅 테이블을 다룰 줄 아는 어떤 누군가가 여러분의 게이트웨이를 통해서 자신의 신분을 숨기고서 어딘가로 접속할 수가 있게 된다!

    위의 설정화일 내용은, /etc/rc.d/rc.firewall 화일이나 혹은 원하는 다른 rc 화일에 넣을 수도 있고, 아니면 IP 마스커레이드가 필요할 때마다 수동으로 명령할 수도 있다.

    Strong-IPFWADM-Rulesets 과 Strong-IPCHAINS-Rulesets 섹션에서 IPCHAINS에 관한 자세한 안내와 더 강력한 IPCHAINS 정책들의 예를 볼 수가 있다. IPCHAINS의 사용법에 관한 자세한 사항은 Linux IP CHAINS HOWTO을 참조하기 바란다.

    4. 마스커레이딩 내부의 컴퓨터들을 설정하기

    내부의 마스커레이드 되는 컴퓨터들의 IP 주소를 적절히 설정하는 것 외에, 내부의 각 컴퓨터들이 리눅스 마스커레이드 서버의 주소를 게이트웨이 주소로 설정하고 DNS 서버 주소를 적절히 설정해야 한다. 대개의 경우에 이것은 꽤 수월하다. 간단히, 게이트웨이 주소에 리눅스 호스트의 주소(일반적으로 192.168.0.1)를 입력하면 된다.

    도메인 네임 서비스(DNS)의 경우에는, 사용 가능한 어떤 DNS 서버의 주소라도 추가할 수 있다. 가장 깨끗한 방법은 리눅스 서버가 사용하고 있는 DNS 서버를 입력하는 것이다. 추가로, "도메인 검색" 접미사를 추가할 수도 있다.

    마스커레이드 되는 내부의 컴퓨터들을 제대로 설정하고 나면, 해당 컴퓨터의 네트웍을 재시동하든지 아니면 재부팅한다.

    다음의 설정 과정에서는, 여러분이 Class C 네트웍 주소들을 사용하고, 리눅스 마스커레이드 서버의 주소가 192.168.0.1이라고 가정한다. 192.168.0.0과 192.168.0.255는 예약된 주소이니 각 컴퓨터의 주소로 사용해서는 안된다.

    다음과 같은 플랫폼들이 마스커레이딩 내부에서 테스트되었다:

    • Linux 1.2.x, 1.3.x, 2.0.x, 2.1.x, 2.2.x
    • Solaris 2.51, 2.6, 7
    • Windows 95, OSR2, 98
    • Windows NT 3.51, 4.0, 2000 (웍스테이션과 서버 모두)
    • Windows For Workgroup 3.11 (TCP/IP 패키지 설치)
    • Windows 3.1 (Netmanage Chameleon 패키지 설치)
    • TCP/IP 서비스를 설치한 Novell 4.01 서버
    • OS/2 (Warp v3 포함)
    • Macintosh OS (MacTCP 혹은 Open Transport 설치)
    • DOS (NCSA Telnet 패키지 설치, DOS Trumpet은 부분적으로 동작)
    • Amiga (AmiTCP 혹은 AS225-stack 설치)
    • UCX를 설치한 VAX Stations 3520과 3100 (VMS의 경우에는 TCP/IP stack)
    • Linux/Redhat을 설치한 Alpha/AXP
    • SCO Openserver (v3.2.4.2와 5)
    • AIX를 설치한 IBM RS/6000

    4.1 Microsoft Windows 95 설정

    1. 네트웍 장치 드라이버를 설치하지 않았다면 지금 설치한다. 드라이버 설치에 관한 것은 이 문서에서 다루지 않는다.

    2. '제어판' --> '네트웍' 을 선택한다.

    3. TCP/IP 프로토콜이 설치되지 않았다면, 추가 --> 프로토콜 --> 제조회사: Microsoft --> 프로토콜: 'TCP/IP 프로토콜' 을 차례로 선택해서 설치한다.

    4. TCP/IP 항목을 Windows95 네트웍 카드로 연결(bound)되도록 하고 '등록정보'를 선책한다. 'IP 주소' 탭을 클릭하고 IP 주소를 192.168.0.x(1 < x < 255)로 설정한다. 그리고 서브넷 마스크를 255.255.255.0으로 설정한다.

    5. "게이트웨이" 탭을 클릭하고 '게이트웨이'에 192.168.0.1이라고 입력한후 "추가"를 클릭한다.

    6. 'DNS 설정' 탭을 클릭하고, 컴퓨터의 이름과 도메인 명을 입력한다. 도메인이 없다면, 여러분이 사용하는 ISP의 도메인을 입력한다. 이제, DNS 서버 주소에 리눅스 호스트가 사용하고 있는 DNS 서버(대개의 경우/etc/resolv.conf화일에 저장되어 있다)를 입력한다. 이 DNS 서버들은 ISP가 운영하고 있지만, 리눅스 마스커레이드 서버에 여러분 자신의 "캐쉬"서버나 DNS 서버를 운영할 수도 있다. 원하는 도메인 검색 접미사(찾을 도메인 명)을 추가할 수도 있다.

    7. 나머지 설정들은 잘 알지 못한다면 그대로 두도록 한다.

    8. 모든 대화상자에서 '확인(OK)' 을 클릭하고 재부팅한다.

    9. 네트웍 연결을 시험해 보기 위해서 리눅스 호스트로 Ping 을 해본다: '시작/실행'ping 192.168.0.1라고 입력.
      (이것은 단지 내부 LAN 연결을 시험하는 것이다. 아직은 바깥 세계로 ping 을 할 수가 없다.) PING 한 것에 대해 응답이 없다면 네트웍 설정을 다시 확인한다.

    10. C:\Windows 디렉토리에 HOSTS 화일을 만들면, DNS 서버가 없어도 "호스트명"으로 LAN 안에 있는 컴퓨터들에게 PING을 할 수가 있다. C:\windows 디렉토리에 HOSTS.SAM 라는 예제 화일이 있을 것이다.

    4.2 Windows NT 설정

    1. 네트웍 장치 드라이버를 설치하지 않았다면 지금 설치한다. 드라이버 설치에 관한 것은 이 문서에서 다루지 않는다.

    2. '제어판' --> '네트웍' --> 프로토콜 을 선택한다.

    3. TCP/IP 서비스가 아직 설치되어 있지 않다면 '소프트웨어 추가' 메뉴에서 TCP/IP 프로토콜과 그외 항목들을 추가한다.

    4. '네트웍 소프트웨어와 어댑터 카드' 부분에서, '설치된 네트웍 소프웨어'에 있는 'TCP/IP 프로토콜'을 선택한다.

    5. 'TCP/IP 설정'에서 적절한 어댑터를 선택한다. 예를 들면 [1]Novell NE2000 어댑터. 그리고 IP 주소를 192.168.0.x (1 < x < 255)로 설정하고, 서브넷 마스크를 255.255.255.0, 디폴트 게이트웨이를 192.168.0.1로 설정한다.

    6. Windows NT 도메인 내에 있지 않거나 각 항목이 무엇을 의미하는지 잘 모를 때에는 'Automatic DHCP Configuration'의 활성화를 해제하고, 'WINS Server' 부분에 아무것도 입력하지 말고, Enable IP Forwardings의 활성화를 해제한다.

    7. 'DNS'를 클릭하고, 리눅스 호스트가 사용하고 있는 적절한 정보들(대개는 /etc/resolv.conf에 저장되어 있음)을 입력한다. 다 되었으면 '확인'을 클릭한다.

    8. '고급'을 클릭하고, 이 옵션들이 어떤 역할을 하는 지 잘 모르면 'DNS for Windows Name Resolution''Enable LMHOSTS lookup'의 활성화를 해제한다. 만약에 LMHOSTS 화일을 사용하고자 한다면, C:\winnt\system32\drivers\etc에 저장되어 있는 것을 참조한다.

    9. 모든 대화상자에서 '확인'을 클릭하고 시스템을 재시작한다.

    10. 네트웍 연결을 시험해 보기 위해서 리눅스 호스트로 Ping 을 해본다: '화일/실행'ping 192.168.0.1라고 입력.
      (이것은 단지 내부 LAN 연결을 시험하는 것이다. 아직은 바깥 세계로 ping 을 할 수가 없다.) PING 한 것에 대해 응답이 없다면 네트웍 설정을 다시 확인한다.

    4.3 Windows에서 Workgroup 3.11 설정

    1. 네트웍 장치 드라이버를 설치하지 않았다면 지금 설치한다. 드라이버 설치에 관한 것은 이 문서에서 다루지 않는다.

    2. TCP/IP 32b 패키지가 아직 설치되어 있지 않다면 설치한다.

    3. 'Main'/'Windows Setup'/'Network Setup'에서, 'Drivers'를 클릭한다.

    4. 'Network Drivers' 부분에서 'Microsoft TCP/IP-32 3.11b'를 선택한다. 'Setup'을 클릭한다.

    5. IP 주소를 192.168.0.x (1 < x < 255)로 설정한다. 그리고 서브넷 마스크를 255.255.255.0으로 디폴트 게이트웨이를 192.168.0.1로 설정한다.

    6. Windows NT 도메인 내에 있지 않거나 각 항목이 무엇을 의미하는지 잘 모를 때에는 'Automatic DHCP Configuration'의 활성화를 해제하고, 'WINS Server' 부분에 아무것도 입력하지 말도록 한다.

    7. 'DNS'를 클릭하고, 리눅스 호스트가 사용하고 있는 적절한 정보들(대개는 /etc/resolv.conf에 저장되어 있음)을 입력한다. 다 되었으면 '확인'을 클릭한다.

    8. '고급'을 클릭하고, 'Enable DNS for Windows Name Resolution'과 'Enable LMHOSTS lookup'를 선택한다. 만약에 LMHOSTS 화일을 사용하고자 한다면, C:\winnt\system32\drivers\etc에 저장되어 있는 것을 참조한다.

    9. 모든 대화상자에서 '확인'을 클릭하고 시스템을 재시작한다.

    10. 네트웍 연결을 시험해 보기 위해서 리눅스 호스트로 Ping 을 해본다: '화일/실행'ping 192.168.0.1라고 입력. 
      (이것은 단지 내부 LAN 연결을 시험하는 것이다. 아직은 바깥 세계로 ping 을 할 수가 없다.) PING 한 것에 대해 응답이 없다면 네트웍 설정을 다시 확인한다.

    4.4 UNIX 기반 시스템의 설정

    1. 아직 네트웍 카드를 설치하지 않았거나 해당 드라이버를 지원하도록 커널을 다시 컴파일 하지 않았다면 지금 한다. 이 문서에서 이 내용은 다루지 않는다.
    2. TCP/IP 네트웍이 아직 설치되어 있지 않다면, net-tools 패키지와 같은 TCP/IP 네트웍 툴을 설치한다.

    3. IPADDR를 192.168.0.x (1 < x < 255)로 설정한다. NETMASK를 255.255.255.0, GATEWAY를 192.168.0.1, 그리고 BROADCAST를 192.168.0.255로 설정한다.

      예를 들어서 래드햇 리눅스 시스템이라면, /etc/sysconfig/network-scripts/ifcfg-eth0화일을 편집하거나, 간단하게 Control Panel에서 해결할 수 있다. SunOS, BSDi, Slackware Linux, Solaris, SuSe, Debian 등등.. 다른 UNIX에서는 방법이 다를 수도 있다. 정보를 더 얻고자 한다면 여러분의 해당 UNIX 문서를 참조하기 바란다.

    4. /etc/resolv.conf화일에 도메인 네임 서비스(DNS)를 추가하고 도메인 검색 접미사를 추가한다. UNIX 버젼과 종류에 따라서는, /etc/nsswitch.conf 화일을 편집해서 DNS 서비스를 사용가능하게 한다.

    5. 설정에 따라서는 /etc/networks 화일을 편집해서 바꾸어줘야 할 수도 있다.

    6. 적절한 서비스들을 재시동하거나, 혹은 간단하게 아예 시스템 자체를 재시작한다.

    7. 게이트웨이가 되는 컴퓨터로의 연결을 시험하기 위해서 다음과 같이 ping 명령을 내린다: ping 192.168.0.1.
      (이것은 단지 내부 LAN 연결을 시험하는 것이다. 아직은 바깥 세계로 ping 을 할 수가 없다.) PING 한 것에 대해 응답이 없다면 네트웍 설정을 다시 확인한다.

    4.5 NCSA 텔넷 패키지를 사용하는 DOS의 설정

    1. 아직 네트웍 카드를 설치하지 않았다면 지금 설치한다. 네트웍 카드 설치에 관한 것은 이 문서에서 다루지 않는다.

    2. 적절한 패킷 드라이버를 로드한다. 예를 들어서: NE2000 이더넷 카드를 I/O 포트 300, IRQ 10으로 사용한다면, nwpd 0x60 10 0x300라고 명령한다.

    3. 새로운 디렉토리를 만들고, 그 디렉토리에 NCSA 텔넷 패키지를 풀어 놓는다: pkunzip tel2308b.zip

    4. 텍스트 에디터로 config.tel 화일을 연다.

    5. myip=192.168.0.x (1 < x < 255)로, netmask=255.255.255.0로 설정한다.

    6. 이 예에서는, hardware=packet, interrupt=10, ioaddr=60라고 설정해야 한다.

    7. 게이트 웨이로서 적어도 한개의 컴퓨터에 대한 설정이 있어야 한다(예를 들면 이 경우에는 리눅스 호스트):

      name=default
      host=리눅스호스트이름
      hostip=192.168.0.1
      gateway=1
      

    8. 도메인 네임 서비스를 위해서 또 하나의 설정을 해줘야 한다:

      name=dns.domain.com ; hostip=123.123.123.123; nameserver=1
      

      Note: 리눅스 호스트가 사용하고 있는 정보대로 위의 내용을 수정해 준다.

    9. config.tel 화일을 저장한다.

    10. 네트웍 연결을 시험하기 위해서 리눅스 호스트로 텔넷 연결을 해 본다: telnet 192.168.0.1 만약 로긴 프롬프트가 나오지 않는다면, 네트웍 설정을 다시 확인한다.

    4.6 MacTCP를 사용하는 MacOS 기반 시스템의 설정

    1. 이더넷 어댑터를 위한 소프트웨어를 아직 설치하지 않았다면 지금 설치한다. 어댑터 설치에 관한 것은 이 문서에서 다루지 않는다.

    2. MacTCP control panel을 연다. 적절한 네트웍 드라이버를 선택한다(EtherTalk이 아니고 Ethernet을 선택). 그리고 'More...' 버튼을 클릭한다.

    3. 'Obtain Address:' 부분에서, 'Manually'를 클릭한다.

    4. 'IP Address:' 부분에서, 팝업 메뉴에서 class C를 선택한다. 이 대화상자의 나머지 부분은 무시한다.

    5. 'Domain Name Server Information:'에서 DNS 정보를 입력한다.

    6. 'Gateway Address:'에서, 192.168.0.1를 입력한다.

    7. 'OK'를 클릭해서 설정을 저장한다. MacTCP control panel의 메인 윈도우에서, 'IP Address:'부분에 Mac 컴퓨터의 IP 주소 (192.168.0.x, 1 < x < 255)를 입력한다.

    8. MacTCP control panel을 닫는다. 재시작을 묻는 대화상자가 나타나면 시스템을 재시작한다.

    9. 네트웍 연결을 시험하기 위해서 리눅스 호스트에 ping을 보낼 수 있다. MacTCP Watcher라는 프리웨어 소프트웨어가 설치되어 있다면, 'Ping' 버튼을 누르고, 나타나는 대화상자에서 리눅스 호스트의 주소(192.168.0.1)를 입력한다. (이것은 단지 내부 LAN 연결을 시험하는 것이다. 아직은 바깥 세계로 ping 을 할 수가 없다.) PING 한 것에 대해 응답이 없다면 네트웍 설정을 다시 확인한다.

    10. 내부 LAN에서 IP 주소 대신 호스트 이름을 사용하기 위해서, 시스템 폴더에 Hosts 화일을 만들 수도 있다. 시스템 폴더에는 이 화일이 이미 존재하고 있을 것이다. 이 화일에는 여러분의 경우에 맞춰서 수정해서 사용할 수있는 샘플이 들어 있을 것이다.

    4.7 Open Transport를 사용하는 MacOS 기반 시스템의 설정

    1. 이더넷 어댑터를 위한 적절한 드라이버가 아직 설치되어 있지 않다면, 지금 설치한다. 드라이버 설치에 관한 것은 이 문서에서 다루지 않는다.

    2. TCP/IP Control Panel을 열어서 Edit 메뉴에서 'User Mode ...'를 선택한다. user mode 가 최소한 'Advanced'이상에 설정되어 있는지 확인하고 'OK' 버튼을 누른다.

    3. File 메뉴에서 'Configurations...'를 선택한다. 'Default' 로 되어 있는 설정을 선택하고 'Duplicate...' 버튼을 클릭한다. 'Duplicate Configuration' 대화상자에서, 'IP Masq' (혹은 보통의 경우에서의 설정이 아니라는 것을 의미하는 것)을 입력한다. 이렇게 하면 'Default copy'와 같은 것이 나타날 것이다. 그러면 'OK' 버튼을 클릭하고,'Make Active' 버튼을 클릭한다.

    4. 'Connect via:' 대화상자에서 'Ethernet'을 선택한다.

    5. 'Configure:' 대화상자에서 적절한 항목을 선택한다. 어떤 것을 선택해야 하는지 잘 모르겠다면, 아마도'Default' 설정을 다시 선택하고 나가야 할 것이다. 필자의 경우에는 'Manually' 를 선택해서 설정했다.

    6. 'IP Address:' 대화상자에서 Mac 컴퓨터의 IP 주소(192.168.0.x, 1 < x < 255)를 입력한다.

    7. 'Subnet mask:' 대화상자에서 255.255.255.0를 입력한다.

    8. 'Router address:' 대화상자에서 192.168.0.1을 입력한다.

    9. 'Name server addr.:' 대화상자에서 DNS 서버의 IP 주소를 입력한다.

    10. 'Implicit Search Path:' 부분의 'Starting domain name' 대화상자에서 인터넷 도메인을 입력한다.

    11. 다음 과정은 선택적이다. 잘못 설정하면 정상 동작하지 않을 수도 있다. 잘 모르겠다면, 아무것도 입력하지 말고 비워두거나, 아무것도 선택되지 않은 채로 두는 것이 좋을 것이다. 필요하다면, 입력되어 있는 정보를 모두 없애도록 한다. 필자가 아는 한, TCP/IP 대화상자를 통해서 시스템이 이전에 선택되어 있는 다른 "Hosts" 화일을 사용하지 않도록 하는 방법은 없다. 만약 여러분이 그 방법을 알고 있다면, 필자에게 알려주길 바란다.

      여러분의 네트웍이 802.3 타입의 프레임을 필요로 한다면 '802.3'을 체크한다.

    12. 'Options...' 버튼을 클릭해서 TCP/IP 가 활성화 되도록 한다. 필자의 경우에는 'Load only when needed' 옵션을 사용했다. 여러분이 컴퓨터를 재부팅 하지 않는채로 TCP/IP 응용프로그램의 실행과 종료를 반복을 여러번 반복하는 경우에는, 'Load only when needed' 옵션을 체크하지 않는 것이 여러분의 컴퓨터의 메모리 관리에 도움을 줄 것이다. 그 항목을 체크하지 않은 채로 두면, TCP/IP 프로토콜 스택은 항상 로드되어서 사용 가능한 상태가 된다. 만약 체크해 둔다면, TCP/IP 스택은 필요할 때 자동적으로 로드되고 필요없어지면 자동적으로 제거된다. 이렇게 되면, 계속적인 loading과 unloading을 함으로써 메모리가 파편으로 조작나게 된다. (역자주: 윈도우즈의 디스크 조각 모임이 필요한 이유와 비슷하다.)

    13. 네트웍 연결을 시험하기 위해서 리눅스 호스트에 ping을 보낼 수 있다. MacTCP Watcher라는 프리웨어 소프트웨어가 설치되어 있다면, 'Ping' 버튼을 누르고, 나타나는 대화상자에서 리눅스 호스트의 주소(192.168.0.1)를 입력한다. (이것은 단지 내부 LAN 연결을 시험하는 것이다. 아직은 바깥 세계로 ping 을 할 수가 없다.) PING 한 것에 대해 응답이 없다면 네트웍 설정을 다시 확인한다.

    14. 내부 LAN에서 IP 주소 대신 호스트 이름을 사용하기 위해서, 시스템 폴더에 Hosts 화일을 만들 수도 있다. 이 화일은 시스템 폴더에 있을 수도 있고 없을 수도 있다. 이 화일이 존재한다면, 여러분의 경우에 맞춰서 수정해서 사용할 수있는 샘플이 들어 있을 것이다. 존재하지 않는다면, MacTCP를 사용하고 있는 시스템으로부터 복사해 와서 수정해 쓰거나, 그냥 여러분 자신이 만들어서 사용해도 된다(이 화일의 형식은 UNIX의 /etc/hosts화일 형식의 일부를 사용하며, RFC952에 설명되어 있다). 일단 화일을 만들고 나면, TCP/IP control panel을 열어서, 'Select Hosts File...' 버튼을 누르고 Hosts 화일을 연다.

    15. 닫기 상자를 클릭하거나 File 메뉴에서 'Close' 혹은 'Quit' 을 선택한다. 그리고 'Save' 버튼을 클릭해서 변경사항을 저장한다.

    16. 변경 사항은 즉시 반영되지만, 시스템을 재부팅하는 것도 좋다.

    4.8 DNS를 사용하는 Novell 네트웍의 설정

    1. 이더넷 어댑터을 위한 드라이버 소프트웨어가 아직 설치되어 있지 않다면, 지금 설치한다. 드라이버 설치에 관한 것은 이 문서에서 다루지 않는다.

    2. The Novell LanWorkPlace page에서 tcpip16.exe를 다운로드한다.

    3. c:\nwclient\startnet.bat를 편집한다
      
      : (필자가 쓰는 화일 내용이다)
      SET NWLANGUAGE=ENGLISH
      LH LSL.COM
      LH KTC2000.COM
      LH IPXODI.COM
      LH tcpip
      LH VLM.EXE
      F:
      

    4. c:\nwclient\net.cfg를 편집한다
      
      : (link driver는 여러분에 맞게 수정한다. 예를 들면 NE2000)
      Link Driver KTC2000
              Protocol IPX 0 ETHERNET_802.3
              Frame ETHERNET_802.3
              Frame Ethernet_II
              FRAME Ethernet_802.2
      
      NetWare DOS Requester
                 FIRST NETWORK DRIVE = F
                 USE DEFAULTS = OFF
                 VLM = CONN.VLM
                 VLM = IPXNCP.VLM
                 VLM = TRAN.VLM
                 VLM = SECURITY.VLM
                 VLM = NDS.VLM
                 VLM = BIND.VLM
                 VLM = NWP.VLM
                 VLM = FIO.VLM
                 VLM = GENERAL.VLM
                 VLM = REDIR.VLM
                 VLM = PRINT.VLM
                 VLM = NETX.VLM
      
      Link Support
              Buffers 8 1500
              MemPool 4096
      
      Protocol TCPIP
              PATH SCRIPT     C:\NET\SCRIPT
              PATH PROFILE    C:\NET\PROFILE
              PATH LWP_CFG    C:\NET\HSTACC
              PATH TCP_CFG    C:\NET\TCP
              ip_address      192.168.0.xxx
              ip_router       192.168.0.1
      
      위의 "ip_address" 부분은 여러분의 IP 주소로 한다 (192.168.0.x, 1 < x < 255)
      그리고 마지막으로 c:\bin\resolv.cfg를 편집한다:
      
      SEARCH DNS HOSTS SEQUENTIAL
      NAMESERVER xxx.xxx.xxx.xxx
      NAMESERVER yyy.yyy.yyy.yyy
      
    5. 위의 "NAMESERVER" 부분은 여러분이 사용하는 DNS 서버로 대체한다.

    6. 게이트웨이 컴퓨터로의 네트웍 연결을 시험하기 위해서 ping 명령을 한다: ping 192.168.0.1
      (이것은 단지 내부 LAN 연결을 시험하는 것이다. 아직은 바깥 세계로 ping 을 할 수가 없다.) PING 한 것에 대해 응답이 없다면 네트웍 설정을 다시 확인한다.

    4.9 OS/2 Warp의 설정

    1. 이더넷 어댑터를 위한 적절한 드라이버 소프트웨어가 아직 설치되어 있지 않다면 지금 설치한다. 드라이버 설치에 관한 것은 이 문서에서 다루지 않는다.

    2. TCP/IP 프로토콜이 아직 설치되어 있지 않다면 지금 설치한다.

    3. Programs/TCP/IP (LAN) / TCP/IP 설정으로 간다.

    4. 'Network'에서 TCP/IP 주소(192.168.0.x)를 입력하고 네트웍 마스크를 설정한다(255.255.255.0).

    5. 'Routing'에서 'Add'를 누른다. Type은 'default'로 하고 'Router Address' 부분에서 리눅스 호스트의 IP 주소를 입력한다(192.168.0.1).

    6. 'Hosts'에 리눅스 호스트가 사용하고 있는 DNS (Nameserver) 주소와 같이 설정해 준다.

    7. TCP/IP control panel을 닫고 뒤이어 나오는 질문들에 yes를 답한다.

    8. 시스템을 재부팅한다.

    9. 네트웍 설정을 시험하기 위해서 리눅스 호스트를 ping 할 수도 있다. 'OS/2 Command prompt Window'에서'ping 192.168.0.1'라고 입력한다. ping 패킷이 돌아오면 모든게 제대로 설정된 것이다.

    4.10 그외 다른 시스템의 설정

    그외 다른 시스템을 설정할 때에도 지금까지와 같은 방식을 사용한다. 위의 섹션들을 참조하기 바란다. 위에서 다루지 있지 않는 시스템에서의 설정에 대해서 글을 써 주실 분은, 그 자세한 설정과정을 ambrose@writeme.comdranch@trinnet.net으로 보내주기 바란다.

    5. IP 마스커레이드의 시험

    이제 마지막으로, IP 마스커레이딩을 시험할 때다. 리눅스 호스트를 아직 재부팅해보지 않았다면, 지금 재부팅하고 부팅이 성공하는지 확인하고, /etc/rc.d/rc.firewall 정책을 실행한다. 다음으로, 내부 LAN과의 연결과 외부 인터넷으로의 연결이 제대로 되어 있는지 확인한다.

    이제 다음과 같이 한다:

    • 첫번째: 마스커레이딩 내부의 컴퓨터에서, 내부의 다른 컴퓨터로 ping을 해본다(예를 들면 ping 192.168.0.10과 같이). 이것으로 내부 LAN의 컴퓨터에서 TCP/IP가 제대로 동작하는지 확인할 수 있다. 만약 제대로 되지 않는다면, 내부 컴퓨터들에서 TCP/IP 설정을 이 HOWTO에서 설명한 대로 제대로 했는지 다시 확인한다.

    • 두번째: 마스커레이드 서버 자체에서, 마스커레이드 내트웍 내부의 IP 주소로 ping을 해본다(예를 들면 ping 192.168.0.1과 같이). 이제 인터넷 상의 외부 IP 주소로 ping을 해본다. 이 외부의 주소는 ISP에 연결된 자기 자신의 PPP, 이더넷 등의 주소여도 된다. 이 IP 주소를 모른다면, "/sbin/ifconfig"라고 명령해서 인터넷 주소를 알아낸다. 이것으로 마스커레이드 서버에 네트웍이 온전히 연결되어 있는지 알 수가 있다.

    • 세번째: 다시 마스커레이딩 되는 내부의 컴퓨터에서, 마스커레이딩 리눅스 호스트의 내부 이더넷 카드에 연결된 IP 주소로 ping을 해본다(예를 들면 ping 192.168.0.1과 같이). 이것으로 내부 네트웍과 라우팅이 제대로 되고 있는지 확인할 수 있다. 만약 이것이 실패한다면, 마스커레이드 서버와 내부 컴퓨터의 이더넷 카드가 "물리적으로" 연결되어 있는지 확인한다. 이는 이더넷 카드 뒷면이나 이더넷 허브/스위치(만약 있다면)의 LED가 점등하는지 확인하면 된다.

    • 네번째: 내부의 컴퓨터에서, 마스커레이드 서버의 외부로 연결된 TCP/IP 주소로 ping을 해본다. 이 주소는 ISP에 연결된 여러분의 PPP, 이더넷 등의 주소일 것이다. 이 ping 테스트로, 마스커레이딩(특히 ICMP 마스커레이딩)이 제대로 작동하고 있는지 확인할 수 있다. 만약 이것이 제대로 동작하지 않는다면, 커널이 "ICMP Masquerading"을 지원하도록 되어 있는지와 /etc/rc.d/rc.firewall 스크립트에서 "IP Forwarding"을 허용했는지 확인한다. /etc/rc.d/rc.firewall 정책이 제대로 로드되었는지도 확인한다. /etc/rc.d/rc.firewall 스크립트를 수동으로 실행해서 제대로 동작하는지도 확인한다.

    여전히 제대로 작동하지 않는다면, 다음 명령의 출력을 잘 확인해 본다.

    • "ifconfig" : 인터넷 연결이 UP 되어 있는지와 인터넷 연결에 제대로 된 IP 주소가 설정되어 있는지를 확인한다.

    • "netstat -rn" : 디폴트 게이트웨이(Gateway 부분에 0.0.0.0이 아닌 IP 주소가 있는 것)가 설정되어 있는지 확인한다.

    • "cat /proc/sys/net/ipv4/ip_forward" : "1"을 출력하면 리눅스 포워딩이 허용되어 있는 것인데 이렇게 나오는지 확인한다.

    • 커널 2.0.x에서는 "/sbin/ipfwadm -F -l", 커널 2.2.x에서는 "/sbin/ipchains -F -L" : 마스커레이딩이 활성화 되어 있는지 확인한다.

    • 다섯번째: 마스커레이딩되는 내부의 컴퓨터에서, 인터넷상에 있는 고정 IP 주소로 ping을 해본다 (예를 들면,ping 152.19.254.81 와 같이 (이 주소는 LDP 홈페이지인 http://metalab.unc.edu 의 주소이다). 이것이 동작하면, 인터넷을 향한 ICMP 마스커레이딩이 제대로 이루어지고 있다는 것을 의미한다. 만약 동작하지 않으면, 인터넷 연결을 다시 확인한다. 다시 확인했는데도 동작하지 않으면, 예로 든 간단한 rc.firewall 정책을 사용하고 있는지와 커널을 ICMP 마스커레이딩을 포함하여 컴파일했는지 확인한다.

    • 여섯번째: 이제 외부의 "IP 주소"로 telnet을 해본다(예를 들면 telnet 152.2.254.81 (metalab.unc.edu - 이 서버는 부하가 많이 걸리기 때문에 로긴 프롬프트를 받기까지 시간이 걸릴 수도 있다). 어느정도 시간이 지난 후에 로긴 프롬프트를 받는가? 이것이 성공하면, TCP 마스커레이딩이 제대로 동작하고 있는 것이다. 만약 성공하지 못했다면, telnet을 지원하는 것 중에서 여러분이 알고 있는 곳을 시도해 본다. (예를 들면 198.182.196.55 (www.linux.org). 여전히 동작하지 않는다면, 현재 예로 든 간단한 rc.firewall 정책을 사용하고 있는지 확인한다.

    • 일곱번째: 이제 외부의 "호스트 이름"으로 telnet을 해본다(예를 들면 "telnet metalab.unc.edu"(152.2.254.81). 이것이 성공하면, DNS가 제대로 동작하고 있는 것이다. 이것은 성공하지 못했지만 "네번째" 단계는 성공했다면, 마스커레이딩 내부의 컴퓨터에 DNS 서버관련 설정을 제대로 했는지 확인한다.

    • 여덟번째: 마지막 시험으로써, 마스커레이딩 내부의 컴퓨터에서 웹 브라우져를 통해서 'INTERNET'상의 WWW 사이트를 열어보고 브라우져에 표시가 되는지 확인한다. 예를 들어서, Linux Documentation Project site를 접속해 본다. 이것이 성공하면, 모든 것이 훌륭하게 동작하고 있는 것이다!

    리눅스 문서 프로젝트의 홈페이지를 볼 수 있다면, 축하한다! 성공했다! 이 웹 사이트를 제대로 볼 수 있다면, PING, TELNET, SSH등의 표준 네트웍 통신들과, 관련된 IP 마스커레이드 모듈을 적재하면 FTP, Real Audio, IRC DCCs, Quake I/II/III, CuSeeme, VDOLive등도 제대로 동작할 것이다! FTP, IRC, RealAudio, Quake I/II/III등이 제대로 동작하지 않거나 부실하게 동작한다면, "lsmod"명령으로 관련된 마스커레이딩 모듈들이 제대로 적재되어 있는지 확인하거나 부적절한 서버 포트로 적재되어 있는지 확인한다. 필요한 모듈이 적재되어 있지 않다면, /etc/rc.d/rc.firewall 스크립트가 그 모듈들을 적재하도록 되어 있는지 확인한다. (예를 들면 해당 IP 마스커레이딩 모듈이 있는 부분이 "#" 문자를 제거)

    6. 그외의 IP 마스커레이드 관련 사항과 소프트웨어 지원

    6.1 IP 마스커레이드의 문제점

    어떤 TCP/IP 응용 프로그램들의 프로토콜은, 포트 번호에 대한 것들을 자기 나름대로 가정하거나 그들 데이터의 TCP/IP 주소나 포트 번호를 암호화하기 때문에, 리눅스 IP 마스커레이딩을 통해서는 제대로 동작하지 않는다. 암호화 때문에 문제가 되는 프로토콜을 사용하는 응용프로그램들은, 특정한 프록시 서버라든가, 마스커레이딩 코드 내에 특정 IP 마스커레이드 모듈을 추가해야 작동한다.

    6.2 외부로부터 들어오는 서비스

    기본적으로, 리눅스 IP 마스커레이딩은 외부로부터 들어오는 서비스들을 전혀 처리하지 못한다. 하지만, 이것을 처리할 수 있는 몇가지 방법이 있다.

    만약 높은 수준의 보안을 필요로 하지 않는다면, 간단히 요청이 들어오는 IP 포트를 포워딩해 주면 된다. 이를 수행하는 방법은 여러가지가 있지만, 가장 안정적인 방법은 IPPORTFW를 사용하는 것이다. 더 자세한 정보는 Forwarders 섹션을 참조한다.

    외부로부터 들어오는 서비스들에 대해서 어느정도의 인증절차를 갖게 하려면, TCP-wrappers나 Xinetd 등을 사용해서 특정한 IP 주소만 통과시킬 수 있다. 그 도구나 정보를 얻기 위해서는 TIS Firewall Toolkit을 살펴보면 좋을 것이다.

    외부로부터 들어오는 서비스의 보안에 대한 자세한 사항은 TrinityOS 문서와 IP Masquerade Resource에서 찾을 수 있을 것이다.

    6.3 지원되는 클라이언트 소프트웨어와 그외 설정에 대해 알아둘 점

    ** Linux Masquerade Application list에서 리눅스 IP 마스커레이딩을 통해서 동작하는 응용프로그램들에 관한 다량의 우수한 정보들을 얻을 수 있다. 이 사이트는 현재 Steve Grevemeyer가 관리하고 있으며, 그는 풍부한 데이타베이스를 구축해 놓았다. 아주 훌륭한 정보자원이다!

    일반적으로, 표준 TCP와 UDP를 사용하는 응용프로그램들은 잘 작동할 것이다. 만약 어떠한 제안이나 힌트등이 있다면 IP Masquerade Resource를 확인해서 자세한 사항을 확인하기 바란다.

    IP 마스커레이드와 함께 -동작하는- 네트웍 클라이언트들

    일반적인 클라이언트들:

    Archie

    지원되는 모든 플랫폼, 화일 검색 클라이언트 (모든 archie 클라이언트가 지원되지는 않는다).

    FTP

    지원되는 모든 플랫폼, active FTP 접속을 위해서 ip_masq_ftp.o 커널 모듈 사용.

    Gopher client

    지원되는 모든 플랫폼.

    HTTP

    지원되는 모든 플랫폼, 웹 서핑.

    IRC

    지원되는 여러가지 플랫폼에서 동작하는 모은 IRC 클라이언트, DCC는 ip_masq_irc.o 모듈을 통해서 지원.

    NNTP (USENET)

    지원되는 모든 플랫폼, USENET 뉴스 클라이언트.

    PING

    모든 플랫폼, ICMP 마스커레이딩 커널 옵션 사용

    POP3

    지원되는 모든 플랫폼, 이메일 클라이언트.

    SSH

    지원되는 모든 플랫폼, 보안상 안전한 TELNET/FTP 클라이언트.

    SMTP

    지원되는 모든 플랫폼, Sendmail, Qmail, PostFix등의 이메일 서버.

    TELNET

    지원되는 모든 플랫폼, 원격 접속.

    TRACEROUTE

    UNIX와 Windows 기반 플랫폼, 몇가지 변종들은 동작하지 않을 수 있다.

    VRML

    Windows(지원되는 모든 플랫폼에서도 어쩌면 가능), 가상 현실.

    WAIS client

    지원되는 모든 플랫폼.

    멀티미디어와 통신 클라이언트:

    Alpha Worlds

    Windows, 클라이언트-서버 방식의 3D 채팅 프로그램.

    CU-SeeMe

    지원되는 모든 플랫폼, ip_masq_cuseeme 모듈 사용, 자세한 사항은 CuSeeme 섹션 참조.

    ICQ

    지원되는 모든 플랫폼. 리눅스 커널이 IPPORTFW를 지원하도록 컴파일되어야 하며, ICQ가 NON-SOCKS 프록시 뒤쪽에서 동작하도록 설정되어야 한다. 이 설정에 대한 자세한 설명은 ICQ 섹션에서 확인할 수 있다.

    Internet Phone 3.2

    Windows, Peer-to-peer 방식의 음성 통신, 당신이 통화를 요청하는 경우에는 통신이 가능하지만, 다른 사람들이 당신에게 통화를 요청할 수 있게 하려면 특정 포트를 포워딩하도록 설정해야 한다. 자세한 사항은Forwarders 섹션을 참조한다.

    Internet Wave Player

    Windows, 네트웍 스트리밍 오디오(network streaming audio).

    Powwow

    Windows, Peer-to-peer 방식의 텍스트, 음성, 쪽지 통신, 당신이 통화를 요청하는 경우에는 통신이 가능하지만, 다른 사람들이 당신에게 통화를 요청할 수 있게 하려면 특정 포트를 포워딩하도록 설정해야 한다. 자세한 사항은 Forwarders 섹션을 참조한다.

    Real Audio Player

    Windows, 네트웍 스트리밍 오디오(network streaming audio), ip_masq_raudio UDP 모듈을 사용하면 더 좋은 음질을 얻을 수 있다.

    True Speech Player 1.1b

    Windows, 네트웍 스트리밍 오디오(network streaming audio)

    VDOLive

    Windows, ip_masq_vdolive 패치 적용.

    Worlds Chat 0.9a

    Windows, 클라이언트-서버 방식의 3D 채팅 프로그램.

    게임 - LooseUDP 패치에 관한 자세한 사항은 LooseUDP 섹션을 참조하기 바란다.

    Battle.net

    동작은 하지만, TCP 포트 116과 118과 UDP 포트 6112를 게임을 실행하는 컴퓨터로 IP 포워딩(IPPORTFW)해줘야 한다. 자세한 사항은 Forwarders 섹션을 참조하기 바란다. FSGS와 Bnetd 서버는 NAT와 잘 동작하도록 만들어져 있지 않기 때문에 IPPORTFW를 필요로 한다.

    BattleZone 1.4

    LooseUDP 패치를 하고 새로운 NAT와 잘 동작하는 .DLLs from Activision를 사용하면 동작한다.

    Dark Reign 1.4

    LooseUDP 패치를 하거나 TCP 포트 116과 118과 UDP 포트 6112를 게임을 실행하는 컴퓨터로 IP 포워딩(IPPORTFW)해줘야 한다. 자세한 사항은 Forwarders 섹션을 참조하기 바란다.

    Diablo

    LooseUDP 패치를 하거나 TCP 포트 116과 118과 UDP 포트 6112를 게임을 실행하는 컴퓨터로 IP 포워딩(IPPORTFW)해줘야 한다. Diablo의 새로운 버젼은 TCP 포트 6112와 UDP 포트 6112만을 사용한다. 자세한 사항은 Forwarders 섹션을 참조하기 바란다.

    Heavy Gear 2

    LooseUDP 패치를 하거나 TCP 포트 116과 118과 UDP 포트 6112를 게임을 실행하는 컴퓨터로 IP 포워딩(IPPORTFW)해줘야 한다. 자세한 사항은 Forwarders 섹션을 참조하기 바란다.

    Quake I/II/III

    바로 작동하지만, 마스커레이드 서버 뒤쪽에 Quake I/II/III 플레이어가 두 명 이상 있을 때에는ip_masq_quake 모듈이 필요하다. 또,, 이 모듈은 기본적으로는 Quake I과 QuakeWorld만 지원한다. Quake II를 지원하게 하거나 서버에 기본으로 정해진 이외의 포트로 접속하고자 할 때에는, rc.firewall-2.0.x 와rc.firewall-2.2.x 의 모듈 설치 섹션을 참조하라.

    StarCraft

    LooseUDP 패치를 하고 TCP와 UDP의 6112번 포트를 마스커레이딩 내부의 게임을 실행하려는 컴퓨터로 포워딩(IPPORTFW)해주어야 한다. 자세한 사항은 Forwarders 섹션을 참조하기 바란다.

    WorldCraft

    LooseUDP 패치를 하면 동작한다.

    그외의 클라이언트들:

    Linux net-acct package

    Linux, 네트웍 관리-어카운팅 관련 패키지

    NCSA Telnet 2.3.08

    DOS, TELNET, FTP, PING등이 포함된 패키지

    PC-anywhere for Windows

    MS-Windows, TCP/IP를 통해서 원격으로 PC를 제어한다. 특정한 포트를 포워딩하도록 설정하지 않으면, 클라이언트로는 동작하지만 호스트(서버)로는 동작하지 않는다. 자세한 사항은 Forwarders 섹션을 참조하기 바란다.

    Socket Watch

    NTP 사용 - 네트웍 시간조절 프로토콜

    동작하지 않는 클라이언트:

    All H.323 programs

    - MS Netmeeting, Intel Internet Phone Beta 2 - 연결은 되지만 목소리는 한쪽으로만(나가는 쪽) 전달된다. 이를 해결 가능한 방법으로써, Equivalence's PhonePatch H.323 gateway를 참조하기 바란다.

    Intel Streaming Media Viewer Beta 1

    서버에 연결할 수 없다.

    Netscape CoolTalk

    상대편에 연결할 수 없다.

    WebPhone

    현재는 동작하지 않는다. (이 응용프로그램은 IP 주소에 대한 잘못된 가정을 한다.)

    6.4 보안 강도가 보다 높은 IP 방화벽(IPFWADM) 정책

    이 섹션에는 커널 2.0.x에서 사용되는 방화벽 도구인 IPFWADM에 대한 더 심도 있는 안내가 실려 있다. IPCHAINS(2.2.x 용)의 정책들에 대해서는 다음 섹션을 참조한다.

    이 예는 방화벽/마스커레이드 시스템을 고정 주소를 가진 PPP 접속을 통해서 구축하는 것이다.(동적 PPP에 관한 것도 포함되어 있지만 코멘트 처리되어 있다.) 사용된 인터페이스는 192.168.0.1이고, PPP 인터페이스의 IP 주소는 잘못된 사용을 우려해서 실제와 다른 주소로 대체되었다 :) IP 스푸핑(속임)과 부정적인 라우팅이나 마스커레이딩을 검출하기 위해서 들어오고 나가는 인터페이스를 따로 따로 적었다. 명시적으로 허용되지 않은 것은 금지되어 있다 (실제적으로는 거부된다). 여기에 나온 rc.firewall 스크립트를 실행하고 나서 IP 마스커레이드 박스가 죽는다면, 여러분의 상황에 맞도록 편집을 했는지를 확인하고, /var/log/messages나 /var/adm/messages의 시스템 로그화일을 검토한다.

    PPP, 케이블모뎀 등에 대해서 좀더 이해하기 쉬운, "강도 높은 IP 마스커레이딩의 IPFWADM 정책"에 대해서는,TrinityOS - Section 10와 GreatCircle's Firewall WWW page를 참조하기 바란다.

    주의: ISP로부터(PPP, ADSL, 케이블 모뎀 등) 동적 TCP/IP 주소를 받았다면 부팅시에 이 "강도 높은" 정책을 로드할 수 없다. 동적으로 IP 주소를 할당받을 때마다 방화벽 정책화일을 다시 로드하거나, /etc/rc.d/rc.firewall 정책화일을 좀더 지능적으로 만들 필요가 있다. PPP 유저의 경우에는, "Dynamic PPP IP fetch" 부분을 주의 깊게 다시 읽어 보고서 적절한 부분의 코맨트를 해제해 준다. 강도 높은 방화벽 정책들과 동적 IP 주소에 관한 더 자세한 사항은TrinityOS - Section 10 문서를 참조한다.

    또한 몇가지의 GUI 방식의 방화벽 설정 도구가 있다. 자세한 사항은 FAQ 섹션을 참조한다.

    마지막으로, 고정 PPP IP 주소를 사용하고 있다면, "ppp_ip = "your.static.PPP.address"" 라고 되어 있는 줄을 여러분의 IP 주소에 맞게 바꾼다.

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

    #!/bin/sh
    #
    # /etc/rc.d/rc.firewall: An example of a semi-STRONG IPFWADM firewall ruleset
    #
    
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    
    # testing, wait a bit then clear all firewall rules.
    # uncomment following lines if you want the firewall to automatically
    # disable after 10 minutes.
    # (sleep 600; \
    # ipfwadm -I -f; \
    # ipfwadm -I -p accept; \
    # ipfwadm -O -f; \
    # ipfwadm -O -p accept; \
    # ipfwadm -F -f; \
    # ipfwadm -F -p accept; \
    # ) &
    
    # Load all required IP MASQ modules
    #
    #   NOTE:  Only load the IP MASQ modules you need.  All current IP MASQ modules
    #          are shown below but are commented from loading.
    
    # Needed to initially load modules
    #
    /sbin/depmod -a
    
    # Supports the proper masquerading of FTP file transfers using the PORT method
    #
    /sbin/modprobe ip_masq_ftp
    
    # Supports the masquerading of RealAudio over UDP.  Without this module,
    #       RealAudio WILL function but in TCP mode.  This can cause a reduction
    #       in sound quality
    #
    #/sbin/modprobe ip_masq_raudio
    
    # Supports the masquerading of IRC DCC file transfers
    #
    #/sbin/modprobe ip_masq_irc
    
    
    # Supports the masquerading of Quake and QuakeWorld by default.  This modules is
    #   for for multiple users behind the Linux MASQ server.  If you are going to play
    #   Quake I, II, and III, use the second example.
    #
    #Quake I / QuakeWorld (ports 26000 and 27000)
    #/sbin/modprobe ip_masq_quake
    #
    #Quake I/II/III / QuakeWorld (ports 26000, 27000, 27910, 27960)
    #/sbin/modprobe ip_masq_quake ports=26000,27000,27910,27960
    
    
    # Supports the masquerading of the CuSeeme video conferencing software
    #
    #/sbin/modprobe ip_masq_cuseeme
    
    #Supports the masquerading of the VDO-live video conferencing software
    #
    #/sbin/modprobe ip_masq_vdolive
    
    
    #CRITICAL:  Enable IP forwarding since it is disabled by default since
    #
    #           Redhat Users:  you may try changing the options in /etc/sysconfig/network from:
    #
    #                       FORWARD_IPV4=false
    #                             to
    #                       FORWARD_IPV4=true
    #
    echo "1" > /proc/sys/net/ipv4/ip_forward
    
    
    # Dynamic IP users:
    #
    #   If you get your IP address dynamically from SLIP, PPP, or DHCP, enable this following
    #       option.  This enables dynamic-ip address hacking in IP MASQ, making the life
    #       with Diald and similar programs much easier.
    #
    #echo "1" > /proc/sys/net/ipv4/ip_dynaddr
    
    
    # Specify your Static IP address here.
    #
    #   If you have a DYNAMIC IP address, you need to make this ruleset understand your
    #   IP address everytime you get a new IP.  To do this, enable the following one-line
    #   script.  (Please note that the different single and double quote characters MATTER).
    #
    #   You will also need to either create the following link or have your existing
    #   /etc/ppp/ip-up script run the /etc/rc.d/rc.firewall script.
    #
    #       ln -s /etc/rc.d/rc.firewall /etc/ppp/ip-up
    #
    #   If the /etc/ppp/ip-up file already exists, you should edit it and add a line
    #   containing "/etc/rc.d/rc.firewall" near the end of the file.
    #
    #   If you aren't already aware, the /etc/ppp/ip-up script is always run when a PPP
    #   connection comes up.  Because of this, we can make the ruleset go and get the
    #   new PPP IP address and update the strong firewall ruleset.
    #
    #   PPP users:  If your Internet connect is via a PPP connection, the following
                    one-line script will work fine.
    #
    #   DHCP users:  If you get your TCP/IP address via DHCP, you will need to replace
    #                the word "ppp0" with the name of your external Internet connection
    #               (eth0, eth1, etc).  It should be also noted that DHCP can change
    #               IP addresses on you.  To fix this, users should configure their
    #               DHCPc or DHCP client to re-run the firewall ruleset when their
    #               DHCP lease is renewed.  For DHCPcd users, use the "-c" option.
    #
    #ppp_ip = "`/sbin/ifconfig ppp0 | grep 'inet addr' | awk '{print $2}' | sed -e 's/.*://'`"
    #
    ppp_ip = "your.static.PPP.address"
    
    
    # MASQ timeouts
    #
    #   2 hrs timeout for TCP session timeouts
    #  10 sec timeout for traffic after the TCP/IP "FIN" packet is received
    #  60 sec timeout for UDP traffic (MASQ'ed ICQ users must enable a 30sec firewall timeout in ICQ itself)
    #
    /sbin/ipfwadm -M -s 7200 10 60
    
    
    #############################################################################
    # Incoming, flush and set default policy of reject. Actually the default policy
    # is irrelevant because there is a catch all rule with deny and log.
    #
    /sbin/ipfwadm -I -f
    /sbin/ipfwadm -I -p reject
    
    # local interface, local machines, going anywhere is valid
    #
    /sbin/ipfwadm -I -a accept -V 192.168.0.1 -S 192.168.0.0/24 -D 0.0.0.0/0
    
    # remote interface, claiming to be local machines, IP spoofing, get lost
    #
    /sbin/ipfwadm -I -a reject -V $ppp_ip -S 192.168.0.0/24 -D 0.0.0.0/0 -o
    
    # remote interface, any source, going to permanent PPP address is valid
    #
    /sbin/ipfwadm -I -a accept -V $ppp_ip -S 0.0.0.0/0 -D $ppp_ip/32
    
    # loopback interface is valid.
    #
    /sbin/ipfwadm -I -a accept -V 127.0.0.1 -S 0.0.0.0/0 -D 0.0.0.0/0
    
    # catch all rule, all other incoming is denied and logged. pity there is no
    # log option on the policy but this does the job instead.
    #
    /sbin/ipfwadm -I -a reject -S 0.0.0.0/0 -D 0.0.0.0/0 -o
    
    
    #############################################################################
    # Outgoing, flush and set default policy of reject. Actually the default policy
    # is irrelevant because there is a catch all rule with deny and log.
    #
    /sbin/ipfwadm -O -f
    /sbin/ipfwadm -O -p reject
    
    # local interface, any source going to local net is valid
    #
    /sbin/ipfwadm -O -a accept -V 192.168.0.1 -S 0.0.0.0/0 -D 192.168.0.0/24
    
    # outgoing to local net on remote interface, stuffed routing, deny
    #
    /sbin/ipfwadm -O -a reject -V $ppp_ip -S 0.0.0.0/0 -D 192.168.0.0/24 -o
    
    # outgoing from local net on remote interface, stuffed masquerading, deny
    #
    /sbin/ipfwadm -O -a reject -V $ppp_ip -S 192.168.0.0/24 -D 0.0.0.0/0 -o
    
    # outgoing from local net on remote interface, stuffed masquerading, deny
    #
    /sbin/ipfwadm -O -a reject -V $ppp_ip -S 0.0.0.0/0 -D 192.168.0.0/24 -o
    
    # anything else outgoing on remote interface is valid
    #
    /sbin/ipfwadm -O -a accept -V $ppp_ip -S $ppp_ip /32 -D 0.0.0.0/0
    
    # loopback interface is valid.
    #
    /sbin/ipfwadm -O -a accept -V 127.0.0.1 -S 0.0.0.0/0 -D 0.0.0.0/0
    
    # catch all rule, all other outgoing is denied and logged. pity there is no
    # log option on the policy but this does the job instead.
    #
    /sbin/ipfwadm -O -a reject -S 0.0.0.0/0 -D 0.0.0.0/0 -o
    
    
    #############################################################################
    # Forwarding, flush and set default policy of deny. Actually the default policy
    # is irrelevant because there is a catch all rule with deny and log.
    #
    /sbin/ipfwadm -F -f
    /sbin/ipfwadm -F -p deny
    
    # Masquerade from local net on local interface to anywhere.
    #
    /sbin/ipfwadm -F -a masquerade -W ppp0 -S 192.168.0.0/24 -D 0.0.0.0/0
    #
    # catch all rule, all other forwarding is denied and logged. pity there is no
    # log option on the policy but this does the job instead.
    #
    /sbin/ipfwadm -F -a reject -S 0.0.0.0/0 -D 0.0.0.0/0 -o
    

    IPFWADM을 사용하면, 여러분은 -I, -O, -F 등의 옵션을 이용해서 특정 사이트로의 접근을 제한할 수 있다. 각 정책 명령들은 위에서부터 아래로 읽혀지고, "-a" 는 기존의 정책에 "덧붙인다"는 것을 유념한다. 그러므로, 특정한 제한 사항은 전반적인 정책보다 앞에 와야 한다. 예를 들면:

    -I 를 사용하면, 가장 빠르지만 제한 사항은 내부의 컴퓨터들에게만 적용된다. 방화벽 컴퓨터 자체는 여전히 "금지된" 사이트에 접속할 수 있다. 물론 여러분은 이것들을 조합해서 사용할 수도 있다.

    /etc/rc.d/rc.firewall 정책 화일 중에서:

    ... start of -I rules ...
    
    # reject and log local interface, local machines going to 204.50.10.13
    #
    /sbin/ipfwadm -I -a reject -V 192.168.0.1 -S 192.168.0.0/24 -D 204.50.10.13/32 -o
    
    # local interface, local machines, going anywhere is valid
    #
    /sbin/ipfwadm -I -a accept -V 192.168.0.1 -S 192.168.0.0/24 -D 0.0.0.0/0
    
    ... end of -I rules ...
    

    -O 를 사용하면, 패킷들이 마스커레이딩을 먼저 통과하기 때문에 속도는 가장 느리지만, 방화벽 컴퓨터 자체도 금지된 사이트에 접속할 수 없다.

    ... start of -O rules ...
    
    # reject and log outgoing to 204.50.10.13
    #
    /sbin/ipfwadm -O -a reject -V $ppp_ip -S $ppp_ip/32 -D 204.50.10.13/32 -o
    
    # anything else outgoing on remote interface is valid
    #
    /sbin/ipfwadm -O -a accept -V $ppp_ip -S $ppp_ip/32 -D 0.0.0.0/0
    
    ... end of -O rules ...
    

    -F 를 사용하면, -I 를 사용한 것보다는 조금 더 느리고 역시 마스커레이드 되는 (내부의) 컴퓨터들만 제한하고 방화벽 컴퓨터 자체는 금지된 사이트에 접속할 수 있다.

    ... start of -F rules ...
    
    # Reject and log from local net on PPP interface to 204.50.10.13.
    #
    /sbin/ipfwadm -F -a reject -W ppp0 -S 192.168.0.0/24 -D 204.50.10.13/32 -o
    
    # Masquerade from local net on local interface to anywhere.
    #
    /sbin/ipfwadm -F -a masquerade -W ppp0 -S 192.168.0.0/24 -D 0.0.0.0/0
    
    ... end of -F rules ...
    

    192.168.0.0/24가 204.50.11.0로 접속할 수 있도록 허용하기 위해 특별한 정책이 필요하지는 않다. 전반적인 정책에 포함되어 있기 때문이다.

    위의 정책화일에서 인터페이스를 구성하는 방법은 여러가지가 있을 수 있다. 예를 들어서, "-V 192.168.255.1" 대신에 "-W eth0"라고 적을 수 있고, "-V $ppp_ip" 대신에 "-W ppp0"를 사용할 수 있다. "-V" 를 사용하는 것은 IPCHAINS와의 호환을 위해서 사용된 것이고, IPFWADM만을 사용한다면 전적으로 사용자의 선택이다.

    6.5 보안 강도가 보다 높은 IP 방화벽(IPCHAINS) 정책

    이 섹션에는 커널 2.2.x에서 사용되는 방화벽 도구인 IPCHAINS에 대한 더 심도 있는 안내가 실려 있다. IPFWADM(2.0.x 용)의 정책들에 대해서는 이전 섹션을 참조한다.

    이 예는 방화벽/마스커레이드 시스템을 고정 주소를 가진 PPP 접속을 통해서 구축하는 것이다.(동적 PPP에 관한 것도 포함되어 있지만 코멘트 처리되어 있다.) 사용된 인>터페이스는 192.168.0.1이고, PPP 인터페이스의 IP 주소는 잘못된 사용을 우려해서 실제와 다른 주소로 대체되었다 :) IP 스푸핑(속임)과 부정적인 라우팅이나 마스커레이딩을 검출하기 위해서 들어오고 나가는 인터페이스를 따로 따로 적었다. 명시적으로 허용되지 않은 것은 금지되어 있다 (실제적으로는 거부된다). 여기에 나온 rc.firewall 스크립트를 실행하고 나서 IP 마스커레이드 박스가 죽는다면, 여러분의 >상황에 맞도록 편집을 했는지를 확인하고, /var/log/messages나 /var/adm/messages의 시스템 로그화일을 검토한다.

    PPP, 케이블모뎀 등에 대해서 좀더 이해하기 쉬운, "강도 높은 IP 마스커레이딩의 IPFWADM 정책"에 대해서는,TrinityOS - Section 10와 GreatCircle's Firewall WWW page를 참조하기 바란다.

    주의 #1: 2.2.11보다 버젼이 낮은 리눅스 2.2.x 커널은 IPCHAINS fragmentation bug를 가지고 있다. 이 때문에, 강도 높은 IPCHAINS 정책을 사용하면 공격에 노출되게 된다. 버그가 수정된 커널로 업그레이드하기 바란다.

    주의 #2: ISP로부터(PPP, ADSL, 케이블 모뎀 등) 동적 TCP/IP 주소를 받았다면 부팅시에 이 "강도 높은" 정책을 로드할 수 없다. 동적으로 IP 주소를 할당받을 때마다 방화벽 정책화일을 다시 로드하거나, /etc/rc.d/rc.firewall 정책화일을 좀더 지능적으로 만들 필요가 있다. PPP 유저의 경우에는, "Dynamic PPP IP fetch" >부분을 주의 깊게 다시 읽어 보고서 적절한 부분의 코맨트를 해제해 준다. 강도 높은 방화벽 정책들과 동적 IP 주소에 관한 더 자세한 사항은TrinityOS - Section 10 >문서를 참조한다.

    또한 몇가지의 GUI 방식의 방화벽 설정 도구가 있다. 자세한 사항은 FAQ 섹션을 참조한다.

    마지막으로, 고정 PPP IP 주소를 사용하고 있다면, "ppp_ip = "your.static.PPP.address"" 라고 되어 있는 줄을 여러분의 IP 주소에 맞게 바꾼다.

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

    #!/bin/sh
    #
    # /etc/rc.d/rc.firewall: An example of a Semi-Strong IPCHAINS firewall ruleset.
    #
    
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    
    # Load all required IP MASQ modules
    #
    #   NOTE:  Only load the IP MASQ modules you need.  All current IP MASQ modules
    #          are shown below but are commented from loading.
    
    # Needed to initially load modules
    #
    /sbin/depmod -a
    
    # Supports the proper masquerading of FTP file transfers using the PORT method
    #
    /sbin/modprobe ip_masq_ftp
    
    # Supports the masquerading of RealAudio over UDP.  Without this module,
    #       RealAudio WILL function but in TCP mode.  This can cause a reduction
    #       in sound quality
    #
    /sbin/modprobe ip_masq_raudio
    
    # Supports the masquerading of IRC DCC file transfers
    #
    #/sbin/modprobe ip_masq_irc
    
    
    # Supports the masquerading of Quake and QuakeWorld by default.  This modules is
    #   for for multiple users behind the Linux MASQ server.  If you are going to play
    #   Quake I, II, and III, use the second example.
    #
    #Quake I / QuakeWorld (ports 26000 and 27000)
    #/sbin/modprobe ip_masq_quake
    #
    #Quake I/II/III / QuakeWorld (ports 26000, 27000, 27910, 27960)
    #/sbin/modprobe ip_masq_quake ports=26000,27000,27910,27960
    
    
    # Supports the masquerading of the CuSeeme video conferencing software
    #
    #/sbin/modprobe ip_masq_cuseeme
    
    #Supports the masquerading of the VDO-live video conferencing software
    #
    #/sbin/modprobe ip_masq_vdolive
    
    
    #CRITICAL:  Enable IP forwarding since it is disabled by default since
    #
    #           Redhat Users:  you may try changing the options in /etc/sysconfig/network from:
    #
    #                       FORWARD_IPV4=false
    #                             to
    #                       FORWARD_IPV4=true
    #
    echo "1" > /proc/sys/net/ipv4/ip_forward
    
    
    # Get the dynamic IP address assigned via DHCP
    #
    extip="`/sbin/ifconfig eth1 | grep 'inet addr' | awk '{print $2}' | sed -e 's/.*://'`"
    extint="eth1"
    
    # Assign the internal IP
    intint="eth0"
    intnet="192.168.1.0/24"
    
    
    # MASQ timeouts
    #
    #   2 hrs timeout for TCP session timeouts
    #  10 sec timeout for traffic after the TCP/IP "FIN" packet is received
    #  60 sec timeout for UDP traffic (MASQ'ed ICQ users must enable a 30sec firewall timeout in ICQ itself)
    #
    ipchains -M -S 7200 10 60
    
    #############################################################################
    # Incoming, flush and set default policy of reject. Actually the default policy
    # is irrelevant because there is a catch all rule with deny and log.
    #
    ipchains -F input
    ipchains -P input REJECT
    
    # local interface, local machines, going anywhere is valid
    #
    ipchains -A input -i $intint -s $intnet -d 0.0.0.0/0 -j ACCEPT
    
    # remote interface, claiming to be local machines, IP spoofing, get lost
    #
    ipchains -A input -i $extint -s $intnet -d 0.0.0.0/0 -l -j REJECT
    
    # remote interface, any source, going to permanent PPP address is valid
    #
    ipchains -A input -i $extint -s 0.0.0.0/0 -d $extip/32 -j ACCEPT
    
    # loopback interface is valid.
    #
    ipchains -A input -i lo -s 0.0.0.0/0 -d 0.0.0.0/0 -j ACCEPT
    
    # catch all rule, all other incoming is denied and logged. pity there is no
    # log option on the policy but this does the job instead.
    #
    ipchains -A input -s 0.0.0.0/0 -d 0.0.0.0/0 -l -j REJECT
    
    #############################################################################
    # Outgoing, flush and set default policy of reject. Actually the default policy
    # is irrelevant because there is a catch all rule with deny and log.
    #
    ipchains -F output
    ipchains -P output REJECT
    
    # local interface, any source going to local net is valid
    #
    ipchains -A output -i $intint -s 0.0.0.0/0 -d $intnet -j ACCEPT
    
    # outgoing to local net on remote interface, stuffed routing, deny
    #
    ipchains -A output -i $extint -s 0.0.0.0/0 -d $intnet -l -j REJECT
    
    # outgoing from local net on remote interface, stuffed masquerading, deny
    #
    ipchains -A output -i $extint -s $intnet -d 0.0.0.0/0 -l -j REJECT
    
    # anything else outgoing on remote interface is valid
    #
    ipchains -A output -i $extint -s $extip/32 -d 0.0.0.0/0 -j ACCEPT
    
    # loopback interface is valid.
    #
    ipchains -A output -i lo -s 0.0.0.0/0 -d 0.0.0.0/0 -j ACCEPT
    
    # catch all rule, all other outgoing is denied and logged. pity there is no
    # log option on the policy but this does the job instead.
    #
    ipchains -A output -s 0.0.0.0/0 -d 0.0.0.0/0 -l -j REJECT
    
    #############################################################################
    # Forwarding, flush and set default policy of deny. Actually the default policy
    # is irrelevant because there is a catch all rule with deny and log.
    #
    ipchains -F forward
    ipchains -P forward DENY
    
    # Masquerade from local net on local interface to anywhere.
    #
    ipchains -A forward -i $extint -s $intnet -d 0.0.0.0/0 -j MASQ
    #
    # catch all rule, all other forwarding is denied and logged. pity there is no
    # log option on the policy but this does the job instead.
    #
    ipchains -A forward -s 0.0.0.0/0 -d 0.0.0.0/0 -l -j REJECT
    

    IPCHAINS를 사용하면, 여러분은 "input", "output", "forward" 규칙을 통해서 특정 사이트와의 통신을 제한할 수 있다. 각 정책 명령들은 위에서부터 아래로 읽혀지고, "-A" 는 기존의 정책에 "덧붙인다"는 것을 유념한다. 그러므로, 특정한 제한 사항은 전반적인 정책보다 앞에 와야 한다. 예를 들면:

    "input" 규칙: 가장 빠르지만 제한은 내부의 컴퓨터들에게만 적용된다. 방화벽 컴퓨터 자체는 여전히 "금지된" 사이트에 접속할 수 있다. 물론 여러분은 이것들을 조합해서 사용할 수도 있다.

    /etc/rc.d/rc.firewall 정책 화일 중에서:

    ... start of "input" rules ...
    
    # reject and log local interface, local machines going to 204.50.10.13
    #
    /sbin/ipfwadm -I -a reject -V 192.168.0.1 -S 192.168.0.0/24 -D 204.50.10.13/32 -o
    
    # local interface, local machines, going anywhere is valid
    #
    /sbin/ipfwadm -I -a accept -V 192.168.0.1 -S 192.168.0.0/24 -D 0.0.0.0/0
    
    ... end of "input" rules ...
    

    "output"을 사용하면, 패킷들이 마스커레이딩을 먼저 통과하기 때문에 속도는 가장 느리지만, 방화벽 컴퓨터 자체도 금지된 사이트에 접속할 수 없다.

    ... start of "output" rules ...
    
    # reject and log outgoing to 204.50.10.13
    #
    /sbin/ipfwadm -O -a reject -V $ppp_ip -S $ppp_ip/32 -D 204.50.10.13/32 -o
    
    # anything else outgoing on remote interface is valid
    #
    /sbin/ipfwadm -O -a accept -V $ppp_ip -S $ppp_ip/32 -D 0.0.0.0/0
    
    ... end of "output" rules ...
    

    "forward"를 사용하면, "input"을 사용한 것보다는 조금 더 느리고 역시 마스커레이드 되는 (내부의) 컴퓨터들만 제한하고 방화벽 컴퓨터 자체는 금지된 사이트에 접속할 수 있다.

    ... start of "forward" rules ...
    
    # Reject and log from local net on PPP interface to 204.50.10.13.
    #
    /sbin/ipfwadm -F -a reject -W ppp0 -S 192.168.0.0/24 -D 204.50.10.13/32 -o
    
    # Masquerade from local net on local interface to anywhere.
    #
    /sbin/ipfwadm -F -a masquerade -W ppp0 -S 192.168.0.0/24 -D 0.0.0.0/0
    
    ... end of "forward" rules ...
    

    192.168.0.0/24가 204.50.11.0로 접속할 수 있도록 허용하기 위해 특별한 정책이 필요하지는 않다. 전반적인 정책에 포함되어 있기 때문이다.

    IPFWADM와는 다르게, 위의 정책화일에서 인터페이스를 구성하는 방법은 오직 한가지 뿐이다. IPCHAINS는 "-i eth0" 옵션을 사용한다. "-V"는 IPFWADM의 방법으로 IPCHAINS와의 호환을 위해서 사용된 것이고, IPFWADM만을 사용한다면 전적으로 사용자의 선택이다.

    6.6 여러개의 내부 네트웍을 IP 마스커레이딩하는 법

    여러개의 내부 네트웍을 마스커레이딩하는 것이 매우 간단하다. 우선 내부와 외부의 모든 네트웍이 제대로 동작하는지 확인해야 한다. 그런 후에 네트웍 트래픽이 내부의 다른 컴퓨터들에게도 전달되고 인터넷으로 마스커레이딩되도록 만들어야 한다.

    다음으로, 내부의 인터페이스에 마스커레이딩을 사용가능하도록 해줘야 한다. 이 예는 eth1 (192.168.0.1)와 eth2 (192.168.1.1)의 두개의 내부 인터페이스가 외부로 향하는 eth0 인터페이스로 마스커레이딩되도록 설정하는 것이다. rc.firewall 정책화일에 다음 내용을 추가한다:

    • IPFWADM을 사용하는 2.0.x 커널용
        #Enable internal interfaces to communication between each other
        /sbin/ipfwadm -F -a accept -V 192.168.0.1 -D 192.168.1.0/24
        /sbin/ipfwadm -F -a accept -V 192.168.1.1 -D 192.168.0.0/24
      
        #Enable internal interfaces to MASQ out to the Internet
        /sbin/ipfwadm -F -a masq -W eth0 -S 192.168.0.0/24 -D 0.0.0.0/0
        /sbin/ipfwadm -F -a masq -W eth0 -S 192.168.1.0/24 -D 0.0.0.0/0
      

    • IPCHAINS를 사용하는 2.2.x 커널용
        #Enable internal interfaces to communication between each other
        /sbin/ipchains -A forward -i eth1 -d 192.168.1.0/24
        /sbin/ipchains -A forward -i eth2 -d 192.168.0.0/24
      
        #Enable internal interfaces to MASQ out to the Internet
        /sbin/ipchains -A forward -j MASQ -i eth0 -s 192.168.0.0/24 -d 0.0.0.0/0
        /sbin/ipchains -A forward -j MASQ -i eth0 -s 192.168.1.0/24 -d 0.0.0.0/0
      

    6.7 IP 마스커레이드와 전화 접속

    1. 인터넷에 연결하기 위해서 자동으로 전화 접속을 하도록 설정하고자 한다면, Diald를 사용한 전화걸기나PPPd의 새 버젼을 사용하는 것이 좋을 것이다. 구성이 더 나은 Diald를 사용하는 것을 권장한다.

    2. Diald를 설정하기 위해서는, Setting Up Diald for Linux Page나 TrinityOS - Section 23를 살펴보기 바란다.

    3. 일단 Diald와 IP 마스커레이딩이 제대로 설정되고 나면, 마스커레이드되는 클라이언트들이 웹이나 telnet, ftp등의 접속을 하려고 하면 리눅스 box가 자동으로 인터넷 연결을 할 것이다.

    4. 처음 접속 때는 시간 초과가 있을 수도 있는데, 아날로그 모뎀을 사용한다면 어쩔 수 없다. 모뎀 자체의 접속과 PPP 접속을 위한 시간 때문에, 클라이언트 프로그램들(웹 브라우저 등)이 시간 초과를 일으킬 수 있다. 하지만 늘 그런 것은 아니다. 만약 이런 현상이 일어나면, 단지 재시도(이를테면, 웹 페이지를 다시 보기)를 하면 그 다음부터는 잘 동작할 것이다. 또는, echo "1" > /proc/sys/net/ipv4/ip_dynaddr라고 커널에 옵션을 주어서 이러한 초기 설정에 관한 것을 해결할 수도 있다.

    6.8 IPPORTFW, IPMASQADM, IPAUTOFW, REDIR, UDPRED 등과 기타의 포트 포워딩 도구들

    IPPORTFW, IPAUTOFW, REDIR, UDPRED 등과 기타 다른 프로그램들은 리눅스 IP 마스커레이드를 위한 일반적은 TCP또는 UDP 포트 포워딩 도구들이다. 이러한 도구들은 일반적으로, 현재의 FTP, Quake 등을 위한 특정한 IP 마스커레이드 모듈들과 함께 사용되거나 대체해서 사용된다. 포트 포워딩 도구들을 사용하면, 인터넷으로부터 오는 접속들을, IP 마스커레이딩 뒤에서 내부 주소만 가지고 있는 컴퓨터로 전달해 줄 수 있다. 이러한 포워딩 기능은 TELNET, WWW, SMTP, FTP (특별한 패치를 필요로 한다 - 아래를 볼 것), ICQ 와 다른 많은 네트웍 프로토콜들을 처리할 수 있다.

    주의: 만약 IP 마스커레이딩 없이 단지 포트 포워딩만을 하길 원한다 해도, 여전히 커널과 IPFWADM나 IPCHAINS 정책 내에 IP 마스커레이딩 기능을 추가하고서 리눅스의 포트 포워딩 도구들을 사용해야 한다.

    그러면 이것들의 차이는 무엇인가? IPAUTOFW, REDIR와 UDPRED(모든 URL들은 2.0.x-Requirements 섹션에 있다)등은 IP 마스커레이드 사용자가 이 기능을 사용하기 위해서 필요한 초기의 도구들이었다. 시간이 흐르고, 리눅스 IP 마스커레이드가 발전하면서, 이 도구들은 더 지능적인 해결책인 IPPORTFW로 대체되었다. 새로운 도구들을 사용가능하게 되었기 때문에, IPQUTOFW와 REDIR와 같은 예전의 도구들을 사용하는 것은 *매우 바람직하지 않다*. 이들은 커널과 함께 제대로 동작하지 못하거나 심지어 여러분의 리눅스 서버를 파괴할 수도 있다.

    2.0.x 버젼의 IPPORTFW나 2.2.x 버젼의 IPMASQADM을 IPPORTFW와 함께 사용하기 전에, 다른 포트 포워딩 도구들을 사용하면 네트웍 보안 문제를 일으킬 수 있다. 그 이유는 이러한 도구들은 TCP/UDP 포트를 포워딩하기 위해서 기본적으로 패킷 방화벽에 구멍을 만들기 때문이다. 이것이 리눅스 머신에 위협을 주지는 않지만, 패킷이 포워딩되는 내부의 컴퓨터에게는 문제가 될 수도 있다. 큰 문제는 아니지만, IPPORTFW의 제작자인 Steven Clarke은 다음과 같이 말한다:

            "해당하는 IPFWADM/IPCHAINS 정책에 들어맞도록, 포트 포워딩은 
            마스커레이딩 함수에서만 불려진다. 마스커레이딩은 IP 포워딩으로 
            확장된다. 그래서, ipportfw는 입력과 ipfwadm 정책 모두에 들어맞는 
            패킷만을 볼 수 있다."
    

    이러한 이유로, 강력한 방화벽 정책을 사용하는 것이 중요하다. 강력한 방화벽 정책에 대한 자세한 것은 Strong-IPFWADM-Rulesets 과 Strong-IPCHAINS-Rulesets 섹션을 참조하기 바란다.

    이제, IPPORTFW 포워딩을 2.0.x나 2.2.x 커널에 사용하기 위해서는, 리눅스 커널이 IPPORTFW를 지원하도록 재컴파일해야 한다.

    • 2.0.x 커널 사용자들은 아래와 같은 간단한 커널 옵션 패치를 해야 한다.
    • 2.2.x 커널 사용자들은 IPMASQADM을 통해서 이미 IPPORTFW 커널 옵션을 사용할 수 있을 것이다.

    2.0.x 커널에서 IPPORTFW 사용

    우선, /usr/src/linux 디렉토리에 가장 최신의 2.0.x 커널이 존재하는지 확인한다. 만약 없다면, Kernel-Compile 섹션에서 자세한 사항을 참조한다. 다음으로, 2.0.x-Requirements 섹션에서 "ipportfw.c" 프로그램과 "subs-patch-x.gz" 커널 패치를 다운로드해서 /usr/src/ 디렉토리에 압축을 푼다.

    주의: "subs-patch-x.gz"의 화일명에서 "x"는 그 사이트에서 구할 수 있는 가장 최신의 버젼으로 대치한다.

    이제, IPPORTFW 패치(subs-patch-x.gz)를 리눅스 디렉토리로 복사한다.

            cp /usr/src/subs-patch-1.37.gz /usr/src/linux
    

    다음에, IPPORTFW 커널 옵션을 생성하기 위해서 커널 패치를 한다:

            cd /usr/src/linux
            zcat subs-patch-1.3x.gz | patch -p1
    

    다음으로, FTP 접속을 내부의 서버로 포트 포워딩하고자 한다면, 2.0.x-Requirements 섹션에서 구할 수 있는 새로운IP_MASQ_FTP 모듈 패치를 해야 한다. 자세한 사항은 이 섹션의 나중 부분에 나와 있다.

    자, Kernel-Compile 섹션에 있는 것처럼 커널을 컴파일할 차례이다. 커널을 설정하는 단계에서 IPPORTFW 옵션에 YES라고 하도록 한다. 일단 컴파일이 끝나고 새로운 커널로 리부트하고 나면, 다시 이 섹션으로 돌아온다.

    이제 새로 컴파일한 커널을 사용해서, 실제의 "IPPORTFW" 프로그램을 컴파일하고 설치한다.

            cd /usr/src
            gcc ipportfw.c -o ipportfw
            mv ipportfw /usr/local/sbin
    

    이제, 예를 들어서 모든 웹 접속(포트 80)을 마스커레이드되는 내부의 머신 중에서 192.168.0.10을 주소로 같은 머신으로 포워드하려 한다고 하자.

    주의: 일단 포트 80을 포트 포워딩하면, 리눅스 IP 마스커레이드 서버는 그 포트를 더이상 사용하지 못한다. 더 구체적으로, 만약 여러분이 마스커레이드 서버에 이미 웹 서버를 운영하고 있고 포트 80을 내부의 마스커레이드되는 컴퓨터로 포트 포워딩한다면, 모든 인터넷 사용자들은 IP 마스커레이드 서버에서 보내는 페이지가 아닌 -내부의- 웹 서버에서 보내는 페이지를 볼 것이다. 이를 해결하기 위한 유일한 방법은 예를 들어 8080과 같은 다른 포트를 내부의 마스커레이드되는 머신으로 포트 포워딩하는 것이다. 이렇게 하면 되긴 하지만, 모든 인터넷 사용자들은 내부의 마스커레이드되는 웹 서버에 접속하기 위해서 URL에 :8080을 덧붙여야 한다.

    어쨌든, 포트 포워딩을 사용하기 위해서는, /etc/rc.d/rc.firewall 정책화일을 편집한다. 다음에 있는 내용을 추가하되, "$extip"는 여러분의 인터넷 IP 주소로 대치한다.

    주의: 만약 여러분이 ISP 로부터(PPP, ADSL, 케이블 모뎀, 기타 등등) 동적 TCP/IP 주소를 받아서 사용한다면, /etc/rc.d/rc.firewall 정책화일을 더 지능적으로 만들어야 할 것이다. 강력한 정책들과 동적 IP 주소에 관한 자세한 사항은 TrinityOS - Section 10을 참조하기 바란다.

            /etc/rc.d/rc.firewall
            --
    
            #echo "Enabling IPPORTFW Redirection on the external LAN.."
            #
            /usr/local/sbin/ipportfw -C
            /usr/local/sbin/ipportfw -A -t$extip/80 -R 192.168.0.10/80
    
            --
    

    자 이제 됐다! /etc/rc.d/rc.firewall 정책화일을 다시 실행시키고 시험해 보자!

    만약에 "ipfwadm: setsockopt failed: Protocol not available" 라는 에러 메시지를 보게 된다면, 새로 컴파일한 커널을 사용하고 있지 않는 것이다. 새로운 커널을 제대로 된 위치에 옮겨 놓았는지, LILO를 재 실행했는지 확인하고 다시 한번 리부트한다.

    FTP 서버의 포트 포워딩:

    FTP를 내부의 머신으로 포트 포워딩하고자 한다면, 일이 좀 더 복잡해진다. 그 이유는 표준의 IP_MASQ_FTP 커널 모듈이 이러한 목적으로 만들어져 있지 않기 때문이다. 다행히 Fred Viles가 이러한 목적으로 동작하도록 수정된 IP_MASQ_FTP 모듈을 작성했다. 정확히 무엇이 문제인지 알고 싶다면, Fred가 문서를 매우 잘 작성해 놓았으니 그것을 다운로드해 보기 바란다. 이 패치는 다소 실험적인 면이 있다는 것도 알아두기 바란다. 또한 현재 이 패치는 2.0.x 커널용에서만 사용할 수 있다는 것도 알아두기 바란다. 2.2.x 커널로의 포팅도 어느 정도 이루어져 있지만, 여기에 도움을 주고 싶다면 Fred Viles - fv@episupport.com로 직접 이메일을 보내기 바란다.

    이제 다음 과정을 거쳐서 2.0.x 패치를 한다:

    • 우선 이 섹션의 앞 부분에 있는 것과 같이 IPPORTFW 커널 패치를 가한다.

    • 2.0.x-Requirements 섹션에 수록된 Fred Viles의 FTP 서버에서 "msqsrv-patch-36"를 다운로드하고 /usr/src/linux에 넣는다.

    • "cat msqsrv-patch-36 | patch -p1"라고 명령해서 이 새로운 코드로 커널을 패치한다.

    • 이제, 원래의 "ip_masq_ftp.c" 커널 모듈을 새로운 것으로 대체한다.

      • mv /usr/src/linux/net/ipv4/ip_masq_ftp.c /usr/src/linux/net/ipv4/ip_masq_ftp.c.orig
      • mv /usr/src/linux/ip_masq_ftp.c /usr/src/linux/net/ipv4/ip_masq_ftp.c

    • 마지막으로 새로운 코드가 적용된 커널을 생성해서 인스톨한다.

    다 됐으면, /etc/rc.d/rc.firewall 정책화일을 편집해서 다음 내용을 추가하되 "$extip"는 여러분의 인터넷 IP 주소로 대치한다.

    주의: 만약 여러분이 ISP 로부터(PPP, ADSL, 케이블 모뎀, 기타 등등) 동적 TCP/IP 주소를 받아서 사용한다면, /etc/rc.d/rc.firewall 정책화일을 더 지능적으로 만들어야 할 것이다. 강력한 정책들과 동적 IP 주소에 관한 자세한 사항은 TrinityOS - Section 10을 참조하기 바란다.

    이 예는 위에서와 같이 모든 FTP 접속(포트 21)을 내부의 마스커레이드되는 머신 중 192.168.0.10의 주소를 갖는 머신으로 포트 포워딩할 것이다.

    주의: 일단 포트 21을 포트 포워딩하면, 리눅스 마스커레이드 서버는 그 포트를 더 이상 사용하지 못할 것이다. 더 구체적으로, 만약 리눅스 마스커레이드 서버에 이미 FTP 서버를 운영하고 있다면, 모든 인터넷 사용자의 FTP 접속은 IP 마스커레이드 서버가 아니라 -내부의- FTP 서버로 갈 것이다.

            /etc/rc.d/rc.firewall
            --
    
            #echo "Enabling IPPORTFW Redirection on the external LAN.."
            #
            /usr/local/sbin/ipportfw -C
            /usr/local/sbin/ipportfw -A -t$extip/21 -R 192.168.0.10/21
    
            --
    

    자 이제 됐다! /etc/rc.d/rc.firewall 정책화일을 다시 실행시키고 시험해 보자!

    만약에 "ipchains: setsockopt failed: Protocol not available" 라는 에러 메시지를 보게 된다면, 새로 컴파일한 커널을 사용하고 있지 않는 것이다. 새로운 커널을 제대로 된 위치에 옮겨 놓았는지, LILO를 재 실행했는지 확인하고 다시 한번 리부트한다. 새로운 커널을 사용하고 있는 것이 확실하다면, "ls /proc/net"이라고 명령해서 "ip_portfw" 화일이 있는지 확인한다. 없다면, 커널을 설정하는 단계에서 무엇인가 빠트렸을 것이다. 커널을 다시 만든다.

    2.2.x 커널에서 IPPORTFW와 함께 IPMASQADM 사용

    우선, /usr/src/linux 디렉토리에 최신의 2.2.x 커널이 있는지 확인한다. 없다면, Kernel-Compile 섹션에서 자세한 사항을 참조한다. 다음으로, 2.2.x-Requirements 섹션에서 "ipmasqadm.c" 프로그램을 다운로드해서 /usr/src/ 디렉토리에 넣는다.

    다음으로, Kernel-Compile 섹션에 있는 것과 같이 2.2.x 커널을 컴파일해야 한다. 커널을 설정하는 단계에서 IPPORTFW 옵션에 YES 라고 한다. 일단 커널을 컴파일해서 리부트한 후에 이 섹션으로 돌아온다.

    이제, IPMASQADM 도구를 컴파일하고 설치한다:

            cd /usr/src
            tar xzvf ipmasqadm-x.tgz
            cd ipmasqadm-x
            make
            make install
    

    이제, 예를 들어서 모든 웹 접속(포트 80)을 내부의 마스커레이드되는 머신중에서 192.168.0.10을 주소로 갖는 머신으로 포트 포워딩한다고 하자.

    주의: FTP 접속을 포트 포워딩하기 위해서 수정된 IP_MASQ_FTP 모듈이 현재로는 2.2.x 커널에서 동작하지 않을 지도 모른다. 하지만 이를 시험해 보고 싶다면, 이 모듈을 2.2.x 커널용으로 포팅해 보라. 그리고 Ambrose 와 David에게 여러분의 결과물을 메일로 보내 주기 바란다.

    주의: 일단 포트 80을 포트 포워딩하고 나면, 리눅스 IP 마스커레이드 서버는 그 포트를 사용하지 못한다. 더 구체적으로, 만약 마스커레이드 서버에 이미 웹 서버를 운영하고 있다면, 모든 인터넷 사용자들은 여러분의 IP 마스커레이드 서버가 아닌 -내부의- 웹 서버에서 웹 페이지를 받아 볼 것이다.

    어쨌든, 포트 포워딩을 하기 위해서는 /etc/rc.d/rc.firewall 정책 화일을 편집한다. 다음의 내용을 추가하되, "$extip"를 여러분의 인터넷 IP 주소로 대치한다.

    주의: 만약 ISP로부터(PPP, ADSL, 케이블 모뎀, 기타 등등) 동적 TCP/IP 주소를 받아서 사용하고 있다면, /etc/rc.d/rc.firewall 정책화일을 좀더 지능적으로 만들 필요가 있다. 강력한 방화벽 정책과 동적 IP 주소에 관한 자세한 사항에 대해서는 TrinityOS - Section 10을 참조하기 바란다. 여기에 힌트를 한가지 제공한다: PPP 사용자들을 위한 /etc/ppp/ip-up 화일.

            /etc/rc.d/rc.firewall
            --
    
            #echo "Enabling IPPORTFW Redirection on the external LAN.."
            #
            /usr/sbin/ipmasqadm portfw -f
            /usr/sbin/ipmasqadm portfw -a -P tcp -L $extip 80 -R 192.168.0.10 80
    
            --
    

    자 이제 됐다! /etc/rc.d/rc.firewall 정책화일을 다시 실행시키고 시험해 보자!

    만약에 "ipchains: setsockopt failed: Protocol not available" 라는 에러 메시지를 보게 된다면, 새로 컴파일한 커널을 사용하고 있지 않는 것이다. 새로운 커널을 제대로 된 위치에 옮겨 놓았는지, LILO를 재 실행했는지 확인하고 다시 한번 리부트한다. 새로운 커널을 사용하고 있는 것이 확실하다면, "ls /proc/net/ip_masq"라고 명령해서 "portfw" 화일이 있는지 확인한다. 없다면, 커널을 설정하는 단계에서 무엇인가 빠트렸을 것이다. 커널을 다시 만든다.

    6.9 CU-SeeMe와 리눅스 IP 마스커레이드

    리눅스 IP 마스커레이드는 "ip_masq_cuseeme" 커널 모듈을 통해서 CuSeeme를 지원한다. 이 커널 모듈은 /etc/rc.d/rc.firewall 스크립트에서 메모리에 적재되어야 한다. 일단 "ip_masq_cuseeme" 모듈일 설치되면, 원격의 reflector들이나 사용자들에게 접속 신호를 보내거나 접속을 받아들일 수 있게 된다.

    주의: CuSeeme를 사용하기 위해서는 예전의 IPAUTOFW 도구 대신에 IPPORTFW 도구를 사용할 것을 권장한다.

    CuSeeme를 설정하는 데 있어서 더 확실한 정보가 필요하다면, Michael Owings's CuSeeMe page에서 미니-하우투를 보거나 The IP Masquerade Resources에서 미니-하우투의 미러 페이지를 볼 수 있을 것이다.

    6.10 Mirabilis ICQ

    리눅스 마스커레이드 서버의 뒤에서 ICQ를 사용하는 방법은 두가지가 있다. 한가지 방법은 새로운 ICQ 마스커레이드 모듈을 사용하는 것이고, 다른 한가지는 IPPORTFW를 사용하는 것이다.

    ICQ 모듈은 몇가지 이득과 함께 제한도 있다. 이 모듈은 간단한 설정으로 마스커레이드 서버 뒤에서 여러명이 ICQ를 사용할 수 있게 한다. ICQ 클라이언트에서 특별한 설정을 필요로 하지도 않는다. 그러나, 현재는 화일 전송과 실시간 채팅이 되지 않는다.

    IPPORTFW를 설정해서 사용하면, 마스커레이드 서버와 ICQ 클라이언트 모두에 몇가지 설정을 변경시켜줘야 하지만, ICQ의 메시지 기능, URL 기능, 채팅, 화일 전송 등 모든 것이 동작할 것이다.

    Andrew Deryabin의 djsf@usa.net 2.2.x 커널을 위한 ICQ IP 마스커레이드 모듈에 관심이 있다면, 2.2.x-Requirements 섹션에서 자세한 사항을 확인하기 바란다.

    마스커레이드 서버 뒤에서 ICQ를 사용하기 위해 다소 고전적인 방법을 쓰길 원한다면 다음과 같이 한다:

    • 우선, 리눅스 커널에 IPPORTFW 기능을 포함시킨다. 자세한 사항은 Forwarders 섹션을 참조한다.

      • 다음으로, 다음의 내용을 /etc/rc.d/rc.firewall 화일에 추가한다. 이 예는 외부로 통하는 여러분의 인터넷 IP 주소를 10.1.2.3으로, 내부의 마스커레이드되는 ICQ 클라이언트를 192.168.0.10으로 가정했다:

        IPFWADM을 사용하는 2.0.x 커널의 예:

          두가지 예를 포함시켰다: 어떤 것이든 잘 동작할 것이다:
        
          예 #1
          --
          /usr/local/sbin/ipportfw -A -t10.1.2.3/2000 -R 192.168.0.10/2000
          /usr/local/sbin/ipportfw -A -t10.1.2.3/2001 -R 192.168.0.10/2001
          /usr/local/sbin/ipportfw -A -t10.1.2.3/2002 -R 192.168.0.10/2002
          /usr/local/sbin/ipportfw -A -t10.1.2.3/2003 -R 192.168.0.10/2003
          /usr/local/sbin/ipportfw -A -t10.1.2.3/2004 -R 192.168.0.10/2004
          /usr/local/sbin/ipportfw -A -t10.1.2.3/2005 -R 192.168.0.10/2005
          /usr/local/sbin/ipportfw -A -t10.1.2.3/2006 -R 192.168.0.10/2006
          /usr/local/sbin/ipportfw -A -t10.1.2.3/2007 -R 192.168.0.10/2007
          /usr/local/sbin/ipportfw -A -t10.1.2.3/2008 -R 192.168.0.10/2008
          /usr/local/sbin/ipportfw -A -t10.1.2.3/2009 -R 192.168.0.10/2009
          /usr/local/sbin/ipportfw -A -t10.1.2.3/2010 -R 192.168.0.10/2010
          /usr/local/sbin/ipportfw -A -t10.1.2.3/2011 -R 192.168.0.10/2011
          /usr/local/sbin/ipportfw -A -t10.1.2.3/2012 -R 192.168.0.10/2012
          /usr/local/sbin/ipportfw -A -t10.1.2.3/2013 -R 192.168.0.10/2013
          /usr/local/sbin/ipportfw -A -t10.1.2.3/2014 -R 192.168.0.10/2014
          /usr/local/sbin/ipportfw -A -t10.1.2.3/2015 -R 192.168.0.10/2015
          /usr/local/sbin/ipportfw -A -t10.1.2.3/2016 -R 192.168.0.10/2016
          /usr/local/sbin/ipportfw -A -t10.1.2.3/2017 -R 192.168.0.10/2017
          /usr/local/sbin/ipportfw -A -t10.1.2.3/2018 -R 192.168.0.10/2018
          /usr/local/sbin/ipportfw -A -t10.1.2.3/2019 -R 192.168.0.10/2019
          /usr/local/sbin/ipportfw -A -t10.1.2.3/2020 -R 192.168.0.10/2020
          --
        
          예 #2
          --
          port=2000
          while [ $port -lt 2020 ]
            do
                /usr/local/sbin/ipportfw -A t10.1.2.3/$port -R 192.168.0.10/$port
                port=$((port+1)
            done
          --
        
          
        

        IPCHAINS를 사용하는 2.2.x 커널의 예:

          두가지 예를 포함시켰다: 어떤 것이든 잘 동작할 것이다:
        
          예 #1
          --
          /usr/local/sbin/ipmasqadm portfw -a -P tcp -L 10.1.2.3 2000 -R 192.168.0.10 2000
          /usr/local/sbin/ipmasqadm portfw -a -P tcp -L 10.1.2.3 2001 -R 192.168.0.10 2001
          /usr/local/sbin/ipmasqadm portfw -a -P tcp -L 10.1.2.3 2002 -R 192.168.0.10 2002
          /usr/local/sbin/ipmasqadm portfw -a -P tcp -L 10.1.2.3 2003 -R 192.168.0.10 2003
          /usr/local/sbin/ipmasqadm portfw -a -P tcp -L 10.1.2.3 2004 -R 192.168.0.10 2004
          /usr/local/sbin/ipmasqadm portfw -a -P tcp -L 10.1.2.3 2005 -R 192.168.0.10 2005
          /usr/local/sbin/ipmasqadm portfw -a -P tcp -L 10.1.2.3 2006 -R 192.168.0.10 2006
          /usr/local/sbin/ipmasqadm portfw -a -P tcp -L 10.1.2.3 2007 -R 192.168.0.10 2007
          /usr/local/sbin/ipmasqadm portfw -a -P tcp -L 10.1.2.3 2008 -R 192.168.0.10 2008
          /usr/local/sbin/ipmasqadm portfw -a -P tcp -L 10.1.2.3 2009 -R 192.168.0.10 2009
          /usr/local/sbin/ipmasqadm portfw -a -P tcp -L 10.1.2.3 2010 -R 192.168.0.10 2010
          /usr/local/sbin/ipmasqadm portfw -a -P tcp -L 10.1.2.3 2011 -R 192.168.0.10 2011
          /usr/local/sbin/ipmasqadm portfw -a -P tcp -L 10.1.2.3 2012 -R 192.168.0.10 2012
          /usr/local/sbin/ipmasqadm portfw -a -P tcp -L 10.1.2.3 2013 -R 192.168.0.10 2013
          /usr/local/sbin/ipmasqadm portfw -a -P tcp -L 10.1.2.3 2014 -R 192.168.0.10 2014
          /usr/local/sbin/ipmasqadm portfw -a -P tcp -L 10.1.2.3 2015 -R 192.168.0.10 2015
          /usr/local/sbin/ipmasqadm portfw -a -P tcp -L 10.1.2.3 2016 -R 192.168.0.10 2016
          /usr/local/sbin/ipmasqadm portfw -a -P tcp -L 10.1.2.3 2017 -R 192.168.0.10 2017
          /usr/local/sbin/ipmasqadm portfw -a -P tcp -L 10.1.2.3 2018 -R 192.168.0.10 2018
          /usr/local/sbin/ipmasqadm portfw -a -P tcp -L 10.1.2.3 2019 -R 192.168.0.10 2019
          /usr/local/sbin/ipmasqadm portfw -a -P tcp -L 10.1.2.3 2020 -R 192.168.0.10 2020
          --
        
          예 #2
          --
          port=2000
          while [ $port -lt 2020 ]
            do
                /usr/local/sbin/ipmasqadm portfw -a -P tcp -L 10.1.2.3 $port -R 192.168.0.10 $port
                port=$((port+1)
            done
          --
          
        

      • 새로운 rc.firewall이 준비되면, 간단히 "/etc/rc.d/rc.firewall"라고 명령해서 정책을 다시 로드하고 제대로 되는지 확인한다. 만약 에러가 난다면, 커널에 IPPORTFW 지원을 포함시키지 않았거나 rc.firewall 화일에서 오타가 났을 것이다.

      • 이제, ICQ의 Preferences(설정)-->Connection(접속)에서, "Behind a LAN(LAN을 통해서 접속)"과 "Behind a firewall or Proxy(방화벽이나 프록시를 통해서 접속)"을 설정한다. 이제, "Firewall Settings(방화벽 설정)"을 클릭하고 "I don't use a SOCK5 proxy(SOCK5 프록시를 사용하지 않음)"로 설정한다. 예전에는 ICQ의 "Firewall session timeouts(방화벽 접속 제한시간)"을 "30"초로 하는 것을 권장했지만, ICQ가 불안정해짐이 알려졌다. stock timeout setting을 선택하고 단순히 마스커레이드 서버의 제한시간을 160초로 변경하면 ICQ가 더 안정적이 된다는 것이 알려졌다. 이 제한시간을 변경하는 법은 rc.firewall-2.0.x 과 rc.firewall-2.2.x 정책에서 확인할 수 있다. 마지막으로, Next를 클릭하고 "Use the following TCP listen ports..(다음의 TCP 포트를 확인..)"부분을 "2000"에서 "2020"으로 설정한다. 이제 "완료"를 클릭한다.

        이제 ICQ가 변경사항을 반영하기 위해 ICQ를 재시작할 것을 요구할 것이다. 사실은, 필자는 모든 것이 제대로 되도록 하기 위해서는 Windows9x를 리부트해야만 했지만 다른 사람들은 다르게 말한다. 그러니 안전하게 하려면 두가지를 모두 해 본다(ICQ 재시작, 리부트)

    • 아울러 알리고 싶은 것은, 어떤 사용자는 단순히 포트 4000을 그의 ICQ 클라이언트로 포트 포워딩하는 것이 가장 잘 동작한다고 말했다. 그는 ICQ를 기본설정에서 변경하지 않고도 모든 것이(채팅, 화일 전송, 기타 등등) 잘 동작했다고 했다. 이 문제는 여러분이 선택할 문제이지만, 이러한 의견에 대해서도 알고 싶어하는 사람이 있을 것이다.

    6.11 게임: LooseUDP 패치

    LooseUDP 패치는, 일반적으로 리눅스 IP 마스커레이드 서버 뒤에서 동작하면서 UDP 접속을 사용하는, NAT와 잘 동작하는 게임들을 할 수 있도록 해 준다. 현재, LooseUDP는 2.0.36이상의 커널에 패치로서 제공되고 2.2.3이상의 커널에는 이미 자체 포함되어 있다. 이를 사용하기 위해서는, 몇가지 일만 해주면 된다:

    • /usr/src/linux 디렉토리에 최신의 2.0.x 커널 소스가 들어 있는지 확인한다.

    • 버젼 2.0.x에서는 절대적으로 필요한 것: 2.0.x-Requirements 섹션에서 IPPORTFW 패치를 다운로드 하고 이 하우투의 Forwarders 섹션에 설명된 대로 설치한다.

    • 2.0.x-Requirements 섹션에서 LooseUDP 패치를 다운로드한다.

    이제, LooseUDP 패치를 /usr/src/linux 디렉토리에 넣는다. 그 다음에 다음과 같이 명령한다:

    압축된 패치 화일일 때: zcat loose-udp-2.0.36.patch.gz | patch -p1

    압축되지 않는 패치 화일일 때: cat loose-udp-2.0.36.patch | patch -p1

    이제, "patch" 프로그램의 버젼에 따라서, 다음과 같은 메시지를 볼 것이다:

    patching file `CREDITS'
    patching file `Documentation/Configure.help'
    patching file `include/net/ip_masq.h'
    patching file `net/ipv4/Config.in'
    patching file `net/ipv4/ip_masq.c'
    

    패치의 제일 처음에서만 "Hunk FAILED"라는 메시지를 보게 된다면, 심각한 문제는 아니다. 아마도 오래된 패치 화일일 테지만 동작할 것이다. 하지만 만약 패치가 완전히 실패한다면, IPPORTFW 커널 패치를 "먼저" 적용했는지 확인해 본다.

    패치가 설치되면, Kernel-Compile 섹션에 나와 있는 대로 커널을 재구성하고 "IP: loose UDP port managing (EXPERIMENTAL) (CONFIG_IP_MASQ_LOOSE_UDP) [Y/n/?]" 옵션에서 "Y"라고 한다.

    일단 LooseUDP 기능이 추가된 새 커널을 사용하면, NAT와 잘 동작하는 게임들은 잘 동작할 것이다. BattleZone이나 다른 게임들을 NAT와 잘 동작하도록 해 주는 패치들을 구할 수 있는 몇가지 URL들이 있다. 자세한 사항은 Game-Clients 섹션을 참조한다.

    7. 자주 묻는 질문들(FAQ)

    유용한 FAQ가 있다면, ambrose@writeme.com과 dranch@trinnet.net으로 보내주기 바란다. 질문을 명확하게 표시하고 적절한 답변을 달아주기 바란다. 미리 감사드린다!

    7.1 IP 마스커레이드를 바로 사용할 수 있는 리눅스 배포본은 어떤 것입니까?

    여러분의 리눅스 배포본이 IP 마스커레이드를 바로 사용할 수 없다 해도 걱정하지 마십시요. 단지 이 하우투에 나온 대로 커널을 재컴파일하기만 하면 됩니다.

    주의: 이 표를 완벽히 채우는데 도움을 주고자 할 때에는 ambrose@writeme.com이나 dranch@trinnet.net으로 이메일을 주십시요.

    • Caldera < v1.2 : NO - ?
    • Caldera v1.3 : YES - 2.0.35 기반
    • Caldera v2.2 : YES - 2.2.5 기반
    • Debian v1.3 : NO - ?
    • Debian v2.0 : NO - ?
    • Debian v2.1 : NO - 2.2.1 기반
    • DLX Linux v? : ? - ?
    • DOS Linux v? : ? - ?
    • Hal91 Linux v? : ? - ?
    • Linux Mandrake v5.3 : YES - ?
    • Linux Mandrake v6.0 : YES - 2.2.5 기반
    • Linux PPC vR4 : NO - ?
    • Linux Pro v? : ? - ?
    • LinuxWare v? : ? - ?
    • MkLinux v? : ? - ?
    • MuLinux v3rl : YES - ?
    • Redhat < v4.x : NO - ?
    • Redhat v5.0 : YES - ?
    • Redhat v5.1 : YES - ?
    • Redhat v5.2 : YES - 2.0.36 기반
    • Redhat v6.0 : YES - 2.2.5 기반
    • Slackware v3.0 : ? - ?
    • Slackware v3.1 : ? - ?
    • Slackware v3.2 : ? - ?
    • Slackware v3.3 : ? - 2.0.34 기반
    • Slackware v3.4 : ? - ?
    • Slackware v3.5 : ? - ?
    • Slackware v3.6 : ? - ?
    • Slackware v3.9 : ? - 2.0.37pre10 기반
    • Slackware v4.0 : ? - ?
    • Stampede Linux v? : ? - ?
    • SuSE v5.2 : YES - ?
    • SuSE v5.3 : YES - ?
    • SuSE v6.0 : YES - ?
    • SuSE v6.1 : YES - 2.2.5 기반
    • Tomsrbt Linux v? : ? - ?
    • TriLinux v? : ? - ?
    • TurboLinux v? : ? - ?
    • Yggdrasil Linux v? : ? - ?

    7.2 IP 마스커레이드가 동작하기 위한 최소한의 하드웨어 사양과 제한사항은 무엇입니까? 성능은 어느정도입니까?

    16MB RAM을 갖는 486/66으로도 1.54Mb/s T1을 100% 처리하고도 남았었다! 마스커레이드는 386SX-16s 에서 8BM RAM을 가지고서도 잘 동작한다고 알려져 있다. 그러나, 마스커레이드 항목이 500개가 넘으면 리눅스 IP 마스커레이드도 버벅이기 시작한다는 것도 알아두어야 할 것이다.

    리눅스 IP 마스커레이드를 잠시나마 멈추게 할 수 있는 유일한 응용프로그램으로는, 필자가 아는 한 GameSpy뿐이다. 그 이유는 목록을 갱신할 때, 매우 짧은 시간동안 10,000개의 빠른 접속을 필요로 하기 때문이다. 이 일이 끝날 때까지는, 마스커레이드 테이블이 "꽉" 차게 된다. 자세한 사항은 FAQ의 No-Free-Ports 섹션을 살펴보기 바란다.

    말하는 김에 몇가지 더:

    TCP와 UDP에는 4096개의 동시 접속 한계가 있다. 이 한계는 /usr/src/linux/net/ipv4/ip_masq.h에서 값을 건드리면 수정될 수 있다 - 위쪽 한계인 32000 정도도 괜찮다. 한계치를 수정하고 싶다면 - PORT_MASQ_BEGIN 와 PORT_MASQ_END 값을 32K보다 높고 64K보다 낮은 범위로 수정하면 된다.

    7.3 모든 설정을 확인했지만, 여전히 IP 마스커레이드가 동작하지 않습니다. 어떻게 해야 합니까?

    • 우선 마음을 가라 앉히십시요. 차를 한잔하든가, 커피나, 음료수라든가. 그리고 좀 쉬십시요. 일단 마음이 진정되었으면, 아래에 있는 제안대로 따라하십시요. 리눅스 IP 마스커레이드를 설정하는 것은 어렵지 않지만, 몇가지 생소한 개념이 있을 수 있습니다.

    • 자, 이제 다시 Testing 섹션에 있는 것대로 따라하십시요. 마스커레이드를 처음 사용하는 사람들 중에서 문제가 발생한 경우의 99%는 그 섹션을 보지 않았을 겁니다.

    • IP Masquerade Mailing List Archives를 확인해 보십시요. 여러분의 질문이나 문제들 중 대부분은 보통의 질문들이고, 간단히 Archive를 검색해 보면 답을 찾을 수 있을 겁니다.

    • TrinityOS 문서를 확인해 보십시요. 그 문서는 2.0.x 와 2.2.x 커널에서 IP 마스커레이딩을 사용하는 것에 대해서 다루고 있으며, PPPd, DialD, DHCP, DNS, Sendmail이나 그외의 주제들을 다루고 있습니다.

    • 혹시나 여러분이 ROUTED나 GATED를 실행하고 있지는 않는지 확인하십시요. 확인하기 위해서는, "ps aux | grep -e routed -e gated"라고 명령해 보십시요.

    • 여러분의 질문을 IP 마스커레이드 메일링 리스트로 보내십시요(자세한 것은 FAQ의 다음 섹션을 참조하십시요). 단, 질문에 대한 답을 IP 마스커레이딩 Archive에서 찾을 없을 때만 보내십시요. 이메일을 보낼 때는Testing 섹션에 있는 대로 실행했을 때의 결과를 반드시 포함시키십시요!!

    • 여러분의 질문을 관련된 리눅스 NNTP 뉴스그룹으로 보내십시요.

    • ambrose@writeme.com과 dranch@trinnet.net으로 이메일을 보내십시요. 하지만, 우리들에게 질문하는 것보다 IP 마스커레이딩 메일링 리스트에서 원하는 답을 얻기가 쉬울 겁니다.

    • 여러분의 설정을 다시 확인하십시요. :-)

    7.4 IP 마스커레이드나 IP 마스커레이드 개발자 메일링 리스트에 참가하거나 보기 위해서는 어떻게 해야 합니까?

    리눅스 IP 마스커레이딩 메일링 리스트에 참가하는 방법에는 두가지가 있습니다. 첫번째 방법은 masq-request@indyramp.com으로 메일을 보내는 것입니다. 리눅스 IP 마스커레이딩 개발자 메일링 리스트에 참가하기 위해서는, masq-dev-request@indyramp.com으로 메일을 보내십시요. 더 자세한 사항은 아래의 기사를 참조하십시요.

    • 이메일을 통해서 가입(참가)하기: 메일 내용이나 제목에 "subscribe"라는 단어를 입력하십시요. 마스커레이드 주 메일링 리스트나 마스커레이드 개발자 리스트의 축약판에만 가입하기 원한다면 (그 리스트로 보내지는 모든 이메일이 일주일에 한번 한 개의 "큰" 이메일로 여러분에게 보내질 겁니다), 메일 내용이나 제목에 "subscribe" 대신 "subscribe digest"라고 입력하십시요.

      일단 서버가 여러분의 요청을 받으면, 여러분이 요청한 리스트에 가입시키고 여러분에게 패스워드를 보낼 겁니다. 이 패스워드를 어딘가에 저장해 놓으십시요. 옵션을 변경하거나 리스트에서 탈퇴할 때 필요합니다.

    두번째 방법은 웹 브라우져를 이용해서 가입하는 겁니다. 마스커레이드 주 리스트에 가입하려면http://www.indyramp.com/masq-list/의 형식에 맞춰서 가입하고, 마스커레이드 개발자 리스트에 가입하려면http://www.indyramp.com/masq-dev-list/를 이용하십시요.

    일단 가입되고 나면, 가입된 리스트에서 이메일을 받을 겁니다. 또 한가지 알려둘 것은 리스트에 가입하든 가입하지 않든, 두 리스트의 archive를 볼 수 있습니다. 자세한 방법은 위에 있는 두 개의 웹 URL을 참조하십시요.

    마지막으로 알려둘 것은, 마스커레이드 리스트에 글을 올리기 위해서는 처음에 가입했던 계정과 주소를 이용해야 한다는 겁니다.

    메일링 리스트나 메일링 리스트 archive에 관련한 문제가 발생하면, Robert Novak에게 연락하십시요.

    7.5 IP 마스커레이드가 프록시(Proxy)나 NAT 서비스와 다른 점은 무엇입니까?

    Proxy:  프록시 서버는 다음 환경에서 사용가능: Win95, NT, Linux, Solaris, 기타.
    
                    장점:   + 한개의 IP 주소 ; 저렴함
                            + 더 나은 성능(웹 등)을 위해서 선택적으로 캐쉬 사용
    
                    단점:   - 프록시 서버 뒤에 있는 모든 응용프로그램들이 
                              프록시 서비스(SOCKS)를 지원해야 하고 프록시 서버를
                              사용하도록 설정되어야 한다
                            - 웹 카운터나 웹 통계 프로그램을 혼란시킨다
    
             프록시 서버는, IP 마스커레이드와 같이, 단 한개의 공식적인 IP 주소를
             사용하고, 내부 LAN에 있는 클라이언트들(웹 브라우저 등등)에게 번역자
             역할을 한다. 이 프록시 서버는 내부 네트웍으로부터 오는 TELNET, FTP, 
             웹과 같은 접속을 한 개의 인터페이스를 통해서 받아들인다. 그리고 나서,
             프록시 서버 자체에서 접속을 요청한 것처럼 바꾸어서 외부로 보낸다. 
             일단 원격의 인터넷 서버가 요청한 정보를 보내오면, 프록시 서버는 
             TCP/IP 주소를 내부의 클라이언트의 주소로 다시 변경하고 내부에서
             요청했던 호스트로 보내준다. 이러한 것을 "프록시(대리인)" 서버라고 
             부른다.
    
                    주의 :  내부의 머신들에서 사용하는 모든 응용프로그램은
                            *반드시* 프록시 서버 사용을 지원해야 한다. 예를 들면,
                            Netscape나 몇몇 좋은 TELNET이나 FTP 클라이언트들.
                            프록시 서버를 지원하지 않는 클라이언트들은 동작하지
                            않을 것이다.
    
             프록시 서버의 좋은 점 또 한가지는 어떤 서버들은 캐쉬 기능도 갖추고
             있다는 것이다(WWW에 사용하는 Squid). 그럼, 50개의 프록시되는 
             호스트들이 있고, 모두 한꺼번에 Netscape를 실행한다고 하자. 그들이
             디폴트로 되어 있는 홈페이지 URL로 설정되었다면, 50개의 동일한 Netcape 
             웹 페이지를 원격에서 받아와서 해당하는 컴퓨터로 보내주어야 한다.
             캐쉬 기능이 있는 프록시 서버라면, 프록시 서버가 원격으로부터 한번만
             페이지를 로드하고, 프록시 내부의 컴퓨터들은 캐쉬로부터 그 페이지를
             받아볼 것이다. 이렇게 하면, 외부로의 인터넷 접속 대역폭을 절약할 수
             있을 뿐 아니라, 프록시 내부의 머신들은 페이지를 읽는 것이 아주아주
             많이 빠르게 느껴질 것이다. 
    
    
    
    MASQ:    IP 마스커레이드는 리눅스와 Zytel Prestige128, Cisco 770, NetGear ISDN 
    혹은     라우터 등의 몇몇 라우터에서 사용 가능하다.
    1대다
     NAT    
                    장점:   + 오직 한개의 IP 주소만 필요하다 (저렴함)
                            + 응용프로그램이 특별한 것을 지원할 필요가 없다
                            + 네트웍 보안을 강화하기 위해서 방화벽 소프트웨어를
                              사용한다.
    
                    단점:   - 리눅스 호스트나 특별한 ISDN 라우터를 필요로 한다
                              (다른 제품들도 이 기능을 가질 수 있는데도..  )
                            - 외부로부터 들어오는 정보들은, 내부 LAN의 컴퓨터에서
                              요청한 것이 아니거나, 특정 포트 포워딩 소프트웨어가
                              설치되어 있지 않으면 내부 LAN에 접근할 수 없다.
                              많은 NAT 서버들이 이러한 기능을 제공하지 않는다.
                            - 특별한 프로토콜들은 방화벽 전달자(redirector) 등에 
                              의해 개별적으로 처리되어야 한다. 리눅스는 이러한
                              기능(FTP, IRC, 기타등등)을 완전히 지원하지만 많은
                              라우터들이 지원하지 않는다 (NetGear는 지원한다).
    
             마스커레이드나 1대다(多) NAT는, 서버가 IP 주소를 전환해서, 마치 내부
             머신이 아니라 마스커레이드 서버 자체가 접속을 요청한 것처럼(예를 들면
             웹 접속 등) 원격 서버를 속인다는 점에서는, 프록시 서버와 유사하다.
            
             마스커레이드와 프록시 서버의 주된 차이점은, 마스커레이드 서버는
             클라이언트 머신(내부 머신)에게 어떠한 설정의 변경도 요구하지 않는다는
             것이다. 단시 내부 머신들이 리눅스 호스트를 그들의 기본 게이트웨이로
             사용하도록 하기만 하면 모든 것이 잘 동작할 것이다. (리얼오디오, FTP
             등이 동작하기 위해서는 특정 리눅스 모듈을 설치해야 한다!)
    
             또한, 많은 사람들이 IP 마스커레이드를 TELNET, FTP 등에 사용하면서,
             *동시에* 같은 리눅스 호스트에 웹 접속을 위한 캐쉬용 프록시를 설치해서
             추가적인 성능 향상을 얻기도 한다.
    
    
    NAT:     NAT 서버는 Windows 95/NT, Linux, Solaris, 그리고 몇몇 고급의 ISDN 
             라우터(Ascend 제외)에서 사용할 수 있다
    
                    장점:   + 설정하기 매우 좋다
                            + 특별한 응용 소프트웨어를 필요로 하지 않는다
    
                    단점:   - ISP로부터 서브넷을 할당받아야 한다 (비싸다)
    
             Network Address Translation(네트웍 주소 전환)은, 인터넷
             인터페이스에, 사용 가능한 IP 주소 모음을 가지고 있는 호스트를
             지칭한다.  내부 네트웍에서 인터넷 접속을 하고자 할 때, 그 호스트는
             접속을 요청한 컴퓨터의 원래 내부 IP 주소에, 인터넷 인터페이스의
             공식적인 IP 주소를 할당한다. 그 후에, 모든 정보 교환은 NAT의 공식적인
             IP 주소에서 NAT 안쪽의 내부 주소로 전환해서 이루어진다. 이미 할당된
             공식적인 NAT의 주소가 미리 정해진 얼마간의 시간 동안 사용되지 않으면,
             그 공식적인 IP 주소는 다시 사용 가능한 NAT 주소 모음으로 되돌려 진다.
    
             NAT가 갖는 주된 문제점은, 모든 공식 IP 주소들이 사용되면, 내부의
             사용자들은 사용가능한 주소가 생길 때까지 인터넷에 접속을 할 수
             없다는 것이다. 
    

    7.6 GUI 방식의 방화벽 생성/관리 도구가 있습니까?

    그렇습니다! 그들은 사용자 인터페이스나 복잡성 등에 차이가 있습니다. 그러나, 지금까지는 대부분 IPFWADM만 지원하지만 꽤 훌륭합니다. 사용 할 수 있는 도구들을 알파벳 순으로 간단히 목록으로 만들었습니다. 다른 도구들을 알고 있거나 어떤 것이 좋고 나쁘고 까다로운지 평하고 싶다면, Ambrose나 David에게 이메일을 보내주기 바랍니다.

    • John Hardin의 IPFWADM Dot file generator - IPCHAINS 버젼은 이미 사용되고 있음.

    • Sonny Parlin의 IPFWADM과 IPCHAINS용의 FWCONFIG

    • William Stearns의 Mason - 실시간으로 정책을 만드는 형식의 시스템

    7.7 IP 마스커레이드가 동적으로 할당받은 IP 주소와도 동작합니까?

    , ISP로부터 PPP나 DHCP/BOOTp 서버를 통해서 할당받은 동적 IP 주소와도 동작합니다. 공식적인 인터넷 IP 주소가 있기만 하면 반드시 동작할 겁니다. 물론, 정적 IP도 동작합니다. 하지만, 여러분이 강력한 IPFWADM/IPCHAINS 정책을 사용하고자 한다거나, 포트 포워더를 사용하고자 한다면, 여러분의 정책은 IP 주소가 바뀔 때마다 다시 실행되어야 합니다. 강력한 방화벽 정책과 동적 IP 주소에 관한 추가적인 도움은 TrinityOS - Section 10의 앞부분에서 찾을 수 있습니다.

    7.8 인터넷에 연결하기 위해 케이블 모뎀(양방향과 모뎀 응답을 사용하는 것 모두), DSL, 위성 접속 등의 방법을 사용하면서 IP 마스커레이드를 사용할 수 있습니까?

    , 리눅스가 그 네트웍 인터페이스를 지원하기만 하면, 반드시 동작할 겁니다. 동적인 IP 주소를 할당받았다면, 위의 FAQ의 "IP 마스커레이드가 동적으로 할당받은 IP 주소와도 동작합니까?" 항목 아래에 있는 URL을 보십시요.

    7.9 Diald나 PPPd의 전화접속 기능을 IP 마스커레이드와 함께 사용할 수 있습니까?

    물론 가능합니다! IP 마스커레이딩은 Diald나 PPP와는 완전히 투명한 관계에 있습니다(역자주: 서로의 세부적인 내용에 얽매이지 않음). 문제가 될만한 유일한 경우는, 여러분이 동적 IP 주소와 함께 강력한 방화벽 정책을 사용할 때입니다. 자세한 사항은 위의 FAQ의 "IP 마스커레이드가 동적으로 할당받은 IP 주소와도 동작합니까?" 항목을 보십시요.

    7.10 IP 마스커레이드와 함께 사용할 수 있는 응용프로그램은 어떤 것들입니까?

    "동작하는 응용프로그램"의 목록을 계속 만드는 것은 매우 어려운 작업입니다. 하지만, 웹 브라우징(Netscape, MSIE 등), FTP(WS_FTP같은 것들), TELNET, SSH, 리얼 오디오, POP3(메일 받기 - Pine, Eudora, Outlook 등), SMTP(메일 보내기), 기타 등등의 통상적인 인터넷 응용프로그램은 대부분 지원됩니다. 마스커레이드와 함께 동작하는 클라이언트들의 좀 더 완전한 목록은 이 하우투의 Clients 섹션에서 찾을 수 있을 겁니다.

    화상회의 소프트웨어와 같이, 좀더 복잡한 프로토콜이나 특별한 접속 방식을 사용하는 응용프로그램들은 특별한 도구를 같이 사용해야 합니다.

    더 자세한 사항은, Linux IP masquerading Applications 페이지를 보십시요.

    7.11 Redhat, Debian, Slackware나 기타의 배포본에서는 어떻게 IP 마스커레이드를 사용합니까?

    여러분이 어떠한 리눅스 배포본을 사용하고 있든, 이 하우투에서 설명한 IP 마스커레이드 설정 방법은 역시 유효합니다. 어떤 배포본은 설정을 쉽게 해 주는 GUI나 특별한 설정 화일을 가지고 있을 겁니다. 우리는 이 하우투를 가능하면 일반적인 상황에 모두 적용 가능하도록 작성하기 위해서 최선을 다했습니다.

    7.12 TELNET 접속을 자주 사용하지 않으면 동작하지 않는 것 같습니다. 왜 그렇습니까?

    IP 마스커레이드는, 기본적으로, TCP 세션과 TCP FIN, UDP 통신등의 제한시간을 15분으로 맞추어 놓습니다. 다음의 설정을(이 하우투의 /etc/rc.d/rc.firewall 정책 화일에 이미 나와 있음) 가능하면 모든 사용자들에 대해 사용할 것을 권장합니다:

    IPFWADM을 사용하는 리눅스 2.0.x:

    # MASQ timeouts
    #
    #   2 hrs timeout for TCP session timeouts
    #  10 sec timeout for traffic after the TCP/IP "FIN" packet is received
    #  60 sec timeout for UDP traffic (MASQ'ed ICQ users must enable a 30sec firewall timeout in ICQ itself)
    #
    /sbin/ipfwadm -M -s 7200 10 60
    

    IPCHAINS를 사용하는 리눅스 2.2.x:

    # MASQ timeouts
    #
    #   2 hrs timeout for TCP session timeouts
    #  10 sec timeout for traffic after the TCP/IP "FIN" packet is received
    #  60 sec timeout for UDP traffic (MASQ'ed ICQ users must enable a 30sec firewall timeout in ICQ itself)
    #
    /ipchains -M -S 7200 10 60
    

    7.13 인터넷 접속이 처음 이루어질 때는 아무것도 동작하지 않습니다. 하지만, 다시 시도하면 모든 것이 잘 동작합니다. 왜 그렇습니까?

    그 이유는 여러분이 동적인 IP 주소를 가지고 있고, 인터넷 연결이 처음으로 이루어질 때는, IP 마스커레이드가 IP 주소를 알 수 없기 때문에 그렇습니다. 이를 위한 해결책이 있습니다. 여러분의 /etc/rc.d/rc.firewall 정책화일에, 다음 내용을 추가하십시요:

    # Dynamic IP users:
    #
    #   If you get your IP address dynamically from SLIP, PPP, or DHCP, enable this following
    #       option.  This enables dynamic-ip address hacking in IP MASQ, making the life
    #       with Diald and similar programs much easier.
    #
    echo "1" > /proc/sys/net/ipv4/ip_dynaddr
    

    7.14 IP 마스커레이드가 잘 동작하는 것 같지만 몇몇 사이트에 대해서는 동작하지 않습니다. 주로 웹과 FTP에서 그렇습니다.

    이에는, 두가지 이유를 생각해 볼 수 있습니다. 첫번째는 매우 자주 일어나는 것이고, 두번째는 매우 드문 경우입니다.

    • 2.0.36과 2.2.9 리눅스 커널에는 꽤 찾기 힘든 버그가 마스커레이드 코드 내에 있어서, DF 혹은 "Don't Fragment(조각내지 말것)" 비트가 설정되어 있는 패킷과는 문제를 일으킵니다. 기본적으로, 마스커레이드 박스가 1500보다 작은 값의 MTU로 인터넷에 연결될 때, 몇몇 패킷이 DF 필드가 설정될 수 있습니다. 리눅스 박스에서 MTU를 1500으로 변경하면 문제가 해결되는 듯 하긴 하지만, 버그는 여전히 남아 있습니다. 문제라고 생각되는 것은, 마스커레이드 코드가, ICMP 3 sub 4 코드를 갖는 ICMP 패킷이 돌아오면 원래의 마스커레이드되는 컴퓨터로 가도록 제대로 처리하지 못한다는 것입니다. 이 때문에, 패킷이 중간에 누락됩니다. 만약 여러분이 네트웍 프로그래머이고 이 문제를 고칠 수 있다고 생각되면.. 도전해 보십시요!

      하지만 걱정할 것은 없습니다. 매우 훌륭한 보완책은 여러분의 인터넷 접속의 MTU를 1500으로 변경하는 것입니다. 그렇게 되면 어떤 사용자들은 불평하게 될 것인데, 그건 TELNET이나 게임등 몇몇 잠재능력에 민감한 프로그램들이 문제를 일으키기 때문입니다. 하지만, 피해는 단지 조금일 뿐입니다. HTTP와 FTP 속도는 더 좋아질 것입니다!

      이 문제를 고치기 위해서는, 우선 여러분의 인터넷 연결의 MTU가 얼마인지 현재 얼마인지 알아야 합니다. 확인하는 방법은, "/bin/ifconfig"라고 명령하는 것입니다. 이제 여러분의 인터넷 연결에 해당하는 라인들을 살펴보고 MTU가 얼마인지 확인합니다. 이 값은 1500이어야 합니다. 보통 Ethernet(이더넷) 연결은 기본적으로 이 값으로 되어 있을 것이고, PPP는 기본적으로 576으로 되어 있을 겁니다.

    • PPP 접속에서 MTU 값을 고치기 위해서는, /etc/ppp/options 화일을 편집해서 윗부분에 "mtu 1500"과 "mru 1500"이라는 라인들을 추가합니다. 변경사항을 저장하고 PPP를 재시작합니다. 위에서와 같은 방법으로 PPP 접속이 이제는 제대로 된 MTU 값을 갖는지 확인합니다.

    • ADSL이나 케이블 모뎀 등의 Ethernet 연결에서 MTU 값을 고치기 위해서는, 여러분의 네트웍 시작 스크립트를 편집해야 합니다. 네트웍 최적화에 관해서는 TrinityOS - Section 16 문서를 보십시요.

    • 마지막으로, 보통 일어나는 문제는 아니지만, 어떤 때는 이런 해결책이 필요한 경우가 있습니다. PPP 사용자의 경우에, PPPd 코드가 어떤 포트로 접속하는가 하는 것입니다. /dev/cua* 포트인가, /dev/ttyS* 포트인가 하는 것입니다. /dev/ttyS* 포트여야 합니다. cua 스타일은 예전 것이고, 매우 특이한 방법으로 문제를 일으킵니다.

    7.15 IP 마스커레이딩이 느린 것 같습니다.

    이것에는 몇가지 이유가 있을 수 있습니다:

    • 혹시나 여러분의 내부 네트웍과 외부 네트웍이 IP Alias 기능을 통해서 같은 네트웍 카드에서 동작하고 있지는 않는지 확인하십시요. 만약 그렇다면, 네트웍 카드 하나를 더 구해서 내부 네트웍과 외부 네트웍이 그들 자신의 인터페이스에서 동작하도록 할 것을 강력이 권장합니다.

    • 만약 여러분이 외장 모뎀을 사용하고 있다면, 품질이 좋은 직렬 케이블을 사용하고 있는지 확인하십시요. 또한, 많은 PC들이 싸구려의 리본 케이블로 마더보드나 I/O 카드의 직렬 포트와 외부 직렬 포트 접속 단자를 연결하고 있습니다. 이런 경우에 해당된다면, 케이블과 단자의 상태가 양호한지 확인하십시요. 개인적으로, 필자는 모든 리본 케이블 주위에 페라이트 코일(짙은 회색의 둥근 금속)을 감아놓고 있습니다.

    • 이 하우투의 위쪽 FAQ에서 설명한 대로 MTU가 1500으로 되어 있는지 확인하십시요.

    • 시리얼 포트가 16550A이거나 혹은 더 좋은 UART인지 확인하십시요. 확인하기 위해서는 "dmesg | more"라고 명령하십시요.

    • PPP 접속을 위한 시리얼 포트가 115200으로 동작하는지 확인하십시요(모뎀과 시리얼 포트가 처리할 수 있다면 더 빠른 값.. 이를 테면 ISDN 터미널 어댑터(TA).

      • 2.0.x 커널: 2.0.x 커널은 좀 괴상한 면이 있어서 커널에게 시리얼 포트 속도를 115200으로 맞추도록 직접 명령할 수 없습니다. 그래서, /etc/rc.d/rc.local이나 /etc/rc.d/rc.serial 같은 초기 스크립트에서, 다음 명령을 실행하도록 합니다(모뎀을 COM2에서 사용할 때):

        • setserial /dev/ttyS1 spd_vhi

        • PPPd 스크립트에서, 실제 pppd를 실행하는 곳을 속도가 "38400"이 되도록 고칩니다(pppd의 man page 참조).

      • 2.2.x 커널: 2.0.x 커널과 다르게, 2.1.x와 2.2.x 커널은 이런 "spd_vhi" 문제가 없습니다.

        • 그래서, PPPd 스크립트에서, 실제 pppd를 실행하는 곳을 속도가 "115200"이 되도록 고치기만 합니다(pppd의 man page 참조).

    • TCP Sliding window를 최소한 8192가 되도록 설정합니다.

      • 이 내용은 이 문서의 범위를 완전히 벗어나지만, 이렇게 하면 내장/외장 PPP, Ethernet, TokenRing 등 어떠한 네트웍 구성을 갖고 있든 많은 도움이 될 것입니다. 더 자세한 사항은, TrinityOS - Section 16의 네트웍 최적화 섹션을 보십시요.

    • 시리얼 포트에 IRQ-Tune을 설정
      • 대부분의 PC 하드웨어에서, Craig Estey의 IRQTUNE 도구를 사용하면 시리얼 포트의 성능이 SLIP과 PPP를 포함해서 획기적으로 향상될 겁니다.

    7.16 이제 IP 마스커레이딩은 동작하지만, SYSLOG의 로그 화일에 갖가지의 이상한 메시지들과 에러가 생깁니다. IPFWADM/IPCHAINS 방화벽의 에러 메시지의 의미들을 알 수 있을까요?

    여러분이 보통 보게 될 메시지는 아마도 다음 두가지일 겁니다:

    • MASQ: Failed TCP Checksum error: 이 에러가 보이는 경우는, 인터넷에서 오는 패킷이 데이타 섹션에 문제가 있지만 나머지는 괜찮아 "보일" 때입니다. 리눅스 박스가이 이런 패킷을 받으면, 패킷의 CRC를 계산해서 패킷에 문제가 있다는 것을 판단합니다. Microsoft Windows와 같은 OS를 운영하는 대부분의 머신들은, 이런 패킷을 그냥 조용히 무시하지만 리눅스 IP 마스커레이드는 그것을 SYSLOG에 보고합니다. 만약 PPP 접속에서 이런 메시지를 "아주 많이" 접하게 된다면, 위의 FAQ 항목 중 "마스커레이드가 느립니다"를 보시기 바랍니다.

    • 그 항목의 내용이 도움이 안 될 때는, /etc/ppp/options 화일에 "-vj"라는 줄을 추가하고 PPPd를 재시작해 보시기 바랍니다.

    • Firewall hits: 인터넷을 사용하면서 관대한(엄격하지 않은) 방화벽을 운영한다면, 얼마나 많은 사람들이 여러분의 리눅스 박스에 침입하려고 하는지를 보고서 놀라게 될 겁니다! 그럼 이런 방화벽의 로그들이 의미하는 건 뭘까요?

      TrinityOS - Section 10 문서에서:

              아래의 정책에서, 어떤 트래픽을 거절 또는 거부하는 라인들은 "-o"
              옵션을 가지고 있어서 방화벽에의 접근 기록을 다음의 위치에 있는
              SYSLOG 메시지 화일에 남깁니다:
      
                      Redhat:         /var/log
                      Slackware:      /var/adm
      
              이 방화벽 로그들을 살펴보면, 다음의 것들과 같은 것을 보게 될 겁니다:
      
              ---------------------------------------------------------------------
              IPFWADM:
              Feb 23 07:37:01 Roadrunner kernel: IP fw-in rej eth0 TCP 12.75.147.174:1633
                 100.200.0.212:23 L=44 S=0x00 I=54054 F=0x0040 T=254
      
              IPCHAINS:
              Packet log: input DENY eth0 PROTO=17 12.75.147.174:1633 100.200.0.212:23
                L=44 S=0x00 I=54054 F=0x0040 T=254
              ---------------------------------------------------------------------
      
        이 단 한 줄에는 아주 많은 정보가 있습니다. 이 예를 분석해 보면서 여러분이 
        보게되는 방화벽 접근 기록을 확인해 봅시다. 이 예는 IPFWADM을 설명하고 있지만
        IPCHAINS 사용자들도 바로 무언지 알 수 있을 겁니다.
      
              --------------
      
              - 이 방화벽 "접근"은 "Feb 23 07:37:01"에 발생했습니다.
      
              - 이 접근은 "RoadRunner"라는 컴퓨터에 대한 것입니다.
      
              - 이 접근은 "IP" 혹은 TCP/IP 프로토콜을 통한 것입니다.
      
              - 이 접근은 방화벽으로 "들어오는"("fw-in") 것입니다.
                      * 다른 로그들은 "나가는" 것에 대해서 "fw-out" 혹은 FORWARD하는
                        것에 대해서는 "fw-fwd"라고 할 것입니다.
      
              - 이 접근은 "거부되었습니다(rejECTED)".
                      * 다른 로그들은 "deny" 혹은 "accept"라고 할 수도 있습니다.
      
              - 이 방화벽 접근 "eth0" 인터페이스(인터넷 연결)에서 일어났습니다.
      
              - 이 접근은 "TCP" 패킷이었습니다.
      
              - 이 접근은 "12.75.147.174"fksms IP 주소로부터 온 것이고 "1633"번 
                포트로 돌려졌습니다.
      
              - 이 접근은 "100.200.0.212"라는 주소에 "23"번 포트 혹은 TELNET으로
                연결하기 위한 것이었습니다.
                      * 23번 포트가 TELNET을 위한 것인지 잘 모르겠다면, 
                        /etc/services 화일에서 포트를 확인하십시요.
      
              - 이 패킷은 크기가 "44" 바이트였습니다.
      
              - 이 패킷은 "Type of Service(서비스 종류)"가 설정돼 있지 않았습니다.
                      --이 말을 이해하지 못하더라고 걱정하지 마십시요.. 알 필요 
                        없습니다.
                      * ipchains 사용자의 경우 이 값을 4로 나누면 서비스 종류가 
                        됩니다. 
      
              - 이 패킷은 "IP ID" 번호가 "18" 이었습니다.
                      --이 말을 이해하지 못하더라고 걱정하지 마십시요.. 알 필요 
                        없습니다.
      
              - 이 패킷은 16비트의 조각 위치를 가지고 있고 TCP/IP 패킷 플래그는
                "0x0000"이었습니다.
                      --이 말을 이해하지 못하더라고 걱정하지 마십시요.. 알 필요 
                        없습니다.
                      * "0x2..."나 "0x3..."로 시작하는 값은 "더 많은 조각" 비트가
                        되어서 더많은 조각난 패킷들이 도착해야지 이 "큰" 패킷이
                        완성될 것이라는 것을 의미합니다.
                      * "0x4..."나 "0x5..."로 시작하는 값은 "조각내기 금지" 비트가
                        설정되어 있다는 것을 의미합니다.
                      * 다른 값들은 조각 위치 (8로 나우었을 때) 값들이고 나중에 원래의
                        큰 패킷으로 조합할 때 사용됩니다.
      
              - 이 패킷은 지속시간(TimeToLive) (TTL)이 20이었습니다.
                      * 인터넷상에서의 매 도약 때 마다 이 값은 1씩 감소합니다. 보통,
                        패킷들은 출발할 때 255의 값을 갖고 만약 이 숫자가 결국 0이
                        되면, 패킷은 없어진 것이라서 지워지게 될 겁니다.
      
        
      

    7.17 외부의 인터넷 사용자들이 내부에 마스커레이드되는 서버들에 직접 접속할 수 있도록 IP 마스커레이드를 설정할 수 있습니까?

    예! IPPORTFW를 사용하면, 모든, 혹은 선택된 몇몇 인터넷 호스트들이 내부의 마스커레이드되는 컴퓨터들에 접속할 수 있도록 할 수 있습니다. 이 주제에 대해서는 Forwarders 섹션에서 상세히 다루고 있습니다.

    7.18 SYSLOG 화일에 "kernel: ip_masq_new(proto=UDP): no free ports."라는 메시지가 남습니다. 왜 그런가요?

    내부의 마스커레이드되는 머신 중 하나가 인터넷으로 나가는 패킷을 비정상적으로 많이 만들고 있기 때문입니다. IP 마스커레이드 서버는 마스커레이드 테이블을 만들고 이 패킷들을 인터넷으로 내보내는데, 이 테이블이 너무 빨리 채워지는 겁니다. 일단 테이블이 꽉 차게 되면, 이와 같은 에러를 내게 됩니다.

    이러한 상황을 만들어 내는 응용프로그램으로서 제가 알고 있는 유일한 것은 "GameSpy"라는 게임 프로그램입니다. 이유는, Gamespy라는 게임은 서버의 리스트를 만들고, 그 리스트에 있는 수천개의 모든 게임 서버에 ping을 하기 때문입니다. 이렇게 ping을 함으로써, 매우 짧은 시간동안 수만개의 빠른 접속을 요구합니다. 이들이 IP 마스커레이드의 시간제한에 걸려서 끝날 때까지, 마스커레이드 테이블을 "꽉" 차게 됩니다.

    그럼 어떻게 하나요? 이상적으로 말한다면, 그런 프로그램은 쓰지 마십시요. 로그 화일에 그런 에러들이 쌓인다면, 어떤 프로그램인지 찾아내서 사용을 중지하십시요. 하지만, 여러분이 GameSpy같은 게임을 정말로 좋아한다면, 서버 목록을 갱신하는 것을 많이 하지 마십시요. 어쨌든, 그런 프로그램들을 사용하지 않는다면, 마스커레이드가 내보내던 그 에러들은 더 이상 나타나지 않을 겁니다.

    7.19 IPPORTFW를 사용하려고 하면 "ipfwadm: setsockopt failed: Protocol not available"라는 에러가 납니다!

    "ipfwadm: setsockopt failed: Protocol not available"라는 에러 메시지를 만난다면, 새롭게 컴파일한 커널을 사용하고 있지 않은 것입니다. 새 커널을 제 위치에 옮기고, LILO를 다시 실행하고, 다시 재부팅해 보십시요.

    자세한 사항은 Forwarders 섹션의 마지막 부분을 보십시요.

    7.20 Microsoft 화일 프린트 공유와 Microsoft 도메인 클라이언트들(SAMBA)이 IP 마스커레이드를 통해서 동작하지 않습니다!

    Microsoft의 SMB 프로토콜을 제대로 지원하기 위해서는 그를 위한 마스커레이드 모듈이 있어야 하지만, 현재로서는 세가지의 우회적인 방법이 있습니다. 자세한 사항은, this Microsoft KnowledgeBase article을 보십시요.

    첫번째 우회방법은, IPPORTFW를 Forwarders 섹션에 나온 대로 설정하고, TCP 포트 137, 138, 139를 내부의 윈도우즈 머신의 IP 주소로 포워드하는 것입니다. 이렇게 하면 동작하긴 하지만, 오직 한 개의 내부 머신에 대해서만 동작할 것입니다.

    두번재 방법은, 리눅스 마스커레이드 서버에 Samba를 설치하는 것입니다. Samba가 실행하면, 내부의 윈도우즈의 화일 프린트 공유를 Samba 서버에서 보이게 할 수 있습니다. 그러면, 외부의 모든 클라이언트에서 이 공유들에 접근할 수 있게 됩니다. Samba를 설정하는 방법은 리눅스 문서 프로젝트의 HOWTO에서 찾을 수 있고, TrinityOS 문서에서도 역시 찾을 수 있을 것입니다.

    세번째 방법은, 두 왼도우즈 머신 사이에, 혹은 두 네트웍 사이에 VPN(가상 개인 네트웍)을 설정하는 것입니다. 이것은 PPTP나 IPSEC VPN 솔루션을 사용해서 설정할 수 있습니다. 리눅스용의 PPTP 패치도 있고, 2.0.x와 2.2.x 커널에서 사용할 수 있는 완전한 IPSEC도 구현되어 있습니다. 이 방법은 세가지 방법 중에서 가장 안정적이고 안전한 방법입니다.

    이 방법들은 이 HOWTO에서 다루지는 않습니다. IPSEC에 대해서는 TrinityOS 문서에서 도움을 받을 수 있을 것이고, 그 이상의 정보는 JJohn Hardin의 PPTP 페이지를 볼 것을 권장합니다.

    또한 알아 둘 것은, Microsoft의 SMB 프로토콜은 보안에 매우 취약하다는 것입니다. 이 때문에, 인터넷을 통해서 암호화 없이 Microsoft 화일 프린트 공유나 왼도우즈 도메인 로긴을 사용하는 것은 매우 좋지 않습니다.

    7.21 마스커레이드되는 IRC 사용자들은 IRC를 제대로 사용할 수 없습니다. 왜 그런가요?

    주된 원인으로 생각할 수 있는 것은, 대부분의 리눅스 배포본들의 IDENT나 "인증" 서버는 IP 마스커레이드되는 연결을 처리하지 못 한다는 겁니다. 하지만 걱정할 것은 없습니다. 제대로 동작하는 IDENT들이 있으니까요.

    이 소프트웨어를 설치하는 것은 이 HOWTO의 내용을 벗어나는 것입니다. 각각의 도구들은 각각 문서들을 가지고 있습니다. 여기에 몇개의 URL들을 적습니다:

    어떤 인터넷 IRC 서버들은 여전히 같은 호스트에서 여러개의 접속을 하는 것을 허용하지 않고 있습니다. 인증 정보를 통해서 사용자들이 서로 다르다는 것을 알 수 있더라도 말입니다. 그 때는 그 서버의 관리자에게 항의하십시요. :)

    7.22 mIRC가 DCC 전송을 하지 못합니다.

    이것은 mIRC의 설정 문제입니다. 고치기 위해서는, 우선 mIRC를 IRC 서버로부터 접속을 끊습니다. 그리고, mIRC에서 화일 --> 설정으로 가서 "IRC servers tab"을 클릭합니다. 포트가 6667로 설정되어 있는지 확인합니다. 다른 포트를 사용해야 한다면, 이 아래에 있는 내용을 보십시요. 다음으로, 화일 --> 설정 --> 지역 정보로 가서 지역 호스트(자신의 호스트)에 해당하는 부분과 IP 주소를 지웁니다. "LOCAL HOST"와 "IP address"(IP address는 체크되었지만 사용불가로 될 수 있습니다)의 체크박스를 선택합니다. 다음으로, "Lookup Method(검색방법)"을 "normal(보통)"으로 설정합니다. 만약에 "servers"가 선택되어 있으면 동작하지 않을 겁니다. 자 끝났습니다. IRC 서버에 다시 접속해 보십시요.

    IRC 서버의 포트를 6667이 아닌 것을 사용해야 한다면, (예를 들어 6969) IRC 마스커레이드 모듈을 로드하는 /etc/rc.c/rc.firewall 화일을 편집해야 합니다. 이 화일에서 "modprobe ip_masq_irc"라는 줄이 있는 곳을 편집해서 "ports=6667,6969"를 구가합니다. 다른 포트들도 콤마로 구분해서 추가할 수 있습니다.

    마지막으로, 마스커레이드되는 머신들의 IRC 클라이언트들을 종료하고 IRC 마스커레이드 모듈을 다시 로드합니다:

    /sbin/rmmod ip_masq_irc /etc/rc.d/rc.firewall

    7.23 한개의 이더넷 네트웍 카드만 있어도 (IP Aliasing을 통해서) IP 마스커레이드를 사용할 수 있습니까?

    그렇기도 하고 아니기도 합니다. "IP Alias"라는 커널의 기능을 통해서, 사용자는 eth0:1, eth0:2 등과 같이 여러개의 인터페이스를 설정할 수 있습니다. 하지만, IP 마스커레이드에 alias된 인터페이스를 사용하는 것은 추천하지 않습니다. 왜냐구요? 한 개의 네트웍 카드를 통해서는 안전한 방화벽을 구성하는 것이 대단히 어렵습니다. 또한, 패킷들이 들어오면 또 동시에 내보내지기 때문에 상당량의 에러들이 날 것입니다. 이런 이유도 있고 또 요즘은 네트웍 카드가 저렴하기 때문에, 저는 여러분에게 네트웍 카드를 더 구입할 것을 강력히 권장합니다.

    여러분이 또 알아둬야 할 것은, IP 마스커레이딩은 eth0, eth1 등과 같은 물리적인 인터페이스에서만 제대로 동작한다는 겁니다. "eth0:1, eth1:1 등과 같이" alias 된 인터페이스에서 마스커레이딩은 제대로 동작하지 않을 겁니다. 말하자면, 다음과 같은 경우는 동작하지 않을 겁니다:

    • /sbin/ipfwadm -F -a m -W eth0:1 -S 192.168.0.0/24 -D 0.0.0.0/0
    • /sbin/ipchains -A forward -i eth0:1 -s 192.168.0.0/24 -j MASQ"

    하지만 여전히 alias 된 인터페이스를 사용하고 싶다면, 커널에서 "IP Alias" 기능을 켜야 합니다. 그리고 커널을 다시 컴파일하고 재부팅해야 합니다. 새로운 커널로 부팅하고 나면, 리눅스가 새로운 인터페이스(예를 들면 /dev/eth0:1 등)를 사용하도록 설정해 줘야 합니다. 그리고 나면, 앞서 말한 것과 같은 제약은 있지만 그것들을 보통의 이더넷 인터페이스처럼 사용할 수 있습니다.

    7.24 마스커레이드되는 연결들을 보기위해서 NETSTAT 명령을 사용하려고 하는데 동작하지 않습니다.

    "netstat" 프로그램에는 문제가 있습니다. 리눅스 부트된 직후에, "netstat -M"라고 명령하면 잘 동작하지만, 마스커레이드되는 컴퓨터가 ping이나 traceroute 같은 ICMP 통신을 수행하고 나서는 다음과 같은 것을 보게 될 겁니다:

    masq_info.c: Internal Error `ip_masquerade unknown type'.
    

    이를 위한 다른 방법은 "/sbin/ipfwadm -M -l"라는 명령을 사용하는 겁니다. 또한 열거된 ICMP 마스커레이드 항목들이 끝나고 나면, "netstat"가 다시 잘 동작하는 걸 보게 될 겁니다.

    7.25 IP 마스커레이드를 통해서 Microsoft PPTP (GRE tunnels)이나 IPSEC (Linux SWAN) tunnels 등을 사용하고 싶습니다.

    가능합니다. 하지만 이 문서의 범주를 벗어나는 것이므로, 자세한 정보는 John Hardin의 PPTP Masq를 보시기 바랍니다.

    7.26 IP 마스커레이드를 통해서 XYZ 네트웍 게임을 실행하고 싶지만 동작하지 않습니다. 도와주세요!

    우선, Steve Grevemeyer's MASQ Applications page를 살펴보십시요. 거기에 해결책이 없다면, 위의 LooseUDP 섹션에 있는 Glenn Lamb의 LooseUDP 패치로 리눅스 커널을 패치해 보십시요. 더 자세한 정보는 Dan Kegel의 NAT Page를 살펴보십시요.

    여러분이 기술적인 능력이 있다면, "tcpdump" 프로그램을 사용해서 여러분의 네트웍을 sniff 해 보십시요. 그 XYZ 게임이 사용하고 있는 프로토콜과 포트 번호를 알아내는 겁니다. 이 정보들을 알아내면, IP Masq email list에 가입하고 여러분의 결과를 이 메일로 보내고 도움을 요청하십시요.

    7.27 IP 마스커레이드가 얼마간은 잘 동작하지만 갑자기 멈춥니다. 재부팅하고 나면 한동안 또 잘 동작합니다. 왜 그런가요?

    제가 생각하기에 여러분은 IPAUTOFW을 사용하고 있거나 커널에 포함시켰을 겁니다. 맞나요?? 이건 IPAUTOFW의 잘 알려진 문제점입니다. 리눅스 커널에 IPAUTOFW 기능을 포함시키지 말고, 대신 IPPORTFW 옵션을 사용하십시요. 이 문제들은 Forwarders 섹션에서 자세히 다루고 있습니다.

    7.28 내부의 마스커레이드되는 컴퓨터들이 SMTP나 POP-3 메일을 보내지 못합니다!

    이것이 마스커레이딩에 관련된 사항은 아지만, 많은 사람들에 관계된 것이기 때문에 여기에 언급합니다.

    SMTP: 여러분은 아마도 리눅스 박스를 SMTP 중계기(relay)로 사용하려고 하고 다음과 같은 에러가 날 겁니다:

    "error from mail server: we do not relay"
    Sendmail의 새 버젼이나 다른 메일 전송 프로그램(MTA)들은 기본적으로 중계를 하지 않습니다(이것이 바람직한 겁니다). 이 문제를 고치려면 다음과 같이 합니다:

    • Sendmail: /etc/sendmail.cw 화일을 편집해서 내부의 마스커레이드되는 머신들에 대한 특정 중계를 허용하고, 내부의 마스커레이드되는 머신의 호스트명과 도메인 명을 추가합니다. 또한 /etc/hosts 화일에 IP 주소들과 완전히 기술된 도메인 명(Fully Qualified Domain Name: FQDN)이 설정되어 있는지 확인합니다. 이것이 일단 되었으면, Sendmail을 재시작해서 설정화일을 다시 읽어들이도록 합니다. 이 내용은 TrinityOS - Section 25에서 다루고 있습니다.

    POP-3: 어떤 사용자들은 내부의 마스커레이드되는 컴퓨터의 POP-3 클라이언트들이 외부의 SMTP 서버에 접속하도록 설정합니다. 이건 괜찮지만, 많은 SMTP 서버들은 포트 113으로 여러분의 연결을 인증(IDENT)하고자 할 것입니다. 문제가 발생하는 것은, 대부분 여러분의 기본 마스커레이드 정책이 DENY인 것과 관련돼 있습니다. 이건 바람직하지 않습니다. 이것을 REJECT로 설정하고 rc.firewall 정책을 다시 실행하십시요.

    7.29 내부의 서로 다른 마스커레이드 네트웍은 각각의 외부 IP 주소를 통해서 나가도록 하고 싶습니다. (IPROUTE2)

    여러분이 다음과 같은 문제를 가지고 있다고 합시다:

    내부 LAN -----> 공식 IP 192.168.1.x --> 123.123.123.11 192.168.2.x --> 123.123.123.12

    여러분은 우선, IPFWADM과 IPCHAINS는 라우팅 시스템이 패킷을 어디로 보낼 것인가를 결정한 *후에* 실행된다는 사실을 이해해야 합니다. 이 사실은 모든 IPFWADM/IPCHAINS/IPMASQ 문서에 커다른 붉은 글씨로 도장을 찍어놔야 마땅합니다. 우선 라우팅이 제대로 되도록 하고 나서 IPFWADM/IPCHAINS나 마스커레이딩을 추가해야 하는 겁니다.

    위의 경우에서는, 우선 라우팅 시스템이 192.168.1.x로부터의 패킷을 123.123.123.11로, 192.168.2.x로부터의 패킷을 123.123.123.12로 보내도록 설정해야 합니다. 이 작업이 어려운 작업이고, 그 위에 마스커레이드를 설정하는 것은 쉽습니다.

    이 작업을 위해서 IPROUTE2를 사용할 수 있습니다.

    Primary FTP site is:

    NOTE: The following instructions are given below ONLY because currently there is very little documentation to the IPROUTE2 tool available. Check out http://www.compendium.com.ar/policy-routing.txt for the beginnings of a IPROUTE2 howto.

    The "iprule" and "iproute" commands are the same as "ip rule" and "ip route" commands (I prefer the former since it is easier to search for.) All the commands below are completely untested, if they do not work, please contact the author of IPROUTE2.. not David Ranch, Ambrose Au, or anyone on the Masq email list as it has NOTHING to do with IP Masquerading.

    The first few commands only need to be done once at boot, say in /etc/rc.d/rc.local file.

    # Allow internal LANs to route to each other, no masq.
      /sbin/iprule add from 192.168.0.0/16 to 192.168.0.0/16 table main pref 100
    # All other traffic from 192.168.1.x is external, handle by table 101
      /sbin/iprule add from 192.168.1.0/24 to 0/0 table 101 pref 102
    # All other traffic from 192.168.2.x is external, handle by table 102
      /sbin/iprule add from 192.168.2.0/24 to 0/0 table 102 pref 102
    
    These commands need to be issued when eth0 is configured, perhaps in
    /etc/sysconfig/network-scripts/ifup-post (for Redhat systems).  Be sure to
    do them by hand first to make sure they work.
    
    # Table 101 forces all assigned packets out via 123.123.123.11
      /sbin/iproute add table 101 via 62123.123.123.11
    # Table 102 forces all assigned packets out via 123.123.123.12
      /sbin/iproute add table 102 via 62123.123.123.12
    
    At this stage, you should find that packets from 192.168.1.x to the
    outside world are being routed via 123.123.123.11, packets from
    192.168.2.x are routed via 123.123.123.12.
    
    Once routing is correct, now you can add any IPFWADM or IPCHAINS rules.
    The following examples are for IPCHAINS:
    
    
    /sbin/ipchains -A forward -i ppp+ -j MASQ
    
    If everything hangs together, the masq code will see packets being
    routed out on 123.123.123.11 and 123.123.123.12 and will use those addresses
    as the masq source address.
    

    7.30 Why do the new 2.1.x and 2.2.x kernels use IPCHAINS instead of IPFWADM?

    IPCHAINS supports the following features that IPFWADM doesn't:

    • "Quality of Service" (QoS support)

    • A TREE style chains system vs. LINEAR system like IPFWADM (Eg. this allows something like "if it is ppp0, jump to this chain (which contains its own difference set of rules)"

    • IPCHAINS is more flexible with configuration. For example, it has the "replace" command (in addition to "insert" and "add"). You can also negate rules (e.g. "discard any outbound packets that don't come from my registered IP" so that you aren't the source of spoofed attacks).

    • IPCHAINS can filter any IP protocol explicitly, not just TCP, UDP, ICMP

    7.31 I've just upgraded to the 2.2.x kernels, why isn't IP Masquerade working?

    There are several things you should check assuming your Linux IP Masq box already have proper connection to the Internet and your LAN:

    • Make sure you have the necessary features and modules are compiled and loaded. See earlier sections for detail.

    • Check /usr/src/linux/Documentation/Changes and make sure you have the minimal requirement for the network tools installed.

    • Make sure you followed all the tests in the Testing section of the HOWTO.

    • You should use ipchains to manipulate IP Masq and firewalling rules.

    • The standard IPAUTOFW and IPPORTFW port forwarders have been replaced by IPMASQADM. You'll need to apply these patches to the kernel, re-compile the kernel, compile the new IPMASQADM tool and then convert your old IPAUTOFW/IPPORTFW firewall rulesets to the new syntax. This is completely covered in the Forwarders section.

    • Go through all setup and configuration again! A lot of time it's just a typo or a simple mistake you are overlooking.

    7.32 I've just upgraded to a 2.0.36+ kernels later, why isn't IP Masquerade working?

    There are several things you should check assuming your Linux IP Masq box already have proper connection to the Internet and your LAN:

    • Make sure you have the necessary features and modules are compiled and loaded. See earlier sections for detail.

    • Check /usr/src/linux/Documentation/Changes and make sure you have the minimal requirement for the network tools installed.

    • Make sure you followed all the tests in the Testing section of the HOWTO.

    • You should use ipfwadm to manipulate IP Masq and firewalling rules. If you want to use IPCHAINS, you'll need to apply a patch the 2.0.x kernels.

    • Go through all setup and configuration again! A lot of time it's just a typo or a simple mistake you overlooked.

    7.33 I need help with EQL connections and IP Masq

    EQL has nothing to do with IP Masq though they are commonly teamed up on Linux boxes. Because of this, I recommend to check out the NEW version of Robert Novak's EQL HOWTO for all your EQL needs.

    7.34 I can't get IP Masquerade to work! What options do I have for Windows Platforms?

    Giving up a free, reliable, high performance solution that works on minimal hardware and pay a fortune for something that needs more hardware, lower performance and less reliable? (IMHO. And yes, I have real life experience with these ;-)

    Okay, it's your call. If you want a Windows NAT and/or proxy solution, here is a decent listing. I have no preference of these tools since I haven't used them before.

    Lastly, do a web search on "MS Proxy Server", "Wingate", "WinProxy", or goto www.winfiles.com. And definitely DON'T tell anyone that we sent you.

    7.35 I want to help on IP Masquerade development. What can I do?

    Join the Linux IP Masquerading DEVELOPERS list and ask the developers there what you can help with. For more details on joining the lists, check out the Masq-List FAQ section.

    Please DON'T ask NON-IP-Masquerade development related questions there!!!!

    7.36 Where can I find more information on IP Masquerade?

    You can find more information on IP Masquerade at the Linux IP Masquerade Resource that both David Ranch and Ambrose Au maintain.

    You can also find more information at Dranch's Linux page where the TrinityOS and other Linux documents are kept.

    You may also find more information at The Semi-Original Linux IP Masquerading Web Site maintained by Indyramp Consulting, who also provides the IP Masq mailing lists.

    Lastly, you can look for specific questions in the IP MASQ and IP MASQ DEV email archives or ask a specific question on these lists. Check out the Masq-List FAQ item for more details.

    7.37 I want to translate this HOWTO to another language, what should I do?

    Make sure the language you want to translate to is not already covered by someone else. But, most of the translated HOWTOs are now OLD and need to be updated. A list of available HOWTO translations are available at the Linux IP Masquerade Resource.

    If a copy of a current IP MASQ HOWTO isn't in your proposed language, please download the newest copy of the IP-MASQ HOWTO SGML code from the Linux IP Masquerade Resource. From there, begin your work while maintaining good SGML coding. For more help on SGML, check out www.sgmltools.org

    7.38 This HOWTO seems out of date, are you still maintaining it? Can you include more information on ...? Are there any plans for making this better?

    Yes, this HOWTO is still being maintained. In the past, we've been guilty of being too busy working on two jobs and don't have much time to work on this, my apology. As of v1.50, David Ranch has begun to revamp the document and get it current again.

    If you think of a topic that could be included in the HOWTO, please send email to ambrose@writeme.comand dranch@trinnet.net. It will be even better if you can provide that information. We will then include the information into the HOWTO once it is both found appropriate and tested. Many thanks for your contributions!

    We have a lot of new ideas and plans for improving the HOWTO, such as case studies that will cover different network setup involving IP Masquerade, more on security via strong IPFWADM/IPCHAINS firewall rulesets, IPCHAINS usage, more FAQ entries, etc. If you think you can help, please do! Thanks.

    7.39 I got IP Masquerade working, it's great! I want to thank you guys, what can I do?

    • Can you translate the newer version of the HOWTO to another language?
    • Thank the developers and appreciate the time and effort they spent on this.
    • Join the IP Masquerade email list and support new MASQ users
    • Send an email to us and let us know how happy you are
    • Introduce other people to Linux and help them when they have problems.

    8. 기타 사항들

    8.1 유용한 자료들

    8.2 Linux IP 마스커레이드 자료(Linux IP Masquerade Resource)

    Linux IP Masquerade Resource 은 David Ranch와 Ambrose Au가 관리하고 Linux IP 마스커레이드에 관련한 정보를 제공하는 웹사이트이다. IP 마스커레이드에 관현한 가장 최신의 정보를 제공하며, 하우투에 포함되지 않은 정보들도 제공한다.

    다음의 위치에서 Linux IP 마스커레이드 자료(Linux IP Masquerade Resource)를 찾을 수 있을 것이다:

    '네트워크' 카테고리의 다른 글

    리눅스 - 포트포워딩  (0) 2012.02.10
    NAT - KLDP  (4) 2012.02.10
    NAT  (3) 2012.02.10
    Posted by GUCCI
    , |

    최근에 달린 댓글

    글 보관함