는 라우팅 프로토콜로는 RIP, OSPE등 여러가지 종류가 있다. 여기서는 이글의 범위를 벗어나므로 더 이상 언급하지 않겠다. PC로 라우터를 만들었을 경우에는 routed라는 프로그램을 실행시키면 동적 라우팅을 할 수가 있다.
지금까지 방화벽과 라우팅의 개념을 개략적으로 살펴보았다. 지금부터는 실제적으로 어떻게 베스천 호스트와 라우터를 셋팅하는지 살펴보자.
실제 구현 방법
*리눅스에서 2개의 랜카드를 셋팅하는 방법
라우터이든 베스천 호스트이던 간에 일단 먼저 해야 할 일은 PC에 랜카드 2개를 설치하는 일이다. 이것은 랜카드의 종류가 같던 다르던 상관 없다. 중요한 것은 랜카드의 IRQ와 I/O주소가 PC의 IRQ와 I/O 주소가 일치하게 세팅 해 주어야 한다는 것이다. 물론 랜카드끼리의 충돌을 피하기 위해선 랜카드의 IRQ와 I/O 주소는 서로 달라야 한다. 이 문제는 랜카드 공급 업체에서 공급해 준 드라이버 디스켓에 IRQ를 조절해 주는 프로그램이 있을 것이므로 이를 이용해 해결하면 된다. 구체적인 방법을 소개하자면 랜카드를 PC에 꼽은 다음 제일 먼저 해야 할 일은 구입 업체에서 제공한 프로그램을 이용해 PnP기능을 제거하는 것이다. 그런 다음 윈도우95에서 제어판 -> 시스템 -> 장치관리자 -> 컴퓨터의 등록정보를 선택하면 현재 시스템에서 쓰고 있는 IRQ와 I/O주소 상태를 알 수 있을 것이다. 이것을 참고로 시스템에서 사용되지 않는 IRQ와 I/O를 메모한 다음 구입 업체에서 제공한 프로그램을 이용
[표1] 수정된 lilo.conf
해 프로그램을 이용해 랜카드의 IRQ와 I/O주소를 거기에 맞게 설정하면 된다. 테스트해서 성공적으로 끝났다면 설정된 각각의 랜카드의 IRQ와 I/O를 메모해 두길 바란다. 이제 리눅스로 부팅해 보자. 우선 커널이 자신의 랜카드를 지원하도록 컴파일 해야 한다. 컴파일 옵션 중에서 Network device support 부분에서 자신의 랜카드를 선택하면 된다. 커널 컴파일이 제대로 끝났다면 부팅될 때 랜카드를 선택하면 된다. 커널 컴파일이 제대로 끝났다면 부팅될 때 랜카드 설정 부분이 나타날 것이다. 쉘상에서는 dmesg라는 명령으로 확인할 수 있다. 다음으로 해야할 작업은 /etc/lilo.conf를 [표1]과 같이 수정해야 한다.
이제 각각 인터페이스(eth0, eth1)에 IP adress를 할당하고 라우팅 테이블에 추가시키는 방법을 알아보자. ==>more
dislevel#ifconfig eth0 inet 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.255 up
dislevel#ifconfig eth1 inet 192.168.2.1 netmask 255.255.255.0 broadcast 192.168.2.255 up
dislevel#route add net 192.168.1.0 eth0
dislevel#route add net 192.168.2.0 eth1
지금까지는 리눅스에서 랜카드 2개를 설정하는 방법을 알아보았다. 이젠 베스천 호스트와 라우터를 만드는 방법을 알아보겠다.
*리눅스를 베스천 호스트로 만드는 방법
리눅스를 베스천 호스트로 만드려면 커널 컴파일을 다시 한번 해야 한다. Network device support 부분은 앞에서 설명했으므로 생략하고 Network options 부분에서 설정해 주어야 할 부분은 <화면1>과 같다.
여기서 눈여겨 볼 부분은 IP forwarding을 OFF로 셋팅해야 한다는 것이다. 왜냐하면 베스천 호스트에서는 모든 패킷을 일단 차단한 다음 Application Gateway별로 규칙에 부합하는 패킷만을 통과시키도록 정책을 쓰기 때문이다.
*리눅스를 라우터로 만드는 방법
베스천 호스트의 차이점을 말한다면 IP 패킷을 forwarding 하느냐, 하지 않는냐에 있다. 즉 라우터는 IP forwarding 을 해야하고 베스천 호스트는 해서는 안된다. 그렇기 때문에 베스천 호스트 만들 때에는 설정했던 컴파일 옵션 중 IP forwarding 부분을 ON 시켜주면 된다. 그리고 추가로 윗그림에서 IP:optimize as router not host 부분을 y로 하면 된다. 커널 컴파일이 끝났으면 routed라는 프로그램을 실행시키면 된다.
<화면1> 커널 컴파일 옵션에서 네트웍 부분 세팅
Router를 위한 IP Packet Filter
이번에는 라우터에 패킷을 필터링 하는 기능을 구현해 보자. 패킷 필터링은 인터넷에 연결된 사설 네트워크에서 인터넷으로 나가거나 사설 네트워크로 들어오는 패킷들의 IP 주소, 포트 번호 등을 기준으로 패킷을 걸러내 허용된 패킷만 받아들이거나 전달되도록 하는 것을 말하며, 일반적으로 다음과 같은 과정을 따라 패킷을 필터링하게 된다.
*패킷과 연관되는 필터링 규칙이 있는가를 검사한다.
*처음 발견된 걸맞는 필터링 규칙에 따라 패킷을 처리한다.
*다음과 같은 3가지 정책중 규칙에 설정된 정책에 따라 패킷을 처리한다.
-Accept : 패킷을 통과 시킨다.
-Deny : 패킷을 그냥 버린다.
-Reject : 패킷을 버리고 ICMP Destination Unreachable 메시지를 패킷 송신자(sender)에게
보낸다.
*각 규칙에 걸맞는 패킷 수와 그 바이트를 셈한다.
*패킷에 관한 정보를 기록한다.
*걸맞는 필터링 규칙이 없을 경우에는 기본(default)정책에 따라 패킷을 처리한다.
리눅스에서는 이러한 패킷 필터링의 기능을 ipfwadm이라는 프로그램을 가지고 쉽게 구현 할 수 있다 알짜 레드햇을 설치 하였다면 아마 이 프로그램이 기본으로 설치되어 있을 것이다. 만약 설치 되어있지 않다면 다음 URL에서 최신 버전을 구할 수 있을 것이다.
Router와 Packet Filter 개념도
프로그램을 설치하는 것은 별 어려움이 없으리라 본다. 자 그럼 이제 본론으로 들어가서, 우리가 제일 먼저 해야 할 것은 패킷 필터링에 있어서 기본 정책을 세우는 것이다. 일반적으로 기본 정책을 수립하는데 다음과 같은 두가지 철학이 있다.
*명시적으로 허가되지 않은 것은 금지한다.
*명시적으로 금지되지 않은 것은 허가한다.
즉, 기본 정책으로는 일반 모든 패킷을 허용하고 보안상 문제가 되는 패킷들에 대해서는 금지하는 방법과 보안상 문제가 없다고 생각되는 패킷들만 허용하고 나머지 모든 패킷들을 금지하는 방법이 있다. 일반적으로 두번째 방법을 많이 사용한다. 따라서 여기서도 두번째 방법을 가지고 설명을 하겠다. 패킷 필터링의 기본 정책은 다음과 같은 명령으로 설정할 수 있다.
여기서 -I는 들어오는(input) 패킷을 의미하고 -O는 나가는(output) 패킷을 의미한다. 전달(forward)되는 패킷의 경우는 -F 을 이용하여 정책을 세울 수 있다. -p는 기본 정책(default policy)을 설정하는 옵션이다. 위 두 명령은 들어오고 나가는 모든 패킷에 대하여 기본적으로 패킷을 버리도록 설정이 되어 있다. 이 상태에서는 어떤 패킷도 현재 호스트에 들어오지도 나가지도 않는다. 따라서 어떤 네트워크 서비스도 이용할 수 없다. localhost에 대한 ping 명령을 내려보면 아래 그림과 같을 것이다. 그럼 다시 ping이 가능하게 하려면 어떻게 하면 될까? 다음과 같이 기본 정책을 다시 바꾸면 될 것이다.
Localhost에 대한 ping 예제
하지만 다른 서비스는 다 무시하고 ping만 가능하게 하라면 이 방법으론 안될 것이다. 다음과 같이 하면 ping이 제대로 동작할 것이다.
여기서 -a 옵션은 새로운 필터링 규칙을 추가한다는 것을 나타내고 뒤에 나오는 accept는 허용 규칙을 추가한다는 뜻이고, -P icmp은 프로토콜(protocol) icmp를 의미한다. ping프로그램이 사용하는 프로토콜이 icmp이므로 icmp를 사용한 패킷을 보내고 받을 수 있도록 하면 된다. 여기서 주의 할 점은 'P'가 대문자 라는 것이다.
필터링 규칙이 제대로 설정 되었는지 알아보려면, 다음과 같이 하면된다. ==>more
ipfwadm -I -l --- Input packet Filtering rule list 출력
ipfwadm -O -l --- Output packet Filtering rule list 출력
그러면 Input packet과 Output packet에 대한 필터링 규칙을 보여준다.
그럼 이번에는 Telnet 서비스가 가능하도록 해보자. Telnet 서비스는 밖으로 Telnet을 통해 나가는 경우와 밖에서 Telnet을 통해 들어오는 경우, 두 가지가 있다. 먼저 Telnet 서비스를 통하여 밖으로 나가는 경우를 보자. Telnet 서비스를 이용할 경우 TCP 프로토콜을 사용하며, Telnet 서버는 24번 포트를 사용하여 클라이언트의 접속을 기다린다. Telnet 클라이언트는 1024~65535범위 안에서 임의의 포트를 사용하여 Telnet 서버에 연결을 하게 된다. 따라서 Telnet을 이용할 때 전송되는 패킷들의 Source address와 Port는 다음과 같이 요약할 수 있다.
-클라이언트에서 서버로 가는 패킷
Source Destination
Address Port Address Port
Cllent IP 1024-65535 Server IP 24
-서버에서 클라이언트로 가는 패킷
Source Destination
Address Port Address Port
Server IP 24 Cllent IP 1024-65535
따라서, 아래와 같이 필터링 규칙을 추가 해주면 된다. 대소문자에 유의하기 바란다.
ipfwadm -O -a accept -P tcp -S 192.168.37.1 1024:65535
\ D 192.168.22.0/24 telnet
ipfwadm -I -a accept -k -P tcp -S 192.168.22.0/24
telnet \-D 192.168.37.1 1024:65535
여기서 -S 192.168.37.1은 패킷은 발송지 주소(Source Address)를 나타낸다. (호스트 IP는 192.168.37.1로 가정) 1024:65535을 Port 번호의 범위를 나타낸다. -D 192.168.22.0/24는 목적지 주소(Destination Address)를 나타낸다. 여기서 192.168.22.0는 네트워크 주소를 나타내고 /24는 netmask 255.255.255.0을 의미한다. 24라는 수는 netmask가 차지하는 상위 비트수를 나타낸다. 위에서 보는 것처럼 TCP 프로토콜에 대해서는 항상 IP address 와 Port 번호를 함께 설정해 주어야 하는데, 이때 IP address 가 호스트일 때는 IP주소만 적고, 네트워크일 때는 netmask를 함께 써주어야 하며, 포트 번호를 생략하게 되면 모든 포트로 설정된다. -k 옵션은 ACL 비트가 포함된 TCP 패킷을 의미한다.
위와 같이 설정하면 호스트 192.168.37.1에서 192.168.22.0 네트워크로만 Telnet 서비스를 이용할 수 있다. 만약 모든 네트워크로만 Telnet 서비스를 사용가능 하도록 지정하고 싶을땐 192.168.22.0/24를 any/0으로 수정하면 된다. 수정할 때는 앞의 규칙을 삭제하고 새로운 규칙을 다시 설정해야 한다. 필터링 규칙 삭제는 -d 옵션을 사용하여 삭제하고자 하는 규칙을 설정하면 된다. ==>more
ipfwadm -I -d accept -P tcp -S 192.168.37.1 1024:65535
\ -D 192.168.22.0/24 telnet
ipfwadm -I -d accept -k -P tcp -S 192.168.22.0/24
telnet \-D 192.168.37.1 1024:65535
모든 필터링 규칙을 삭제하고 처음부터 다시 설정하고 싶다면 다음 명령어를 사용하면 된다.
이번에는 외부의 호스트가 호스트 192.168.37.1로 Telnet 접속을 할 수 있게 하여 보자. 명령어는 앞에서 한 것과 매우 유사하다. Source Address와 Destination address 그리고 Port번호를 반대로 설정하면 된다.
ipfwadm -O -a accept -k -P tcp -S 192.168.37.1 telnet
\ -D 192.168.22.0/24 1024:65535
ipfwadm -I -a accept -P tcp -S 192.168.22.0/24 1024:
65535 \-D 192.168.37.1 telnet
위와같이 설정하면 192.168.22.0 네트워크에 속하는 호스트들만 호스트 192.168.37.1의 Telneet 서버스를 사용할 수 있게 된다. 이상으로 Telnet 접속의 2가지 경우에 대하여 접속을 제어하는 것에 관하여 알아보았다.
다음으로 우리가 자주 사용하는 FTP에 대한 필터링 규칙을 설정하여 보자. 한가지 주의할 점은 Telnet은 하나의 연결(connection)을 사용하지만 FTP는 두 개의 연결을 가지고 있다는 것이다. 하나는 FTP 명령을 사용하기 위한 연결이고 다른 하나는 데이터를 전송하기 위한 연결이다. 따라서 FTP에 대한 필터링 규칙은 다음과 같다.
ipfwadm -I -a accept -k -P tcp -S any/0 ftp \
-D 192.168.37.1 1024:65535
ipfwadm -O -a accept -P tcp -S 192.168.37.1
1024:65535 \-D any/0 ftp
ipfwadm -I -a accept -P tcp -S any/0 ftp-data \
-D 192.168.37.1 1024:65535
ipfwadm -O -a accept -k -P tcp -S 192.168.37.1
1024:65535 \-D any/0 ftp-data
그외 다른 서비스들도 Telnet 이나 FTP와 마찬가지로 네트워크상에서의 패킷의 발신지 포트와 목적지 포트에 유념하여 필터링 규칙을 설정한다면 특정 패킷을 허용 또는 차단 할 수 있다. 하지만 모든 서비스에 관하여 패킷 필터링의 기능을 설정하는 것은 쉬운 일이 아니다. 각 서비스가 사용하고 있는 프로토콜과 포트 번호를 정확히 알아야 하며, 필터링 규칙이 매우 복잡해진다. 필터링 규칙을 세우는데 있어서 다음과 같은 점을 유의하기 바란다.
⇒ 필터링 규칙의 순서를 정하라.
⇒ 현재의 패킷에 적용될 수 있는 규칙이 여러 개 있다면 그중 먼저 설정된 규칙이 적용된다.
⇒ 가능한한 여러 개의 포트 번호를 묶어서 설정하라.
- 패킷에 대한 필터링 규칙을 점검하는데 CPU time이 소요되기 때문이다.
⇒ 시스템이 시작될 때 필터링 규칙이 설정되게 하라.
- 시스템이 시작되고 네트워크 장비가 설정되기 전에 필터링 규칙이 설정되도록 하는 것이
이상적이다.
⇒ 호스트 이름이나 네트워크 이름을 사용하지 마라.
- ipfwadm에서는 호스트 이름이나 네트워크 이름을 사용할 수 있으나 될 수 있으면
IP 주소를 사용하는 것이 더 좋다.
⇒ 현재 운영 중인 시스템에 필터링 규칙을 설정할 경우 다음과 같은 순서로 하라.
-기본 필터링 규칙을 deny로 설정하라.
-모든 필터링 규칙을 제거한다. (ipfwadm의 -f 옵션사용)
-새로운 필터링 규칙을 설정한다.
-기본 필터링 규칙을 원하는 값으로 설정하라.
IP traffic accounting
리눅스에서 ipfwadm을 이용하면 받은 패킷과 보낸 패킷의 수를 셈하여 IP 트래픽을 계산할 수 있다. 로컬 호스트이 IP주소가 192.168.37.1 이고 WWW 서비스를 제공하고 있다면, 다음 명령은 이부로 부터의 WWW 서비스를 이용하는 사람들의 http 패킷을 계산한다. ==>more
여기서 -A 옵션은 패캣의 수를 세(Account)는 옵션이고, -b옵션은 양방향(bi-directional)의 패킷 모두를 계산하라는 것이다. 192.168.37.1(80)로 들어오는 패킷이나 나가는 패킷의 수만을 계산하고 싶다면,
ipfwadm -A in -a -W ethl -P tcp -D 192.168.37.1 www
ipfwadm -A out -a -W ethl -P tcp -S 192.168.37.1 www
위 명령과 같이 -A 옵션 다음에 방향(in/out)을 지정하고 목적지 또는 발송지 주소를 적어 줌으로서 원하는 패킷의 수만을 계산할 수 있다. -W ethl 은 인터페이스를 의미한다.
기타 다른 옵션들에 대해서는 man ipfwadm 해서 찾아보기 바란다. 알짜 래드햇의 경우 번역된 맨 페이지가 나오므로 쉽게 알 수 있을 것이다.
참고 : 정보보안.네트워크.IT자격증 정보공유사이트
RECENT COMMENT