리눅스 커널은 Netfilter 서브 시스템을 포함하고, 이것은 여러분 서버로 오는 또는 경유하는 네트워크 트래픽을 조작하거나 운명을 결정하는데 사용 됩니다. 모든 현대적인 리눅스 방화벽 솔루션은 패킷을 걸러내기 위하여 이 시스템을 사용 합니다.
커널의 패킷 필터링 시스템은 그것을 관리하기 위한 사용자 공간의 인터페이스가 없이 시스템 관리자가 약간의 작업을 하는 것이 필요 합니다. 이것은 iptables의 목적 입니다. 패킷이 여러분의 서버에 도착할 때, 패킷은 iptables를 통하여 사용자 공간에서 패킷에 제공되는 규칙에 근거하여 패킷의 수용, 조작 또는 거절을 위한 Netfilter 서브 시스템을 거치게 됩니다. 그러므로, iptables는, 만약 여러분이 그것에 익숙하다면, 여러분의 방화벽을 관리하기 위하여 필요한 전부이고, 작업을 단순화하기 위한 많은 프론트엔드들이 있습니다.
IP 마스커레이딩(Masquerading:가장)의 목적은 여러분의 네트워크 상의 사설, 라우팅이 안되는 IP 주소를 가진 기계들이 IP의 가장을 통하여 인터넷을 접근하는 것을 허용하기 위해서 입니다. 여러분의 사설 네트워크에서 인터넷을 목적지로 하는 트래픽은 반드시, 그 요청을 만든 기계로 경로가 되돌아갈 수 있는 응답들을 위하여, 조작되어져야 합니다. 이것을 하기 위하여, 커널은 반드시 각각의 패킷의 source IP 어드레스를 변경하고, 그러므로 응답은 인터넷에서 사용 가능하지 않은 요청을 만든 사설 IP 주소 대신에 변경된 것에 따라 다시 되돌아오게 됩니다. 리눅스는 기계가 속하는 접속과 되돌와오는 패킷을 적절하게 재경로하는 것을 추적하기 위하여 접속 추적 (conntrack)을 사용 합니다. 그러므로 여러분의 사설 네트워크를 떠난 트래픽은 여러분의 우분투 게이트웨이 기계로 향할 때 "가장"이 됩니다. 이 절차는 인터넷 접속 공유로 마이크로소프트의 문서에서는 알려져 있습니다.
이것은 하나의 iptables 규칙을 가지고 완수할 수 있고, 여러분의 네트워크 설정에 따라 약간 다를 수 있습니다:
sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o ppp0 -j MASQUERADE
위의 명령은 여러분의 사설 주소 공간이 192.168.0.0/16 이고 인터넷을 사용하는 장치가 ppp0 라고 가정을 합니다. 문법은 다음과 같이 나누어질 수 있습니다:
-t nat -- nat 테이블로 가기 위한 규칙
-A POSTROUTING -- POSTROUTING chain에 덧붙이는(-A) 규칙
-s 192.168.0.0/16 -- 지정된 주소 공간에서 향하는 트래픽에 적용하는 규칙
-o ppp0 -- 지정된 네트워크 장치를 통하여 경유하도록 스케쥴된 트래픽에 적용하는 규칙
-j MASQUERADE -- 위에 설명된 대로 이 규칙에 일치하는 트래픽은 조작되기 위한 MASQUERADE 타켓으로 "jump" (-j)
필터 테이블 (대부분 또는 모든 패킷 필터링이 일어나는 기본 설정 테이블) 내의 각 체인은 ACCEPT 정책 을 기본값으로 갖지만, 만약 여러분이 게이트웨이 장치에 추가로 방화벽을 설정한다면, DROP 또는 REJECT 정책을 지정할 수 있고, 그 경우에는 여러분의 가장된 트래픽은 위의 규칙이 동작을 하기 위하여 FORWARD 체인을 통하는 것이 허용되어야 합니다:
sudo iptables -A FORWARD -s 192.168.0.0/16 -o ppp0 -j ACCEPT↵ sudo iptables -A FORWARD -d 192.168.0.0/16 -m state --state ESTABLISHED,RELATED -i ppp0 -j ACCEPT
위의 명령은 여러분의 로컬 네트워크에서 인터넷으로 가는 모든 접속과 그 접속에 관련되는 모든 트래픽이 위의 규칙을 시작한 (즉 여러분의) 기계로 되돌아오는 것을 허용 합니다.
두려운 iptables의 지식이 없이도 완전하게 방화벽을 구축할 수 있도록 도와주는 여러가지 도구들이 있습니다. GUI로 편하게 사용할 수 있는 것은, Firestarter 가 아주 유명하고 사용하기도 쉽고, fwbuilder 는 매우 강력하고 Checkpoint FireWall-1과 같은 상업용 방화벽을 사용해 본 시스템 관리자에게 익숙하게 보일 겁니다. 평범한 텍스트 설정 파일을 가지는 명령어 라인 도구를 선호한다면, Shorewall 은 어떠한 네트워크를 위해서도 우수한 방화벽을 설정할 수 있도록 도와주는 매우 강력한 솔루션 입니다. 만약 여러분의 네트워크가 비교적 간단하거나, 또는 네트워크를 가지고 있지 않다면, ipkungfu 를 사용하면 따로 설정하는 것 없이 설치시 바로 동작하는 방화벽을 제공할 것이고, 좀더 발전된 방화벽을 설정하는 것은 간단하고 문서화가 잘 된 설정 파일을 편집하는 것으로 쉽게 만들 수 있습니다. 또다른 흥미로운 도구는 fireflier 이고, 데스크탑 방화벽 프로그램으로 고안된 것 입니다. 이것은 서버 (fireflier-server) 와 여러분이 선택하는 GUI 클라이언트 (GTK 또는 QT) 로 구성되고, 윈도우즈를 위한 많은 유명한 상호작용 방화벽과 같이 동작을 합니다.
방화벽 로그는 공격, 방화벽 규칙의 문제 파악, 그리고 여러분 네트워크 상의 비정상적인 행동을 알아낼 수 있는 필수적인 것 입니다. 여러분은 반드시 방화벽 설정에 로그가 만들어지도록 로그 규칙을 포함시키고, 로그 규칙은 어떠한 적용된 끝내기 규칙 (타겟을 가지고 ACCEPT, DROP, 또는 REJECT와 같이 패킷의 운명을 결정하는 규칙) 전에 반드시 오도록 해야 합니다. 예를 들어:
sudo iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j LOG --log-prefix "NEW_HTTP_CONN: "
로컬 기계에서 포트 80 번의 요청은 dmesg 내의 로그로 만들어지고 다음과 같이 보일 겁니다:
[4304885.870000] NEW_HTTP_CONN: IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=58288 DF PROTO=TCP SPT=53981 DPT=80 WINDOW=32767 RES=0x00 SYN URGP=0
위의 로그는 또한 /var/log/messages
, /var/log/syslog
, 그리고 /var/log/kern.log
파일에도 나타납니다. 이 동작은 /etc/syslog.conf
파일을 적당하게 편집하거나, ulogd 를 설치/설정하고 LOG 대신에 ULOG 타켓을 사용하는 것으로 변경될 수 있습니다. ulogd 데몬은 사용자 공간의 서버이고 특별히 방화벽을 위한 커널에서 오는 로깅 지시를 듣고, 여러분이 원하는 어떠한 파일, 또는 심지어 PostgreSQL 과 MySQL 데이타베이스로 기록을 할 수 있습니다. 방화벽 로그를 알아보기 쉽게 꾸미는 것은 fwanalog, fwlogwatch, 또는 lire 같은 로그 분석 도구를 사용하는 것으로 간단해 질 수 있습니다.