본문 바로가기

3-1. Linux/::Configuration::

Masquerading Made Simple HOWTO[쉽게 말해서 리눅스로 공유기 만들기]

Masquerading Made Simple HOWTO

John Tapsell

           
        

Thomas Spellman

           
        

Matthias Grimm

           
        

서정민

번역

       
    

정윤조

번역 고침

       
    

모든 필자들은 irc.opensource.net 서버의 #debian 채널에서 만날 수 있다.

이 문서의 공식 메인테이너는 John Tapsell(JohnFlux)이다.

질문이나 시비걸기, 의견, 데이트 신청 등을 하려면 John Tapsell에게 이메일을 보내기 바란다.

David Ranch의 문서를 뻔뻔스럽게 도용한 점을 밝힌다 - .

이 문서는 IP-Masquerading HOWTO 문서를 보충할 뿐 대체하지 않는다. 따라서 반드시 두 문서는 함께 보기를 권장한다. 이 문서는 IP-Masquerading HOWTO 문서에서 이미 다룬 내용은 포함하지 않으며, 내용에 대한 설명도 하지 않는다. 더 자세한 설명서를 원한다면 http://ipmasq.cjb.net과 IP-Masquerading HOWTO을 볼 것을 권한다.

이 문서는 리눅스 호스트에서 IP 매스커레이드(masquerade) 기능을 사용하는 방법을 설명한다. IP 매스커레이딩은 NAT(Netwrk Address Translation, 네트워크 주소 변환)의 일종으로, 등록된 인터넷 IP 주소가 없는 내부 네트워크의 컴퓨터들이 인터넷 IP 주소를 가진 리눅스 박스를 통해서 인터넷을 사용할 수 있도록 한다.

이 문서는 GNU Free Documentation License를 따른다.

http://www.gnu.org/copyleft/fdl.html

고친 과정
고침 번역 0.09 2008-05-18 고친이 howl

고침 번역 0.05 2001-09-28 고친이 jms

고침 0.09 2004-07-21 고친이 ts

고침 0.08 2002-07-11 고친이 jpt

고침 0.07 2002-02-27 고친이 jpt

고침 0.06 2001-09-08 고친이 jpt

고침 0.05 2001-09-07 고친이 jpt


1. 소개

이 문서는 의도적으로 짧고 단도직입적으로 구성되었다.

다음과 같은 외부와 연결시키고 싶은 네트워크가 있다고 하자.

   _____________
  /                     \           외부 IP        _________          내부 IP
 |   Internet           |     123.12.23.43    |  linux     |     192.168.0.1
 |   google.com      | ------[외부 랜카드]------| machine |------[내부 랜카드]
  \_____________/                               -----------------             |
                                                                                  |        
                                                                                  |
                                      _____________                ______|_______
                                     | 192.168.0.2  |             /                      \
                                     |    내부        |------------------|    192.168.0.0    |
                                     |    컴퓨터     |              |      인트라넷      |
                                      ------------------------               \______________/ 

  


2. 요약 : (나는 먼저 요약부터 한다)

외부 네트워크 카드는 eth0, 외부 IP는 123.12.23.43, 그리고 내부 네크워크 카드는 eth1라고 가정하자.

$> modprobe ipt_MASQUERADE # 만약 실패하더라도 다음을 계속하시오.
$> iptables -F; iptables -t nat -F; iptables -t mangle -F
$> iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 123.12.23.43
$> echo 1 > /proc/sys/net/ipv4/ip_forward

전화(dial-up) 연결의 경우:

$> modprobe ipt_MASQUERADE # 만약 실패하더라도 다음을 계속하시오. 
$> iptables -F; iptables -t nat -F; iptables -t mangle -F
$> iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
$> echo 1 > /proc/sys/net/ipv4/ip_forward

그리고 보안을 위해:

$> iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$> iptables -A INPUT -m state --state NEW -i ! eth0 -j ACCEPT
$> iptables -P INPUT DROP # 위의 두 줄이 성공한 경우에만
$> iptables -A FORWARD -i eth0 -o eth0 -j REJECT

전화(dial-up) 연결의 경우 (eth0을 내부 랜카드로 사용할 경우):

$> iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$> iptables -A INPUT -m state --state NEW -i ! ppp0 -j ACCEPT
$> iptables -P INPUT DROP # 위의 두 줄이 성공했을 경우에만
$> iptables -A FORWARD -i ppp0 -o ppp0 -j REJECT

이게 전부다! 설정한 규칙들을 보려면 "iptables -t nat -L"을 한다.


3. 조금 더 자세한 설명

커널 컴파일에 대해서 (2.4.x 버전 이상)

다음과 같은 커널 지원을 설정해야 한다.

  • Networking Options 항목

    • Network packet filtering (CONFIG_NETFILTER)

  • Networking Options->Netfilter Configuration 항목

    • Connection tracking (CONFIG_IP_NF_CONNTRACK)

    • FTP Protocol support (CONFIG_IP_NF_FTP)

    • IP tables support (CONFIG_IP_NF_IPTABLES)

    • Connection state match support (CONFIG_IP_NF_MATCH_STATE)

    • Packet filtering (CONFIG_IP_NF_FILTER)

      • REJECT target support (CONFIG_IP_NF_TARGET_REJECT)

    • Full NAT (CONFIG_IP_NF_NAT)

      • MASQUERADE target support (CONFIG_IP_NF_TARGET_MASQUERADE)

      • REDIRECT target support (CONFIG_IP_NF_TARGET_REDIRECT)

    • Packet mangling (CONFIG_IP_NF_MANGLE)

    • LOG target support (CONFIG_IP_NF_TARGET_LOG)

제일 먼저, iptable과 masq 모듈이 커널과 함께 컴파일되어 설치가 되어 있지 않을 경우, 준비된 모듈들이 있다면 그것들을 설치하자. insmod ipt_MASQUERADE를 하면, ip_tables, ip_conntrack, iptable_nat가 로드된다.

$> modprobe ipt_MASQERADE

인트라넷이 크던, 두 세대의 컴퓨터를 인터넷에 연결하던, 사실상 큰 차이는 없다.

각설하고, 다른 규칙이 없다고 가정 하에, 다음을 실행하자.

$> iptables -F; iptables -t nat -F; iptables -t mangle -F

만약 iptables를 찾을 수 없다는 에러가 날 경우, iptables를 찾아 설치하라. 만약 nat이라는 테이블이 없다면, nat 지원을 설정하고 커널을 다시 컴파일하라. mangle이란 테이블이 없더라도 걱정할 필요없다. 마스커레이딩에는 필요없다.만약 iptables가 커널과 맞지 않다고 하면(incompatible), 2.4 버전 이상의 커널을 구해서 iptables 지원을 설정하고 컴파일하라.

고정 IP인 경우 (예: DHCP를 사용하지 않는 네트워크 카드):

$> iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 123.12.23.43

유동 IP인 경우 (예: 전화 접속을 하는 모뎀):

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

마지막으로 패킷 포워딩(packet forwarding)을 시작한다고 다음과 같이 커널에 통보하자. (리부팅 시 한번만 실행하면 되지만, 여러번 해도 큰일나진 않는다.)

$> echo 1 > /proc/sys/net/ipv4/ip_forward

이상 모든 것이 제대로 동작하는지 확인한 뒤 (다음 장 참고), 내부 네트워크의 컴퓨터들만 매스커레이딩을 사용하도록 설정하자. 인터넷을 통해서 아무나 이 기능을 이용하길 바라지는 않으니까. :)

일단 기존의 모든 연결과 그와 연관(related)된 연결(예: FTP 서버 연결)들을 허락하자.

$> iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

에러가 난다면, 커널이 상태 확인(state tracking)을 지원하지 않을 가능성이 크다. 다시 컴파일하라. 다음은 인트라넷(로컬/내부 네트워크)으로부터의 새로운 연결만 허락한다. 자신의 외부 네트워크 카드의 종류에 따라 ppp0를 eth0 등으로 고쳐야 한다. (!는 '제외'한다는 뜻)

$> iptables -A INPUT -m state --state NEW -i ! ppp0 -j ACCEPT

이제 다음과 같이 다른 모든 연결은 막자.

$> iptables -P INPUT DROP  # 위의 두 줄이 성공했을 경우에만

앞의 두 규칙 중에 하나라도 실패한다면, 이 마지막 규칙은 매스커레이딩 기능을 막아버리게 된다. 이 규칙을 취소하려면, "iptables -P INPUT ACCEPT"을 하면 된다.


4. 설치 후 지침

이제 모두 제대로 동작할 것이다. 다음 사항들을 꼭 기억하도록.

  • 내부 네트워크에 존재하는 모든 클라이언트의 게이트웨이 주소를 리눅스 박스의 내부 IP 주소로 설정한다. (윈도에서 네트워크 환경을 오른쪽 클릭하고 등록정보 -> 게이트웨이에 가서 값을 리눅스 게이트웨이의 내부 IP로 설정한다.)

  • 클라이언트가 프록시를 사용한다면, ISP가 HTTP 프록시를 제공할 경우 그것을 사용하거나, 투명 프록시를 쓰거나, (경고 - 아주 큰 네트워크에서는 투명 프록시가 아주 느리다는 보고를 들은 바 있다) 우리가 새로 만든 리눅스 게이트웨이에 squid를 구동하라. (이는 선택사항이지만, 큰 네트워크에서는 쓸모가 있다)

  • 클라이언트를 설정할 때 DNS 주소를 반드시 직접 입력하라. DNS 주소를 지정해 놓지 않으면, 클라이언트는 'cannot resolve address' 따위의 에러를 밷어낼 것이다. 예전에는 DNS가 잘 작동했는데 (URL 주소를 잘 사용했었는데) 매스커레이딩을 설정한 후엔 안되는 이유는, ISP나 네트워크의 DHCP 서버가 더이상 DNS의 주소를 당신의 컴퓨터에 알려줄 수 없기 때문이다.

    이 문제를 지적해준 Richard Atcheson에게 감사한다.

  • 이제 보안 설정을 할 시간이다! 우선 모든 포워딩을 막는다: "iptables -P FORWARD DROP", 그리고 iptables와 /etc/hosts.allow/etc/hosts.deny 사용법을 공부하자. 경고 - 마스커레이딩을 제대로 작동해보기 전까지는 이 iptalbes 규칙을 적용하지 말 것. 이 마지막 규칙을 취소(DENY)하려면, 원하는 모든 패킷을 통과시키도록 명시해야 한다. ("ipatbles -P FORWARD ACCEPT"하면 취소)

  • 이제 인터넷에서 접속할 수 있는 서비스들을 허락한다.

    예를 들어, 웹서버 접속을 허락하려면 다음과 같이 한다:

    $> iptables -A INPUT --protocol tcp --dport 80 -j ACCEPT
    $> iptables -A INPUT --protocol tcp --dport 443 -j ACCEPT

    ident 서비스(예: irc 접속)를 허락하려면:

    $> iptables -A INPUT --protocol tcp --dport 113 -j ACCEPT

테스트를 해보자.

  • 클라이언트에서 IP를 이용해서 웹에 접속해보자. 구글의 IP는 216.239.33.100(수많은 구글의 IP 중 하나)이며 응답을 해야 성공이다. 예: "ping 216.239.33.100" "lynx 216.239.33.100".

  • 도메인 이름으로의 접속해보자. 예: "ping google.com", "lynx google.com" 또는 인터넷 익스플로러나 넷스케이프로 접속.

eth0가 외부 네트워크 카드이고, 그 외부 IP 주소가 123.12.23.43인 경우를 가정했다.


5. FAQ's

  • 내가 지금까지 설정한 규칙들을 보려면?

    - 다음과 같이 해볼 것.

    $> iptables -L
    $> iptables -t nat -L
  • IP 주소를 찾지 못한다. 'www.microsoft.com'라고 치면, 찾을 수 없다고 나온다.

    - 모든 클라이언트에 DNS 서버의 IP 주소를 입력해 두었는지 확인해봐라.

  • 안된다! iptables / NAT / SNAT / MASQ 모두 안된다.

    - 최신 커널을 구해서 iptables와 NAT 지원을 설정하고 컴파일하라.

  • 안된다! 매스커레이딩이 전혀 작동을 안한다.죽어라 나쁜 놈!

    - echo 1 > /proc/sys/net/ipv4/ip_forward은 했나.

  • 안된다! 네트워크를 사용할 수 없다. 난 네놈이 미워!

    - 요렇게 해봐라.

    $> iptables -F
    $> iptables -t nat -F
    $> iptables -t mangle -F

    그러면 모든 규칙들을 지워진다. 이제 iptables 규칙들을 다시 적용해보도록.

    - iptables -P FORWARD ACCEPT를 해봐라.

  • 그래도 작동을 안한다!

    - 으음. "dmesg | tail"를 하면 에러가 보이나? "cat /var/log/messages | tail"를 해보면 어떤가? 내 생각엔 말이야...

  • 이해가 안간다. 그냥 작동을 안한다!

    - 그럼 나도 모른다. 다음과 같은 것 정도는 할 수 있어야 한다.

    1) 게이트웨이에서 외부로 핑을 보낸다.
    2) 게이트웨이에서 내부 클라이언트로 핑을 보낸다.
    3) 내부 클라이언트에서 게이트웨이로 핑을 보낸다.

    매스커레이딩을 적용하기 전에 이것들이 가능해야 얘기가 된다.

  • 이것들을 다 어디다 넣어야 하나?

    - /etc/network/interfaces 파일이나 firewall.rc에 넣는다. interfaces 파일에 넣는다면, 외부 네트워크 카드가 연결(up)되기 전에 실행되도록 하고, 연결이 끝난 뒤(down)에는 "iptables -t nat -F"가 실행되도록 설정한다.

  • 요청(demand)이 있을 때만 ppp를 연결(up)하는 방식일 경우 어떻게 해야하나?

    - ISP의 게이트웨이 IP가 23.43.12.43라고 가정하면, 다음 한줄을 /erc/ppp/peers/provider의 끝에 추가하라.

    :23.43.12.43

    (이는 유동 IP를 위한 설정이다 - 고정 IP라면 my.external.ip.number:23.43.12.43으로 해야한다.)

    그리고 파일의 끝에 라인 하나를 또 추가한다:

    demand

    연결이 되면 pppd를 내리는 "nopersist" 옵션을 설정하지 않았다면, pppd는 연결이 끊기더라도 요청이 있을 때 재다이얼을 하기 위해서 백그라운드에 남는 있다가, "ifdown ppp0"나 "poff" 명령이 내려진 후에야 비로서 언로든된다.유휴 시간이 10분 이상일 때 연결을 끊으려면 "idle 600"를 추가하면 된다.

  • 연결이 계속 죽는다!

    - 첫번째, 혹시 요청에 따른 다이얼링을 사용하는가? 원래 그렇게 되도록 설정되어있는 건 아닌가? /etc/ppp/peers/provider를 보고, 매스커레이딩이 적용되기 전에 다이얼링이 먼저 이뤄지고 있는지 확인하라.

    - 두번째, 만약 위의 문제가 아니라면, 뭔가 나처럼 마치 나처럼 이상해져버린지도 모른다. 커널 2.4.3 버전으로 돌아가서 작동되는지 확인해봐라. 나도 모른다.

  • 이런 걸 나보고 직접 하라고! 미리 만들어진 스크립트나 GUI같은 걸 내놔라.

    - 물론 있다: http://shorewall.sourceforge.net/ 이거 상당히 쓸만하다.

  • 케이블 모뎀은 고정 IP인가, 동적 IP인가?

    - 좋은 질문이다. 동적이라고 생각하는 편이 좋을 듯.

  • DHCP 네트워크는 고정 IP인가 동적 IP인가?

    - 동적이다.

  • 서비스 요청은 어떻게 처리하는가?

    - IP 포트를 포워딩하거나 리다이렉트해봐라. 다시 한번 말하지만 방화벽이 필요한 경우라면 반드시 사용할 것.

  • 클라이언트에서 리눅스 게이트웨이의 외부 IP로 핑은 되는데 인터넷은 안된다.

    - 그렇다면 "rmmod iptable_filter"를 해봐라. - 자세한 정보는 아는 대로 추가할 예정.

    - routedgated 데몬이 작동하지 않도록 하라. - 확인하려면, "ps aux | grep -e routed -e gated".

    - 여기를 참고하라. http://ipmasq.cjb.net

  • 설정된 연결들은 어떻게 보는가? netstat 비슷한 거.

    - cat /proc/net/ip_conntrack를 해볼 것.

  • squid 정보와 라우팅 등에 관해 더 알고 싶다!

    - Advanced Routing HOWTO 문서를 보시라. http://www.linuxdoc.org/HOWTO/Adv-Routing-HOWTO.html

  • 이 HOWTO 문서는 완전 쓰레기다! 이 문서를 쓴 놈들에게 욕을 해주려면 어떻게 해야하나?

    - irc.opensource.net의 #debian 방에 가서 JohnFlux를 찾아라. - tapselj0_at_cs.man.ac.uk (JohnFlux)로 메일을 보내시던지.

  • 이 HOWTO 문서는 완전 쓰레기다! 더 나은 버전은 어디서 구할 수 있는가?

    - http://ipmasq.cjb.net

    - LDP의 Masq-HOWTO 문서를 참고하라.

  • 이 문서말고 필자가 하고 있는 다른 일은?

    현재 나는 리눅스를 이용한 간단한 미사일 방어에 관한 가이드를 집필 중이다. 핵공격으로부터 자신의 시스템을 지키는 방법에 대한 초보자가 읽을 만한 가이드가 없다.어떤 사람들은 로켓 과학 따위를 생각 중인가 본데 그걸로는...