IT/Tips

하나로 ADSL에서 Linux NAT router 구축하기

싸후이 2007. 2. 6. 15:57

[하나로 ADSL에서 Linux NAT router 구축하기]

0. 목차

 1. 개요

 2. 준비물

 3. 커널 설정
  3.1 커널 CONFIGURATION
  3.2 커널 COMPILE & 적용

 4. 유틸리티 설치와 적용
  4.1 iptables utils
  4.2 pppoe client
  4.3 ReAIM - MSN 파일 전송 패치
  4.4 시작시 iptables rule 및 유틸리티 적용하기

 5. 기타
  5.1 ppp 재접속 스크립트 설정
  5.2 정상작동중인  모듈 상태
  5.3 정상 작동중의 ifconfig



1. 개요

  집에는 하나로 ADSL LITE를 쓰며, 식구들 방에는 각각 LOCAL LAN이 이미
 
 들어가 있었다. 삼성OEM ACE Link라는 ADSL 외장형 모뎀을 갖게 되었고
 
 기존에 쓰고 있었던 Alcatel의 NAT내장형 ADSL 외장형 모뎀의 고장이 부른
 
 귀찮음이었다.
 
 이미 엎질러진 물, 부랴부랴 리눅스 박스를 만들었고 설치하였다.
 
 설치해서 여러가지 RULE을 적용하여 사용중이며 이 문서는 이 RULE을
 
 어떻게 적용했는지 기억하기 위해 작성된 개인 문서다.
 
 

2. 준비물

  (배포판과 커널 버전, iptables util의 버전은 최신을 사용해도 무방)

  * RedHat 7.0 / Linux Kernel 2.4.11 
     iptables kernel support (module로 컴파일)
     ppp kernel support (module로 컴파일)
 
  * iptables-1.2.1a-1 (rpm installed) // iptables utility

  * pppoe client // EnterNet for Linux, PPPoE Client, Version 1.31
                 // http://www.nts.com/
                 
  * reaim // ReAIM - AOL Instant Messenger Proxy (NAT아래에서 MSN 파일 송신용)
 

  그리고 다음을 가정한다.
 
  eth0와 eth1의 네트웍 인터페이스가 설정되어 있고, eth0는 adsl modem과
 
  연결된 외부 네트웍 장치이고 eth1은 10.0.0.0 네트웍에 연결되어 있는

  내부 네트웍 장치다. eth1은 10.0.0.1 IP를 갖고 있다.
 
  ppp0나 ppp1은 pppoe(ppp over ethernet) utility에 의해 eth0와 가상으로
 
  설정된 네트웍 인터페이스다.


3. 커널 설정

3.1 커널 CONFIGURATION

  linux kernel 2.4.11 기준 (TCPMSS는 특히 주의)

  * KERNEL MODULE SUPPORT

  [Networking option]
    [*] Network packet filtering (replaces ipchains)
    [*] TCP/IP networking         
    [*]   IP: TCP Explicit Congestion Notification support
    [*]   IP: TCP syncookie support (disabled per default)  
   
    IP: Netfilter Configuration ─
           <M> Connection tracking (required for masq/NAT)       
           <M>   FTP protocol support                            
           <M>   IRC protocol support                            
           <M> IP tables support (required for filtering/masq/NAT)
           <M>   limit match support                             
           <M>   MAC address match support                       
           <M>   netfilter MARK match support                    
           <M>   Multiple port match support                     
           <M>   TOS match support                               
           <M>   LENGTH match support                            
           <M>   TTL match support                               
           <M>   tcpmss match support                            
           <M>   Connection state match support                  
           <M>   Unclean match support (EXPERIMENTAL)            
           <M>   Owner match support (EXPERIMENTAL)              
           <M>   Packet filtering                                
           <M>     REJECT target support                         
           <M>     MIRROR target support (EXPERIMENTAL)          
           <M>   Full NAT                                        
           <M>     MASQUERADE target support                     
           <M>     REDIRECT target support                       
           <M>     Basic SNMP-ALG support (EXPERIMENTAL)         
           <M>   Packet mangling                                 
           <M>     TOS target support                            
           <M>     MARK target support                           
           <M>   LOG target support                              
           <M>   TCPMSS target support                           

 [Network device support ]
           <M> PPP (point-to-point protocol) support    
           [ ]   PPP multilink support (EXPERIMENTAL)   
           <M>   PPP support for async serial ports     
           <M>   PPP support for sync tty ports         
           <M>   PPP Deflate compression                
           <M>   PPP BSD-Compress compression           
           <M>   PPP over Ethernet (EXPERIMENTAL)     

3.2 커널 COMPILE & 적용

  원래 하던데로, make clean;make dep;make bzImage; make modules_install
 
  후에 커널 이미지를 적용해서 리스타트한다.
 
  물론 이후의 rc.local 스크립트를 적용한 후에 한 번 더 리부팅 해주어야한다.
 
           
4. 유틸리티 설치와 적용

4.1 iptables utils

  iptables utils는 배포판 설치시에 이미 깔려있다.
 
  없다면 배포판의 CD에 rpm 파일을 찾아 설치만 해주면 된다.

  (iptables, iptables-save, iptables-restore와 같은 유틸리티가
   들어 있다.)
 
  직접 netfilter홈페이지에서 iptables tarball을 받아 컴파일 해줄 수도 있다. 


4.2 pppoe client

  최신 버전은 http://www.nts.com/에서 받을 수 있으며 여기에서 사용된
  버전은 아래에 있다.
 
  http://chonga.pe.kr/computer/linux_setting/nat/pppoe-1.31.tar.gz
 
  위 압축 파일을 적당한 곳에 풀고 src/ 디렉토리에서 make를 해준다.
  그러면 release/ 디렉토리에 실행에 필요한 것들이 만들어진다.
 
  그 내용은 다음과 같다.
  [root@www release]# ls
  options.pppoe  pppoed  start-pppoe  status-pppoe  stop-pppoe
 
  이 파일을 /usr/local/bin 같은 적당한 곳에 복사하고 start-pppoe를 편집한다
  내용중 아래의 변수를 신경써서 봐준다.
  하나로에 대한 설정으로 아래와 같이 설정했다.
 
  USERID="guest@hanaro"
  INTERFACE="eth0"
  PPPD=/usr/sbin/pppd
  PPPOED=/usr/local/bin/pppoed
  IFCONFIG=/sbin/ifconfig


4.3 ReAIM - MSN 파일 전송 패치

  이 부분은 오랜 동안 iptables 패치를 기대했지만 우연한 기회에 적수네에서 좋은 글을 발견했다.
 
  http://linux.sarang.net/board/?p=read&table=tip&no=7042&page=&o[at]=s&o[sc]=t&o[ss]=MSN&o[st]=w2

  프로젝트 홈페이지는 http://reaim.sourceforge.net/ 이며 아래에서 받아서 사용할 수 있다.

  http://chonga.pe.kr/computer/linux_setting/nat/reaim-0.5.tar.gz 

  reaim 패키지를 받아 컴파일을 한 후 reaim을 /usr/local/bin에 복사하고
 
  /usr/local/bin/reaim & 으로 한번만 실행 해주면 된다.
 
 
  /var/log/reaim.log 로 정상 동작 유무를 판별한다.
 
  정상적인 파일 전송 로그의 예는 다음과 같다.
  [Sun Aug 18 21:29:30 2002] [STARTUP] Started AIM-Fix Proxy [0.5 alpha]
  [Sun Aug 18 21:29:30 2002] [STARTUP] Auto-detecting the external IP address.
  [Sun Aug 18 21:29:43 2002] MSN Proxy connection established [10.0.0.3:1858 -> 64.4.13.159:1863] [magic=1]
  [Sun Aug 18 21:30:42 2002] MSN Proxy connection established [10.0.0.3:1874 -> 64.4.12.202:1863] [magic=2]
  [Sun Aug 18 21:31:32 2002] MSN Proxy connection established [10.0.0.3:1876 -> 64.4.12.211:1863] [magic=3]
  [Sun Aug 18 21:34:01 2002] MSN DCC Setup IP Changed...10.0.0.3:6891 -> 211.207.42.22:1864
  [Sun Aug 18 21:34:01 2002] socket closed.  cleaning up.....
  [Sun Aug 18 21:34:01 2002] [Cleanup] proxy_track_struct [magic=3] [user=1]
  [Sun Aug 18 21:34:02 2002] Lax MSN Rx Accepted 61.73.16.65:1713 -> proxy:1864 -> 10.0.0.3:6891
  [Sun Aug 18 21:34:02 2002] socket closed.  cleaning up.....
  [Sun Aug 18 21:34:02 2002] [Cleanup] proxy_track_struct [magic=0] [user=0]


4.4 시작시 iptables rule 및 유틸리티 적용하기

  /etc/rc.d/rc.local 의 하단에 startup script에 아래의 내용을 기술해준다.
 
   # IPTABLES MODULE STARTUP
   modprobe ip_tables
   modprobe iptable_nat
   modprobe ipt_MASQUERADE
   modprobe ip_conntrack_ftp
   modprobe ip_nat_ftp
  
   echo "START PPPoE"
   modprobe ppp_generic
   /usr/local/bin/start-pppoe
 
   # ppp 접속이 끊어져 재접속되면  ppp0과 ppp1이 토글된다. 그래서 2개를 해준다.
   iptables -A POSTROUTING -t nat -o ppp0 -j MASQUERADE
   iptables -A POSTROUTING -t nat -o ppp1 -j MASQUERADE


   # ADSL의 지연문제, MTU사이즈가 틀려서 특정 사이트 연결이 아예 안되는 문제가 있는데
   # 이를 해결하기 위한 라인
   # http://kltp.kldp.org/ 참조
   iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu


   # NAT라우터 자체에서 80포트로 웹서버를 운영중인 경우
   iptables -t nat -A PREROUTING -p tcp --dport 80 -i ppp0 -j DNAT --to 10.0.0.1:80
   iptables -t nat -A PREROUTING -p tcp --dport 80 -i ppp1 -j DNAT --to 10.0.0.1:80
 
   # 수신 거부 IP
   iptables -A INPUT -s 211.207.95.15 -j DROP
  
   # NAT 라우터에 삼바를 사용하는 경우 외부에서 못들어오도록
   # 내부는 10.0.0.2 에서 들어올 수 있게 하도록 한다.
   iptables -A INPUT -to-port 139 -j DROP
   iptables -A INPUT -s 10.0.0.2 -p tcp -m tcp --dport 139 -j ACCEPT
   iptables -A INPUT -s 10.0.0.2 -p udp -m udp --dport 139 -j ACCEPT
 
   # 내부 네트웍에서 NAT라우터의 80웹서버를 hostname으로 접속할 수 있도록
   # 이때 VIRTUAL HOST로 지정된 경우는 무시된다.
   iptables -t nat -A PREROUTING -i eth1 -p tcp -m tcp -s 10.0.0.10 -d chonga.pe.kr --dport 80 \
    -j DNAT --to-destination 10.0.0.1:80
 
   # MSN FILE SEND RULE
   iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 5190 -j REDIRECT --to-ports 5190
   iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 1863 -j REDIRECT --to-ports 1863
 
 
   # MSN FILE SENDING DAEMON (ReAIM STARTUP)
   /usr/local/bin/reaim&


5. 기타

5.1 ppp 재접속 스크립트 설정

  ppp가 끊어지면 다시 접속할 수 있도록 하는 스크립트로 check_conn.sh를 crontab에 등록한다.
 
  cron 설정은 다음과 같다. (매 5분마다 check_conn.sh를 실행하도록 되어 있다.)
 
    5,10,15,20,25,30,35,40,45,50,55,58,59 * * * * /usr/local/bin/check_conn.sh > /dev/null

  check_conn.sh의 내용은 아래와 같다. 210.94.0.7은 하나넷 dns로 회선의 끊어짐 유무를
  판별하기 위해 사용하였다.

   [root@www /usr/local/bin]# cat check_conn.sh
   #!/bin/sh
 
   echo "CHKED" > /tmp/a
   CHK=1
   #ifconfig ppp0 > /dev/null 2> /dev/null || CHK=0
   ping -c 1 210.94.0.7  > /dev/null 2> /dev/null || CHK=0
 
   if [ $CHK = "0" ]; then
         echo "ERROR : RETRY PPPOE" >> /tmp/a
         /usr/local/bin/stop-pppoe
         /usr/local/bin/start-pppoe
         exit
   fi
   echo "SUCCESS" >> /tmp/a
   # end of script
 


5.2 정상작동중인  모듈 상태

 [root@www /]# lsmod
 Module                  Size  Used by
 ipt_REDIRECT             736   2  (autoclean)
 ipt_TCPMSS              2240   1  (autoclean)
 iptable_filter          1728   0  (autoclean) (unused)
 ppp_async               6224   1  (autoclean)
 ppp_generic            14208   3  [ppp_async]
 slhc                    4608   0  [ppp_generic]
 ip_nat_ftp              3008   0  (unused)
 ip_conntrack_ftp        3472   0  (unused)
 ipt_MASQUERADE          1264   2
 iptable_nat            13520   1  [ipt_REDIRECT ip_nat_ftp ipt_MASQUERADE]
 ip_conntrack           13424   2  [ipt_REDIRECT ip_nat_ftp ip_conntrack_ftp ipt_MASQUERADE iptable_nat]
 ip_tables              10752   7  [ipt_REDIRECT ipt_TCPMSS iptable_filter ipt_MASQUERADE iptable_nat]


5.3 정상 작동중의 ifconfig

    [root@www /]# ifconfig -a
   
 eth0      Link encap:Ethernet  HWaddr 00:50:BF:0D:BC:36
           UP BROADCAST RUNNING NOARP MULTICAST  MTU:1500  Metric:1
           RX packets:12791120 errors:0 dropped:0 overruns:0 frame:19
           TX packets:17001786 errors:0 dropped:0 overruns:0 carrier:0
           collisions:3137 txqueuelen:100
           Interrupt:12 Base address:0xc800
 
 eth1      Link encap:Ethernet  HWaddr 00:02:2A:C1:F4:33
           inet addr:10.0.0.1  Bcast:10.255.255.255  Mask:255.0.0.0
           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
           RX packets:9647999 errors:10 dropped:0 overruns:0 frame:0
           TX packets:12193250 errors:0 dropped:0 overruns:0 carrier:0
           collisions:845543 txqueuelen:100
           Interrupt:10 Base address:0xc400
 
 lo        Link encap:Local Loopback
           inet addr:127.0.0.1  Mask:255.0.0.0
           UP LOOPBACK RUNNING  MTU:16436  Metric:1
           RX packets:31515 errors:0 dropped:0 overruns:0 frame:0
           TX packets:31515 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:0
 
 ppp0      Link encap:Point-to-Point Protocol
           inet addr:211.237.55.22  P-t-P:211.237.55.1  Mask:255.255.255.255
           UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1492  Metric:1
           RX packets:1147490 errors:0 dropped:0 overruns:0 frame:0
           TX packets:1586777 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:3


'IT > Tips' 카테고리의 다른 글

쉘상에서 프로세스 리턴값 얻어오기  (0) 2007.02.12
netmask 구분  (0) 2007.02.06
IPerf + iproute2  (0) 2007.01.29
Iptables Tutorial 1.2.2  (0) 2007.01.24
GDB 사용법  (0) 2007.01.15