3. 게이트웨이 서비스 설정

이 절은 인증게이트웨이의 각 단계별 설정방법을 기술한다. 사용된 예는 서브넷 10.0.1.0의 비공인 ip를 대상으로 하였으며, eth0는 내부네트워크와 연결된 NIC이고, 공용 네트워크와 연결된 장치는 eth1이다. eth1에 대하여 사용된 IP 주소는 10.0.1.1이지만, 여러분들의 환경에 따라 적절히 설정하기 바란다. 게이트웨이 박스로 레드햇 7.1이 사용했기 때문에, 예제의 상당 부분은 레드햇을 중심으로 설명하였다.

3.1. Netfilter 설치

netfilter를 설치하기 위해서는 커널이 넷필터를 지원하도록 반드시 새로 컴파일해야한다. 커널을 구성하고 새로 컴파일하는 방법은 Kernel-HOWTO를 참고하기 바란다.

다음은 필자의 커널 구성중 일부를 보인 것이다.
   #
   # Networking options
   #
   CONFIG_PACKET=y
   # CONFIG_PACKET_MMAP is not set
   # CONFIG_NETLINK is not set
   CONFIG_NETFILTER=y
   CONFIG_NETFILTER_DEBUG=y
   CONFIG_FILTER=y
   CONFIG_UNIX=y
   CONFIG_INET=y
   CONFIG_IP_MULTICAST=y
   # CONFIG_IP_ADVANCED_ROUTER is not set
   # CONFIG_IP_PNP is not set
   # CONFIG_NET_IPIP is not set
   # CONFIG_NET_IPGRE is not set
   # CONFIG_IP_MROUTE is not set
   # CONFIG_INET_ECN is not set
   # CONFIG_SYN_COOKIES is not set


   #   IP: Netfilter Configuration
   #   
   CONFIG_IP_NF_CONNTRACK=y
   CONFIG_IP_NF_FTP=y
   CONFIG_IP_NF_IPTABLES=y
   CONFIG_IP_NF_MATCH_LIMIT=y
   CONFIG_IP_NF_MATCH_MAC=y
   CONFIG_IP_NF_MATCH_MARK=y
   CONFIG_IP_NF_MATCH_MULTIPORT=y
   CONFIG_IP_NF_MATCH_TOS=y
   CONFIG_IP_NF_MATCH_TCPMSS=y
   CONFIG_IP_NF_MATCH_STATE=y
   CONFIG_IP_NF_MATCH_UNCLEAN=y
   CONFIG_IP_NF_MATCH_OWNER=y
   CONFIG_IP_NF_FILTER=y
   CONFIG_IP_NF_TARGET_REJECT=y
   CONFIG_IP_NF_TARGET_MIRROR=y
   CONFIG_IP_NF_NAT=y
   CONFIG_IP_NF_NAT_NEEDED=y
   CONFIG_IP_NF_TARGET_MASQUERADE=y
   CONFIG_IP_NF_TARGET_REDIRECT=y
   CONFIG_IP_NF_NAT_FTP=y
   CONFIG_IP_NF_MANGLE=y
   CONFIG_IP_NF_TARGET_TOS=y
   CONFIG_IP_NF_TARGET_MARK=y
   CONFIG_IP_NF_TARGET_LOG=y
   CONFIG_IP_NF_TARGET_TCPMSS=y
   

iptables를 설치해야하며, 배포반의 패키지로 설치하거나 소스로 설치를 해도 무방하다. 일단 위의 옵션으로 새로운 커널을 컴파일하고 iptables를 설치한 후, 필자는 다음을 방화벽 기본룰로 설정하였다.

   iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
   iptables -A INPUT -i eth0 -m state --state NEW, INVALID -j DROP
   iptables -A FORWARD -i eth0 -m state --state NEW, INVALID -j DROP
   iptables -I FORWARD -o eth0 -j DROP
   iptables -I FORWARD -s 10.0.1.0/24 -d 10.0.1.1 -j ACCEPT
   

서버가 부팅할 때 위의 스크립트가 동작하도록 하려면 init 스크립트에 위의 명령을 포함시켜도 된다. 룰이 추가 되었는지 확인하려면 다음과 같은 명령을 실행시키면 된다:

   iptables -v -t nat -L
   iptables -v -t filter -L
   

이러한 룰을 저장하고자 할 경우, 필자는 레드햇의 init 스크립트를 사용했다.

   /etc/init.d/iptables save
   /etc/init.d/iptables restart
   

룰이 추가되었으면, 다음과 같은 명령을 수행하여 IP forwarding을 가능하게 한다.

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

머신이 리부팅할 때 ip forwarding이 가능하도록 하려면, /etc/sysctl.conf에 다음 라인을 추가하면 된다.

   net.ipv4.ip_forward = 1
   

이제 게이트웨이 박스는 NAT를 할 수 있지만, 공용 네트워크 내부와 게이트웨이로 향하여 들어오는 forwarding 패킷을 제외한 모든 forwarding 패킷을 버릴 것이다(DROP).

3.2. PAM iptables Module

방화벽 룰을 추가하는 PAM 세션 모듈로, 인증된 클라이언트에 대하여 forwarding을 허용하기 위해 필요하다. 이를 설정하고자 하는 경우는 단순히 소스를 구하여 다음 명령을 이용하여 컴파일하면 된다.

   gcc -fPIC -c pam_iptables.c
   ld -x --shared -o pam_iptables.so pam_iptables.o
   

이제 pam_iptables.sopam_iptables.o이라고 하는 바이너리 파일이 생겼을 것이다. pam_iptables.so/lib/security/pam_iptables.so으로 복사하기 바란다.

   cp pam_iptables.so /lib/security/pam_iptables.so
   

게이트웨이에 대하여 인증 클라이언트로 선택된 것은 ssh이고 따라서 필자는 다음 라인을 /etc/pam.d/sshd에 추가하였다.

   session    required     /lib/security/pam_iptables.so 
   

이제는, 사용자가 ssh를 이용하여 로그인할 경우, 방화벽 룰이 추가될 것이다.

pam_iptables에 대한 기본 인터페이스는 eth0이지만, 인터페이스 파라미터를 추가하여 기본설정값을 변경할 수 있다.

   session required /lib/security/pam_iptables.so interface=eth1
   

이 경우는 외부 네트워크와 연결된 인터페이스 이름이 eth0가 아닌 경우에만 필요하다.

pam_iptables 모듈이 잘 동작하고 있는 지 확인하려면 다음과 같은 단계를 수행하면 된다.

  1. ssh를 이용하여 게이트웨이 박스에 로그인 한다.

  2. `iptables -L'을 이용하여 룰이 추가 되었는지 확인 한다.

  3. 룰이 제거되도록 하기위해 게이트웨이 박스로부터 로그아웃 한다.

3.3. DHCP Server 설정

필자는 다음과 같은 dhcpd.conf 파일을 이용하여 DHCP를 설정하였다.

   subnet 10.0.1.0 netmask 255.255.255.0 {
   # --- default gateway
        option routers                  10.0.1.1;
        option subnet-mask              255.255.255.0;
        option broadcast-address        10.0.1.255;

        option domain-name-servers       10.0.1.1;      
        range   10.0.1.3 10.0.1.254;
        option time-offset              -5;     # Eastern Standard Time

        default-lease-time 21600;
        max-lease-time 43200;

    } 
    

서버는 공용 네트워크와 연결된 eth1을 이용하여 동작하였다.

    /usr/sbin/dhcpd eth1
    

3.4. 인증방법 설정

앞 절에서도 설명하였지만, 필자는 인증으로 LDAP를 사용하도록 게이트웨이를 설정하였다. 하지만, 여러분들은 PAM이 허용하는 어떠한 인증방법을 사용해도 무방하다. 더 많은 정보를 얻으려면 2.4절를 보기 바란다.

PAM LDAP으로 인증을 구현하기 위하여, 필자는 OpenLDAP을 설치하고 /etc/ldap.conf에 다음과 같은 내용으로 구성하였다.

   # Your LDAP server. Must be resolvable without using LDAP.
   host itc.musc.edu

   # The distinguished name of the search base.
   base dc=musc,dc=edu
   ssl no
   

다음에 보이는 파일은 LDAP 인증을 하도록 PAM을 구성하기 위해 사용하였으며, 이 파일들은 레드햇의 configuration 유틸리티로 생성된 것이다.

/etc/pam.d/system-auth 다음과 같이 생성된다.

   #%PAM-1.0
   # This file is auto-generated.
   # User changes will be destroyed the next time authconfig is run.
   auth        required      /lib/security/pam_env.so
   auth        sufficient    /lib/security/pam_unix.so likeauth nullok
   auth        sufficient    /lib/security/pam_ldap.so use_first_pass
   auth        required      /lib/security/pam_deny.so

   account     required      /lib/security/pam_unix.so
   account     [default=ok user_unknown=ignore service_err=ignore system_err=ignore] /lib/security/pam_ldap.so

   password    required      /lib/security/pam_cracklib.so retry=3
   password    sufficient    /lib/security/pam_unix.so nullok use_authtok
   password    sufficient    /lib/security/pam_ldap.so use_authtok
   password    required      /lib/security/pam_deny.so

   session     required      /lib/security/pam_limits.so
   session     required      /lib/security/pam_unix.so
   session     optional      /lib/security/pam_ldap.so
       

다음과 같은 /etc/pam.d/sshd 파일이 생성된다.

   #%PAM-1.0
   auth       required     /lib/security/pam_stack.so service=system-auth
   auth       required     /lib/security/pam_nologin.so
   account    required     /lib/security/pam_stack.so service=system-auth
   password   required     /lib/security/pam_stack.so service=system-auth
   session    required     /lib/security/pam_stack.so service=system-auth
   #this line is added for firewall rule insertion upon login
   session    required     /lib/security/pam_iptables.so debug
   session    optional     /lib/security/pam_console.so
      

3.5. DNS 설정

레드햇 7.1에 포함된 BIND를 설치했고, caching-nameserver RPM을 같이 설치했다. DHCP 서버는 공용 네트워크상의 머쉰들이 게이트웨이 박스를 네임서버로 사용하도록 알리는 역할을 한다.