메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

인터넷 연결 공유하기

한빛미디어

|

2006-12-01

|

by HANBIT

11,930

제공: 한빛 네트워크
저자: Dru Lavigne, 이정목 역
원문: Sharing Internet Connections

저는 BSD 방화벽에서 IPFW 룰셋 사용하기 기사에서는 BSD 초보 사용자조차도 자신의 시스템을 보호할 수 있는 실용적인 방화벽을 신속하게 생성할 수 있는 방법을 설명했습니다. 오늘 저는 기본적인 방화벽으로 시작해서, 규칙을 미세하게 조정하고 다른 PC 들도 인터넷 연결을 공유할 수 있도록 NAT를 설정하고 방화벽의 로그를 살펴보는 방법을 조사하려고 합니다.

규칙 더하기

지난 기사에서 작성했던 rulebase는 여러분의 컴퓨터가 인터넷에 접속하고 방화벽 정책을 설치하기 위해 localhost 상에서 fwbuilder가 SSH를 사용하도록 하였습니다. 이것은 웹을 검색하고 이메일을 보내고 소프트웨어 설치를 위한 pkg_add를 사용하고 소프트웨어 업데이트를 위한 cvsup과 portupgrade를 사용는 것과 기본적인 인터넷 응용프로그램(채팅을 위한 Gaim, 무료 전화통화를 위한 Skype, 음악을 듣기 위한 XMMS, 최신 뉴스를 구독하기 위한RSS feeder)을 사용하는 등의 대부분의 인터넷과 관련된 것들을 할 수 있다는 것을 의미합니다.

때때로 여러분이 만든 방화벽이 차단하는 응용프로그램을 발견할 수 있을 것입니다. 그 이유는 응용프로그램이 패킷을 보내기 위해서는 방화벽에 연결해야 하기 때문입니다. 몇몇 인터넷 게임은 이것을 합니다. 구글 검색을 통하여 여러분의 방화벽에서 어떤 포트를 열어줘야 하는지 알아낼 수 있습니다. 단순히 필요한 포트를 포함하는 TCP나 UDP 오브젝트를 만들고 어떤 소스로붙라도 그 서비스를 허용한다는 규칙을 추가하면 됩니다.

인터넷 게임을 제외한 몇몇 다른 서비스들은 여러분이 의도한대로 동작하지 않을지도 모릅니다. 한가지 예를 들자면, 저는 제가 사용하고 있는 ISP의 POP3 서버로부터 이메일을 다운로드 받기 위해 /usr/ports/mail/fetchmail을 사용합니다. 저는 방화벽을 설치하고 나서 이메일을 보낼 수는 있지만 받을 수 없다는 사실을 발견하고 놀랐습니다. fetchmail은 이메일을 다운로드 받기 위해 ISP에 접속하는 것에는 문제가 없었습니다. fetchmail은 이메일을 저의 inbox에 전달하기 전에 sendmail에 접속하려고 한다는 것이 문제였습니다. 패키지를 설치하고 다음과 같은 규칙을 추가하고 나서야 문제가 사라졌습니다.
Source  Destination  Service  Action  Options  Comment
Any     test:lo0:ip  smtp     Accept           used by fetchmail
fwbuilder를 시작하여 서비스 트리에서 TCP 오브젝트를 오른쪽 버튼 클릭하고 메뉴로부터 New TCP Service를 선택하여 smtp 오브젝트를 생성하였습니다. 이름을 smtp로 하고 목적지 포트 범위 시작을 25로 하였습니다. 목적지는 단지 로컬 메일의 전달에 사용할 루프백 주소임을 주의하시기 바랍니다. 만약 여러분이 fetchmail을 사용하지 않더라도 주기적인 스크립트를 통하여 superuser 계정으로 메일을 성공적으로 보내기 위해서는 여전히 이 규칙을 추가해야 합니다.

여러분은 다른 방화벽 규칙을 추가하기 전까지 ping이 동작하지 않을거라는 사실을 들었을 때 놀랄지도 모르겠습니다. 이것은 ping이 두가지 타입의 ICMP 패킷을 사용하기 때문입니다. 하나의 패킷이 여러분의 컴퓨터로부터 외부로 나가지만(echo request), 여러분의 방화벽이 echo reply 패킷을 들어오도록 허용하지 않으면 여러분의 요청(request) 패킷이 목적지에 도착했는지 알 수 없을 것입니다. 현재의 방화벽 규칙은 오로지 여러분의 패킷이 밖으로 나가는 것만 허용하고 있습니다.

이것을 해결하기 위해서, 두 개의 ICMP 오브젝트를 생성하는 것으로 시작하겠습니다. ICMP에서 오른쪽 버튼을 눌러서 메뉴로부터 New ICMP Service를 선택합니다. 첫 번째 오브젝트에 Echo Request라는 이름을 쓰고 ICMP Type에는 8을 입력하고 ICMP Code에는 0을 입력합니다. 두 번째 ICMP 오브젝트를 만들 때는 이름을 Echo Reply라고 쓰고 ICMP Type과 ICMP Code에 0을 입력합니다.

참고 : 궁금하시다면, IANA로부터 the types and codes for ICMP packets을 참고하시기 바랍니다.

다음으로, 방화벽이 ping이 밖으로 나가는 것만 지원하는지, 아니면 다른 곳에서 여러분의 방화벽으로 ping을 할 수 있게 해줄지 결정해야 합니다. 이 규칙은 모든 ping을 허용할 것입니다.
Source  Destination  Service         Action  Options  Comment
Any     Any          echo request    Accept           Allow all pings
                     echo reply
참고 : 기술적으로, 기존의 방화벽 규칙에서 벌써 바깥으로 나가는 패킷은 허용되기 때문에 echo request 서비스를 추가할 필요는 없습니다. 저는 규칙을 살펴 볼 때마다 그렇게 하는 것이 더 이치에 맞는 것 같아 포함시켜 왔습니다.

여러분이 좀 더 제한적이길 원하고 ping이 밖으로만 나가고 다른 것들이 방화벽으로 ping을 허용하지 않는다면, 규칙을 다음과 같이 수정하시기 바랍니다.
Source  Destination  Service      Action  Options  Comment
Any     firewall     echo reply   Accept           Allow sites I"ve pinged to reply back
다시 말해, echo request가 밖으로 나가는 것을 허용할 필요는 없습니다. 왜냐하면 벌써 그것들이 인터넷에 접속하는 규칙에 해당하기 때문입니다. 그 서비스를 규칙에 포함시킬지는 여러분에게 달려 있습니다.

여러분의 컴퓨터를 인터넷 연결 공유하도록 준비하기

인터넷 연결을 공유하기 위해서 fwbuilder 안에서 여러분이 필요로 하는 규칙을 생성하기 전에, 여러분의 네트워크가 올바르게 설정되어 있는지 확인해야 합니다. fwbuilder가 돌아가고 있는 컴퓨터는 여러분의 홈 네트워크에서 다른 컴퓨터와 통신하는데 사용할 NIC가 설치되어 있어야 합니다. 이 NIC는 여러분의 ISP와 통신하는데 사용하는 하드웨어와는 분리되어 있습니다. cable이나 DSL 연결일 때는 NIC이고 dial-up PPP 연결일 때는 모뎀일지도 모릅니다. 다른 컴퓨터와 통신하기 위해 사용하는 NIC는 반드시 다른 컴퓨터와 같이 동일한 허브나 스위치에 연결되어야 합니다.

또한 여러분 가정의 컴퓨터에 사용할 주소 스키마를 결정할 필요가 있습니다. 가장 쉬운 방법은 사설 주소 영역의 주소 중에서 하나의 주소를 선택하는 방법이다. 이 주소들는 항상 10, 172.16 ~ 172.31이거나 192.168로 시작한다.

저의 예에서는, fwbuilder를 돌리고 있는 FreeBSD 시스템은 Windows XP 시스템과 인터넷 연결을 공유할 것입니다. 저는 BSD 시스템에 주소 10.0.0.1를 할당하고 XP 시스템에 10.0.0.2를 할당했습니다. XP 시스템으로부터 시작하면
  • 제어판에서 네트워크 연결을 선택합니다. (보기 설정에 따라 다르지만 네트워크 연결은 네트워크 및 인터넷 연결 안에 있을 것입니다.)
  • NIC를 나타내는 아이콘을 더블클릭하고 속성을 클릭합니다.
  • 인터넷 프로토콜(TCP/IP)를 더블클릭합니다.
  • 다음 IP 주소 사용 버튼을 클릭하고 IP 주소에 10.0.0.2, 서브넷 마스크에 255.0.0.0, 게이트웨이에 10.0.0.1 을 입력합니다.
  • 기본설정 DNS 서버에서 FreeBSD 시스템의 /etc/resolve.conf에서 찾은 첫 번째 주소를 입력하고 유틸리티를 빠져나올 때까지 계속 OK를 클릭합니다.
FreeBSD 시스템에서는 superuser가 되어 XP 시스템과 통신하는데 사용할 NIC의 이름을 정하기 위해 ifconfig를 입력합니다. 여러 개의 NIC를 사용하고 현재 인터넷에 연결되어 있다면 현재 IP 주소가 설정되지 않은 NIC를 선택합니다. 제 경우에는, rl0은 XP 시스템에 연결하고 xl0은 ISP에 연결하였습니다.
# ifconfig
rl0: flags=8802 mtu 1500
    options=8
    ether 00:11:d8:ea:16:d7
    media: Ethernet autoselect (10baseT/UTP)
    status: active
xl0: flags=8843 mtu 1500
    options=9
    inet 1.2.3.4 netmask 0xffffff00 broadcast 1.2.3.255
    ether 00:04:75:ee:e0:21
    media: Ethernet autoselect (100baseTX )
    status: active
lo0: flags=8049 mtu 16384
    inet 127.0.0.1 netmask 0xff000000
IP주소를 할당하는 것은 간단합니다. (여러분의 FreeBSD 이름을 rl0 으로 대신합니다.)
# ifconfig rL0 10.0.0.1
ping을 사용하여 연결이 잘되어 있는지 재확인해보시기 바랍니다.
# ping 10.0.02
(press ctrl c to end)
방화벽에서 인터넷 연결 공유 설정하기

컴퓨터가 준비되었기 때문에, 여러분의 홈네트워크 상에 컴퓨터를 나타내기 위해서 여러분의 방화벽에 오브젝트를 추가하고, 모든 컴퓨터들의 인터넷 접근이 보장되도록 규칙들을 재 확인하고, 실제 연결 공유가 가능하도록 NAT 규칙을 추가할 때입니다.

컴퓨터들을 네트워크 상에 나타내는데는 몇 가지 방법이 있습니다. 각각의 컴퓨터에 대한 호스트 오브젝트를 생성하거나 여러분의 홈 네트워크에 모든 컴퓨터를 나타나게 하기 위한 네트워크 오브젝트를 생성할 수 있습니다. 저는 단지 또 다른 한대의 컴퓨터만 있기 때문에, 저의 XP 컴퓨터를 나타나게 하기 위해 호스트 오브젝트를 추가하는 것을 선택했습니다.

Hosts를 오른쪽 버튼 클릭하여 메뉴로부터 New Host를 선택합니다. 호스트에 설명적인 이름을 부여합니다. 저는 XP라고 이름짓겠습니다. 인터페이스를 수동으로 설정할 때는 컴퓨터에 IP 주소와 서브넷 마스크를 추가합니다. 나머지 값들은 빈상태로 남겨두면 됩니다. 다만, 주소는 반드시 추가해야 합니다. 저의 경우에는, my_network라는 이름에 10.0.02와 255.0.0.0를 입력하였습니다.

다음으로, 현재 여러분의 방화벽 규칙들을 살펴보고 방화벽 컴퓨터만 이러한 것들을 할 수 있는지 아니면 모든 컴퓨터가 가능해야 하는지 자문해보아야 합니다. 예를 들면, 저는 인터넷 접속을 허용하는 규칙에 대한 Source로 XP 컴퓨터를 추가하였지만, 방화벽 루프백은 단지 방화벽 정책의 설치에 사용되는 SSH 규칙에 대한 Destination으로 남겨두었습니다. 저의 완성된 rulebase는 그림 1과 같습니다.

그림1
그림 1. 필자의 완성된 rulebase

NAT 규칙을 생성하는 것은 쉽습니다. 오른쪽 프레임에서 NAT 탭을 클릭합니다. 여러분의 방화벽 규칙들이 사라질 것입니다. (Policy 탭에서 여전히 사용가능하므로 걱정할 필요는 없습니다) 아직 어떤 NAT 규칙도 생성하지 않았기 때문에, 빈 프레임이 보일 것입니다. 오른쪽 버튼을 클릭하고 Insert Rule을 선택합니다. NAT 규칙이 일반 방화벽 규칙들과 비교해 다른 필드를 포함하고 있다는 것을 주목하시기 바랍니다.
Original Src          default value of Any
Original Dst          default value of Any
Original Svr          default value of Any
Translated Src        default value of Original
Translated Dst        default value of Original
Translated Svr        default value of Original
Comment               empty by default
이것이 여러분이 원하던 것입니다. 여러분의 나머지 컴퓨터가 인터넷에 접속할 때 그것은 방화벽을 지나 ISP에 연결된 인터페이스를 통해 밖으로 나갈 것입니다. 기본값들 중에 2가지를 변경함으로써 그것이 가능한 규칙을 생성합니다.
Original Src        host object
Translated Src        external interface of firewall
저의 경우에는, 그림 2에 보이는 규칙과 같이 호스트 오브젝트를 XP, 외부 방화벽 인터페이스를 ISP라고 명명하였습니다.

그림2
그림 2. 필자의 NAT 규칙

NAT 규칙의 생성을 끝마칠 때 여러분의 정책을 설정하는 것을 잊지 말아야 합니다. 그리고 나서 여러분의 다른 컴퓨터에서 웹사이트에 접속해보시기 바랍니다. 여러분의 인터넷 접속 규칙에 호스트를 추가하는 것을 기억했다면, 모든 것이 잘 동작해야 합니다.

힌트 : 여러분이 ptctl을 사용하여 NAT 규칙을 보고 싶다면, superuser 계정에서 pfctl -s rules 명령을 입력하기 바랍니다. NAT 중계나 현재의 NAT 연결정보를 보기 원한다면 pfctl -s state 명령을 입력하기 바랍니다.

재밌는 것 : 로그 남기기

여러분의 방화벽 로그를 보기 원한다면 몇가지 해야할 일이 있습니다. 첫번째, 여러분의 방화벽 규칙들 중 최소한 하나에 Logging On Action을 선택해야 합니다.

힌트 : 어떤 규칙을 로그에 남길지 결정할 때 현명하게 선택해야 합니다. 만약 모든 것을 로그로 남기려 한다면, 매우 큰 로그파일을 뒤져봐야 할 것입니다. 단지 문제가 있다고 판단될 때만 로그로 남기길 원한다면, 예를 들어 응용프로그램 중에 하나가 방화벽을 통하는 동작이 되지 않는 경우, 문제를 해결하기 전까지 인터넷 연결 규칙에 대해서 임시로 로그를 남기게 할 수 있습니다.

두번째, pflog가 로드되어 있어야 합니다.
# kldstat | grep pflog
7    1 0xc52d4000 2000   pflog.ko
이렇게 보인다면 pflog는 정상적으로 동작하고 있는 것입니다. 여러분의 prompt로 되돌아가려면 모듈을 로드해야 합니다.
# kldload pflog
그리고 부팅시에 모듈을 로드하기 위해 다음 내용을 /etc/rc.conf 에 추가하기 바랍니다.
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
pflog_flags=""
로그파일이 기존에 존재하지 않으면 생성해야 합니다.
# touch /var/log/pflog

# /etc/rc.d/pflog start
Starting pflog.

# /etc/rc.d/pflog status

pflog is running as pid 95363.
여러분은 이제 pflog를 시작할 수 있습니다.

생성된 로그파일이 텍스트 파일이 아니여서 직접 읽어갈 수 없으면 로그를 보기 위해 tail -f 와 같은 유틸리티를 사용해야 합니다.

여기서는 대신에 tcpdump를 사용합니다.
# tcpdump -n -e -ttt -r /var/log/pflog
크기가 커지고 있는 파일을 보기 위해서는 다음과 같이 사용합니다.
# tcpdump -n -e -ttt -i pflog0
일반적으로, 로그를 보기 위한 다소 긴 명령어가 몇 개 있습니다. 몇 개의 키 바인딩을 생성할 좋은 때입니다. 이 바인딩들은 터미널로부터 동작하기 때문에 GUI 대신에 Alt-F2를 사용하여 그것을 동작시킵니다. 첫 번째 명령어는 로그파일을 읽는 명령어에 Ctrl-L을 바인딩시킬 것이다. 그리고 두 번째 명령어는 점점 커지는 로그를 보기 위한 명령어에 Ctrl-g를 바인딩시킬 것이다.
# bindkey -s "^L" "tcpdump -n -e -ttt -r /var/log/pflog"
# bindkey -s "^g" "tcpdump pn -e -ttt -i pflog0"
Ctrl-L이나 Ctrl-g를 누르는 것이 훨씬 빠르다는 것을 알 수 있습니다. GUI에서 바인딩을 사용하려면 xbindkeys_config를 설치하고 설정해야 합니다.

더 재밌는 것 : 향상된 로그 남기기

키 바인딩을 사용해도 tcpdump는 아직도 다소 불편하다. 이것은 로그 목록을 단순한 텍스트로 표시합니다. 현재로서는 GUI로 된 pflog entry reader가 없지만, 로그를 브라우저에서 볼 수 있는 HTML 형식으로 수정할 수 있습니다. pflogx 유틸리티를 설치하는 것부터 시작하기 바랍니다.
# cd /usr/ports/sysutils/pflogx
# make install
필자는 바이너리 패키지가 아닌 포트를 설치하도록 선택했고 make를 위한 clean을 사용하지 않았음을 참고하시기 바랍니다. 왜냐하면 패키지에 함께 포함되어 있지 않은 .xsl 파일을 사용하기 원했기 때문입니다. make clean은 그것을 삭제할 것입니다. 또한 설치하는 동안 Expat을 사용하는지 물어보는 메뉴를 보게 될 것입니다. 이 옵션을 선택하면 로그파일을 병합하는 기능을 사용할 수 있도록 해줍니다.

설치를 다 끝냈다면, 설치된 .xsl 파일을 확인해야 합니다.
# ls pflogx/work/xsl
export_csv.xsl        export_xhtml.xsl    last_date.xsl
export_html.xsl       first_date.xsl
/usr/local/share/doc/pflogx/README 파일에는 pflogx를 사용하는 방법과 각각의 .xls 파일에 대한 설명이 들어 있습니다.

여기에 여러분이 시작하게 될 예제가 있다. 로그파일을 입력(-i) 으로 사용하여 XML 파일을 출력(-o)으로 생성합니다.
# pflogx -i /var/log/pflog -o ~/log.xml
export_html.xsl 파일을 여러분의 홈디렉토리에 복사해야 합니다.
# cp /usr/ports/sysutils/pflogx/work/pflogx/xsl/export_html.xsl ~
여러분이 자주 사용하는 에디터로 ~/log.xml 파일을 열면 다음과 같은 첫 번째 줄을 볼 수 있습니다.

그 줄 오른쪽에 다음과 같이 추가합니다.

변경사항을 저장한 후에 브라우저에 log.xml 파일에 대한 전체 경로를 입력합니다. 그러면 그림 3과 같은 것을 볼 수 있다.

그림3
그림 3. HTML로 된 방화벽 로그 리포트

읽을 거리 추천

지금까지 pf의 기능을 대충 살펴보았습니다. 고급 유저들은 이러한 기능들을 fwbuilder로 통합하는 방법을 조사할 수 있을 것입니다. 여기에 여러분이 시작할 읽을거리가 있습니다. 여러분의 방화벽 오브젝트에서 오른쪽 버튼을 누르고 Edit - Firewall Settings을 선택하면 많은 흥미로운 설정 옵션들을 볼 수 있다. altq나 carp와 같은 fwbuilder가 현재 지원하지 않는 몇몇 pf의 기능을 충족하려면, Prolog/Epilog 탭에 필요한 내용을 추가하면서 실험해보기 바랍니다.

Dru Laviqne는 Ottawa에 소재한 Marketbridge Technology 의 교수이며 Open Protocol Resource의 운영자이다.
TAG :
댓글 입력
자료실

최근 본 책0