UFWHowToKo
서문
이 문서는 Firewall and Masquerading using iptables howto 문서의 내용 진행에 따라 Ubuntu 배포판에 맞춰 별도의 내용을 진행하기 위해 우분투 공식 위키의 Uncomplicated Firewall 소개문과 공식 HOWTO 문서 번역을 정리하려는 목적으로 신설했다.
소개 장의 개요 절은 공식 위키 문서에서, 그 밖의 내용은 공식 HOWTO 문서의 내용에서 그대로 가져온 내용이다.
소개
개요
우분투 리눅스 커널에서는 netfilter라는 패킷 선별 시스템을 제공하며, netfilter의 동작을 처리할 기존의 인터페이스로 iptables 명령 모음이 있다. iptables에서는 다방면에 있어 설정 가능하며 상당히 유연한 완벽한 방화벽 체계를 제공한다.
iptables에 숙달하려면 시간이 상당히 걸리고, iptables만을 사용하여 netfilter 방화벽 구축을 시작하는건 상당히 버거운 일이 될 수 있다. 결과적으로 iptables에 대한 여러가지 프론트엔드는 몇년동안 만들어졌고, 이들 도구는 각 사용자를 대상으로 다양한 결과를 도출하려하였다.
Uncomplicated Firewall(ufw)<ref>말 그대로 "안 복잡한 방화벽"이다.</ref>는 호스트 기반 방화벽에 일부 안성맞춤인 iptables용 프론트엔드다. ufw에서는 netfilter를 관리하는 프레임워크와, 방화벽을 처리할 명령행 인터페이스를 제공한다. ufw는 네트워크에 어떤 조치를 취하고 있는지 알고 있는 관리자를 돕기 위해 iptables 명령 집합을 단순화 함과 동시에, 방화벽 개념을 전혀 알지 못하는 사람들에게도 쉽게 사용할 수 있도록 인터페이스를 제공하는 것이 목적이다. ufw는 다른 배포판과 GUI 프론트엔드의 업스트림 프로젝트이며 런치패드에서 관리<ref>ufw in Launchpad</ref>하고 있다.
UFW - Uncomplicated Firewall
어쨌거나 우분투에서 사용하는 기본 방화벽 설정 도구는 ufw다. 위에서 설명한대로 iptables 방화벽 설정을 용이하게 하도록 개발했으며, IPv4 또는 IPv6 호스트 기반 방화벽에 대한 사용자 친화 설정 방식을 제공한다. 기본적으로 (레드햇 계열 배포판과는 달리) UFW는 비활성 상태이다.
기본 문법 예제
보편적인 일반 사용자들이 써먹을만한 기본 규칙
UFW를 활성화하면 보편적인 일반 사용자들이 써먹을만한 규칙(프로파일) 모음을 사용한다. 이 설정 내용이 바로 우분투 개발자들의 최소한의 목표이다. 그러니까 ... 간단하게 말해서, 일반 사용자들이 동작을 쉽게 이해하라고 넣어둔 설정에서는, 일부 예외 규칙을 통해 일부만 허용하고 모든 들어오는 패킷을 차단한다.
활성/비활성
UFW 활성
기본 규칙 설정 모음을 기반으로 UFW 서비스를 시작하려면 <syntaxhighlight lang="bash"> sudo ufw enable </syntaxhighlight>
UFW 상태를 살펴보려면 <syntaxhighlight lang="bash"> sudo ufw status verbose </syntaxhighlight>
위 명령의 출력은 대략 다음과 같다: <syntaxhighlight lang="bash"> youruser@yourcomputer:~$ sudo ufw status verbose [sudo] password for youruser: Status: active Logging: on (low) Default: deny (incoming), allow (outgoing) New profiles: skip youruser@yourcomputer:~$ </syntaxhighlight>
들어오는 패킷은 기본적으로 무시한다. 이 명령을 실행하면 일부 예외 규칙을 살펴볼 수 있다. <syntaxhighlight lang="bash"> sudo ufw show raw </syntaxhighlight>
/etc/ufw 디렉터리를 열어보면 어떤 규칙을 지정했는지 살펴볼 수 있다(해당 규칙 파일은 .rules로 끝난다).
UFW 비활성
방화벽을 끄려면, <syntaxhighlight lang="bash"> sudo ufw disable </syntaxhighlight>
허용 및 무시(개별 규칙 설정)
허용
<syntaxhighlight lang="bash"> sudo ufw allow <port>/<optional: protocol> </syntaxhighlight>
예: 53번 포트의 TCP, UDP 패킷 반입 허용 <syntaxhighlight lang="bash"> sudo ufw allow 53 </syntaxhighlight>
예: 53번 포트의 TCP 패킷 반입 허용 <syntaxhighlight lang="bash"> sudo ufw allow 53/tcp </syntaxhighlight>
예: 53번 포트의 UDP 패킷 반입 허용 <syntaxhighlight lang="bash"> sudo ufw allow 53/udp </syntaxhighlight>
무시
<syntaxhighlight lang="bash"> sudo ufw deny <port>/<별도지정: 프로토콜. tcp,udp> </syntaxhighlight>
예: 53번 포트의 TCP, UDP 패킷 반입 무시 <syntaxhighlight lang="bash"> sudo ufw deny 53 </syntaxhighlight>
예: 53번 포트의 TCP 패킷 반입 무시 <syntaxhighlight lang="bash"> sudo ufw deny 53/tcp </syntaxhighlight>
예: 53번 포트의 UDP 패킷 반입 무시 <syntaxhighlight lang="bash"> sudo ufw deny 53/udp </syntaxhighlight>
기존 규칙 삭제
규칙을 삭제하려면 기존 규칙 내용앞에 delete 를 붙이면 된다. 가령 기존 규칙이 다음 명령과 같다면, <syntaxhighlight lang="bash"> ufw deny 80/udp </syntaxhighlight>
다음 명령을 내리면 된다: <syntaxhighlight lang="bash"> sudo ufw delete deny 80/udp </syntaxhighlight>
서비스
ufw는 /etc/services에서 서비스 이름으로 포트번호를 자동으로 부여하므로 서비스 이름으로 패킷의 흐름을 통제할 수 있다. 서비스 목록을 보려면 다음 명령을 내리면 된다: <syntaxhighlight lang="bash"> less /etc/services </syntaxhighlight>
서비스 이름으로 허용 설정
<syntaxhighlight lang="bash"> sudo ufw allow <서비스 이름> </syntaxhighlight>
예: ssh 서비스를 이름을 입력하여 허용 <syntaxhighlight lang="bash"> sudo ufw allow ssh </syntaxhighlight>
서비스 이름으로 무시 설정
<syntaxhighlight lang="bash"> sudo ufw deny <서비스 이름> </syntaxhighlight>
예: ssh 서비스를 이름을 입력하여 거절 <syntaxhighlight lang="bash"> sudo ufw deny ssh </syntaxhighlight>
상태
| 중요 | |
| ufw에서 상태를 살펴볼때 ufw가 동작중인지, iptables에 반영한 현재 ufw 규칙은 어떤 내용이 있는지 보여준다. |
ufw 상태를 살펴보려면: <syntaxhighlight lang="bash"> sudo ufw status
Firewall loaded
To Action From -- ------ ---- 22:tcp DENY 192.168.0.1 22:udp DENY 192.168.0.1 22:tcp DENY 192.168.0.7 22:udp DENY 192.168.0.7 22:tcp ALLOW 192.168.0.0/24 22:udp ALLOW 192.168.0.0/24 </syntaxhighlight>
ufw가 동작중이 아닐 경우 출력 내용은 다음과 같다: <syntaxhighlight lang="bash"> sudo ufw status Status: inactive </syntaxhighlight>
상태 기록
상태 기록을 활성화 하려면: <syntaxhighlight lang="bash"> sudo ufw logging on </syntaxhighlight>
상태 기록을 비활성화 하려면: <syntaxhighlight lang="bash"> sudo ufw logging off </syntaxhighlight>
고급 문법
근원, 대상 주소, 포트 번호, 프로토콜을 포함한 더 완벽한 문법을 활용할 수 있다.
접근 허용
이 섹션에서는 개별 접근 허용 방법을 보여준다.
개별 IP 허용
<syntaxhighlight lang="bash"> sudo ufw allow from <IP 주소> </syntaxhighlight>
예: 207.46.232.182에서 오는 패킷 허용 <syntaxhighlight lang="bash"> sudo ufw allow from 207.46.232.182 </syntaxhighlight>
서브넷 설정으로 다수 클라이언트 허용
CIDR 주소 방식<ref>Classless Inter-domain Routing - Wikipedia</ref>으로 넷 마스크를 사용할 수 있다: <syntaxhighlight lang="bash"> sudo ufw allow from 192.168.1.0/24 </syntaxhighlight>
개별 IP 주소 및 포트 허용
<syntaxhighlight lang="bash"> sudo ufw allow from <대상IP> to <목적서비스:any> port <포트번호> </syntaxhighlight>
예: 192.168.0.4 호스트의 모든 프로토콜(TCP/UDP)에 대한 22번 포트 접속 허용 <syntaxhighlight lang="bash"> sudo ufw allow from 192.168.0.4 to any port 22 </syntaxhighlight>
개별 IP 주소, 포트, 프로토콜 허용
<syntaxhighlight lang="bash"> sudo ufw allow from <대상IP> to <목적서비스:any> port <포트번호> proto <프로토콜> </syntaxhighlight>
예: 192.168.0.4 호스트의 모든 프로토콜에 대한 22번 TCP 포트 접속 허용 <syntaxhighlight lang="bash"> sudo ufw allow from 192.168.0.4 to any port 22 proto tcp </syntaxhighlight>
ICMP PING 활성화
| 참고 | |
| 실체 없는 보안은 최신 보안 무효화 스크립트가 동작하기에는 덜 유리하다. 기본적으로 UFW는 ping 요청을 허용한다. 네트워크 문제를 진단할 수 있게 (ICMP) ping 요청 허용 여부를 그대로 두었음을 확인할 수 있다. |
ping(ICMP) 요청을 비활성화하려면, /etc/ufw/before.rules를 열어 다음 줄을 제거하면 된다: <syntaxhighlight lang="bash">
- ok icmp codes
-A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT -A ufw-before-input -p icmp --icmp-type source-quench -j ACCEPT -A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT -A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT -A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT </syntaxhighlight>
또는 "ACCEPT"를 "DROP"으로 바꾸도록. <syntaxhighlight lang="bash">
- ok icmp codes
-A ufw-before-input -p icmp --icmp-type destination-unreachable -j DROP -A ufw-before-input -p icmp --icmp-type source-quench -j DROP -A ufw-before-input -p icmp --icmp-type time-exceeded -j DROP -A ufw-before-input -p icmp --icmp-type parameter-problem -j DROP -A ufw-before-input -p icmp --icmp-type echo-request -j DROP </syntaxhighlight>
접근 거부
개별 IP 거부
<syntaxhighlight lang="bash"> sudo ufw deny from <IP 주소> </syntaxhighlight>
예: 207.46.232.182에서 오는 패킷 차단 <syntaxhighlight lang="bash"> sudo ufw deny from 207.46.232.182 </syntaxhighlight>
개별 IP 주소 및 포트 거부
<syntaxhighlight lang="bash"> sudo ufw deny from <대상IP> to <목적서비스:any> port <포트번호> </syntaxhighlight>
예: 192.168.0.4 호스트의 모든 프로토콜(TCP/UDP)에 대한 22번 포트 접속 거부 <syntaxhighlight lang="bash"> sudo ufw deny from 192.168.0.1 to any port 22 </syntaxhighlight>
번호 부여 규칙으로 설정
참조 번호로 규칙 조회
규칙 순서와 규칙의 ID 번호를 표시하기 위해 status numbered 명령을 사용할 수 있다.
번호 부여 규칙 편집
번호 부여 규칙 삭제
번호를 지정하여 규칙을 삭제할 수 있다. 다음 명령은 첫번째 규칙을 삭제하고 나머지 규칙 목록에 다시 순서대로 번호를 부여한다. <syntaxhighlight lang="bash"> sudo ufw delete 1 </syntaxhighlight>
번호 부여 규칙 삽입
번호를 부여하여 지정한 순서 위치에 규칙을 넣는다. <syntaxhighlight lang="bash"> sudo ufw insert 1 allow from <IP 주소> </syntaxhighlight>
고급 예제
상황 가정: 192.168.0.1과 192.168.0.7에서의 22번 포트 접속을 차단하고 나머지 192.168.0.x 주소에서의 22번 TCP 포트 접속을 허용하려고 한다. <syntaxhighlight lang="bash"> sudo ufw deny from 192.168.0.1 to any port 22 sudo ufw deny from 192.168.0.7 to any port 22 sudo ufw allow from 192.168.0.0/24 to any port 22 proto tcp </syntaxhighlight>
| 참고 | |
| 이 명령은 개별 지정 규칙을 우선으로 설정하고 좀 더 일반적인 규칙은 나중에 설정한다. 들어오는 패킷이 규칙에 일치하면, 다른 규칙은 적용하지 않으므로(하단 설명 참고), 개별 지정 규칙을 우선 설정해야한다. 규칙을 바꿀 때 올바른 순서대로 새 규칙을 넣었는지 확인하려면 이전 규칙을 삭제해야 한다. |
규칙 순서를 확인하려 상태를 확인할 수 있다. 상황 가정에 따르면 하단 출력 결과는 규칙을 제대로 설정했을 경우 나와야 할 결과 내용이다. <syntaxhighlight lang="bash"> sudo ufw status Firewall loaded
To Action From -- ------ ---- 22:tcp DENY 192.168.0.1 22:udp DENY 192.168.0.1 22:tcp DENY 192.168.0.7 22:udp DENY 192.168.0.7 22:tcp ALLOW 192.168.0.0/24 </syntaxhighlight>
상황 가정 변경: 이젠 192.168.0.3도 22번 포트 접근을 차단해보자. <syntaxhighlight lang="bash"> sudo ufw delete allow from 192.168.0.0/24 to any port 22 sudo ufw status Firewall loaded
To Action From -- ------ ---- 22:tcp DENY 192.168.0.1 22:udp DENY 192.168.0.1 22:tcp DENY 192.168.0.7 22:udp DENY 192.168.0.7
sudo ufw deny 192.168.0.3 to any port 22 sudo ufw allow 192.168.0.0/24 to any port 22 proto tcp sudo ufw status
Firewall loaded
To Action From -- ------ ---- 22:tcp DENY 192.168.0.1 22:udp DENY 192.168.0.1 22:tcp DENY 192.168.0.7 22:udp DENY 192.168.0.7 22:tcp DENY 192.168.0.3 22:udp DENY 192.168.0.3 22:tcp ALLOW 192.168.0.0/24 </syntaxhighlight>
| 중요 | |
| 거절 규칙을 추가하기만 하면, 거절 규칙 대신 상단의 허용 규칙을 받아들인다. |
기록 항목 해석
- Note: UFW 동작 기록 안내서/따라하기 문서 게시글의 답글 내용을 기반으로 한 것 같다.
SRC 값과 DST 값이 함께 있는 SPT 값과 DPT 값은 방화벽 동작 기록을 해석할 때 주목해야 할 값이다.
임의 동작 기록 항목
Feb 4 23:33:37 hostname kernel: [ 3529.289825] [UFW BLOCK] IN=eth0 OUT= MAC=00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd SRC=444.333.222.111 DST=111.222.333.444 LEN=103 TOS=0x00 PREC=0x00 TTL=52 ID=0 DF PROTO=UDP SPT=53 DPT=36427 LEN=83
참고자료
<references/>