UFWHowToKo

깊이있는 삽질 Ubuntu Korea Community Wiki
이동: 둘러보기, 검색

서문[편집]

이 문서는 Firewall and Masquerading using iptables howto 문서의 내용 진행에 따라 Ubuntu 배포판에 맞춰 별도의 내용을 진행하기 위해 우분투 공식 위키의 Uncomplicated Firewall 소개문과 공식 HOWTO 문서 번역을 정리하려는 목적으로 신설했다.

소개 장의 개요 절은 공식 위키 문서에서, 그 밖의 내용은 공식 HOWTO 문서의 내용에서 그대로 가져온 내용이다.

소개[편집]

개요[편집]

우분투 리눅스 커널에서는 netfilter라는 패킷 선별 시스템을 제공하며, netfilter의 동작을 처리할 기존의 인터페이스로 iptables 명령 모음이 있다. iptables에서는 다방면에 있어 설정 가능하며 상당히 유연한 완벽한 방화벽 체계를 제공한다.

iptables에 숙달하려면 시간이 상당히 걸리고, iptables만을 사용하여 netfilter 방화벽 구축을 시작하는건 상당히 버거운 일이 될 수 있다. 결과적으로 iptables에 대한 여러가지 프론트엔드는 몇년동안 만들어졌고, 이들 도구는 각 사용자를 대상으로 다양한 결과를 도출하려하였다.

Uncomplicated Firewall(ufw)[1]는 호스트 기반 방화벽에 일부 안성맞춤인 iptables용 프론트엔드다. ufw에서는 netfilter를 관리하는 프레임워크와, 방화벽을 처리할 명령행 인터페이스를 제공한다. ufw는 네트워크에 어떤 조치를 취하고 있는지 알고 있는 관리자를 돕기 위해 iptables 명령 집합을 단순화 함과 동시에, 방화벽 개념을 전혀 알지 못하는 사람들에게도 쉽게 사용할 수 있도록 인터페이스를 제공하는 것이 목적이다. ufw는 다른 배포판과 GUI 프론트엔드의 업스트림 프로젝트이며 런치패드에서 관리[2]하고 있다.

UFW - Uncomplicated Firewall[편집]

어쨌거나 우분투에서 사용하는 기본 방화벽 설정 도구는 ufw다. 위에서 설명한대로 iptables 방화벽 설정을 용이하게 하도록 개발했으며, IPv4 또는 IPv6 호스트 기반 방화벽에 대한 사용자 친화 설정 방식을 제공한다. 기본적으로 (레드햇 계열 배포판과는 달리) UFW는 비활성 상태이다.

기본 문법 예제[편집]

보편적인 일반 사용자들이 써먹을만한 기본 규칙[편집]

UFW를 활성화하면 보편적인 일반 사용자들이 써먹을만한 규칙(프로파일) 모음을 사용한다. 이 설정 내용이 바로 우분투 개발자들의 최소한의 목표이다. 그러니까 ... 간단하게 말해서, 일반 사용자들이 동작을 쉽게 이해하라고 넣어둔 설정에서는, 일부 예외 규칙을 통해 일부만 허용하고 모든 들어오는 패킷을 차단한다.

활성/비활성[편집]

UFW 활성[편집]

기본 규칙 설정 모음을 기반으로 UFW 서비스를 시작하려면

sudo ufw enable

UFW 상태를 살펴보려면

sudo ufw status verbose

위 명령의 출력은 대략 다음과 같다:

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:~$

들어오는 패킷은 기본적으로 무시한다. 이 명령을 실행하면 일부 예외 규칙을 살펴볼 수 있다.

sudo ufw show raw

/etc/ufw 디렉터리를 열어보면 어떤 규칙을 지정했는지 살펴볼 수 있다(해당 규칙 파일은 .rules로 끝난다).

UFW 비활성[편집]

방화벽을 끄려면,

sudo ufw disable

허용 및 무시(개별 규칙 설정)[편집]

허용[편집]

sudo ufw allow <port>/<optional: protocol>

예: 53번 포트의 TCP, UDP 패킷 반입 허용

sudo ufw allow 53

예: 53번 포트의 TCP 패킷 반입 허용

sudo ufw allow 53/tcp

예: 53번 포트의 UDP 패킷 반입 허용

sudo ufw allow 53/udp

무시[편집]

sudo ufw deny <port>/<별도지정: 프로토콜. tcp,udp>

예: 53번 포트의 TCP, UDP 패킷 반입 무시

sudo ufw deny 53

예: 53번 포트의 TCP 패킷 반입 무시

sudo ufw deny 53/tcp

예: 53번 포트의 UDP 패킷 반입 무시

sudo ufw deny 53/udp

기존 규칙 삭제[편집]

규칙을 삭제하려면 기존 규칙 내용앞에 delete 를 붙이면 된다. 가령 기존 규칙이 다음 명령과 같다면,

ufw deny 80/udp

다음 명령을 내리면 된다:

sudo ufw delete deny 80/udp

서비스[편집]

ufw는 /etc/services에서 서비스 이름으로 포트번호를 자동으로 부여하므로 서비스 이름으로 패킷의 흐름을 통제할 수 있다. 서비스 목록을 보려면 다음 명령을 내리면 된다:

less /etc/services

서비스 이름으로 허용 설정[편집]

sudo ufw allow <서비스 이름>

예: ssh 서비스를 이름을 입력하여 허용

sudo ufw allow ssh

서비스 이름으로 무시 설정[편집]

sudo ufw deny <서비스 이름>

예: ssh 서비스를 이름을 입력하여 거절

sudo ufw deny ssh

상태[편집]

  중요
  ufw에서 상태를 살펴볼때 ufw가 동작중인지, iptables에 반영한 현재 ufw 규칙은 어떤 내용이 있는지 보여준다.

ufw 상태를 살펴보려면:

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

ufw가 동작중이 아닐 경우 출력 내용은 다음과 같다:

sudo ufw status
Status: inactive

상태 기록[편집]

상태 기록을 활성화 하려면:

sudo ufw logging on

상태 기록을 비활성화 하려면:

sudo ufw logging off

고급 문법[편집]

근원, 대상 주소, 포트 번호, 프로토콜을 포함한 더 완벽한 문법을 활용할 수 있다.

접근 허용[편집]

이 섹션에서는 개별 접근 허용 방법을 보여준다.

개별 IP 허용[편집]

sudo ufw allow from <IP 주소>

예: 207.46.232.182에서 오는 패킷 허용

sudo ufw allow from 207.46.232.182

서브넷 설정으로 다수 클라이언트 허용[편집]

CIDR 주소 방식[3]으로 넷 마스크를 사용할 수 있다:

sudo ufw allow from 192.168.1.0/24

개별 IP 주소 및 포트 허용[편집]

sudo ufw allow from <대상IP> to <목적서비스:any> port <포트번호>

예: 192.168.0.4 호스트의 모든 프로토콜(TCP/UDP)에 대한 22번 포트 접속 허용

sudo ufw allow from 192.168.0.4 to any port 22

개별 IP 주소, 포트, 프로토콜 허용[편집]

sudo ufw allow from <대상IP> to <목적서비스:any> port <포트번호> proto <프로토콜>

예: 192.168.0.4 호스트의 모든 프로토콜에 대한 22번 TCP 포트 접속 허용

sudo ufw allow from 192.168.0.4 to any port 22 proto tcp

ICMP PING 활성화[편집]

  참고
  실체 없는 보안은 최신 보안 무효화 스크립트가 동작하기에는 덜 유리하다. 기본적으로 UFW는 ping 요청을 허용한다. 네트워크 문제를 진단할 수 있게 (ICMP) ping 요청 허용 여부를 그대로 두었음을 확인할 수 있다.

ping(ICMP) 요청을 비활성화하려면, /etc/ufw/before.rules를 열어 다음 줄을 제거하면 된다:

# 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

또는 "ACCEPT"를 "DROP"으로 바꾸도록.

# 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

접근 거부[편집]

개별 IP 거부[편집]

sudo ufw deny from <IP 주소>

예: 207.46.232.182에서 오는 패킷 차단

sudo ufw deny from 207.46.232.182

개별 IP 주소 및 포트 거부[편집]

sudo ufw deny from <대상IP> to <목적서비스:any> port <포트번호>

예: 192.168.0.4 호스트의 모든 프로토콜(TCP/UDP)에 대한 22번 포트 접속 거부

sudo ufw deny from 192.168.0.1 to any port 22

번호 부여 규칙으로 설정[편집]

참조 번호로 규칙 조회[편집]

규칙 순서와 규칙의 ID 번호를 표시하기 위해 status numbered 명령을 사용할 수 있다.

번호 부여 규칙 편집[편집]

번호 부여 규칙 삭제[편집]

번호를 지정하여 규칙을 삭제할 수 있다. 다음 명령은 첫번째 규칙을 삭제하고 나머지 규칙 목록에 다시 순서대로 번호를 부여한다.

sudo ufw delete 1

번호 부여 규칙 삽입[편집]

번호를 부여하여 지정한 순서 위치에 규칙을 넣는다.

sudo ufw insert 1 allow from <IP 주소>

고급 예제[편집]

상황 가정: 192.168.0.1과 192.168.0.7에서의 22번 포트 접속을 차단하고 나머지 192.168.0.x 주소에서의 22번 TCP 포트 접속을 허용하려고 한다.

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
  참고
  이 명령은 개별 지정 규칙을 우선으로 설정하고 좀 더 일반적인 규칙은 나중에 설정한다. 들어오는 패킷이 규칙에 일치하면, 다른 규칙은 적용하지 않으므로(하단 설명 참고), 개별 지정 규칙을 우선 설정해야한다. 규칙을 바꿀 때 올바른 순서대로 새 규칙을 넣었는지 확인하려면 이전 규칙을 삭제해야 한다.

규칙 순서를 확인하려 상태를 확인할 수 있다. 상황 가정에 따르면 하단 출력 결과는 규칙을 제대로 설정했을 경우 나와야 할 결과 내용이다.

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

상황 가정 변경: 이젠 192.168.0.3도 22번 포트 접근을 차단해보자.

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
  중요
  거절 규칙을 추가하기만 하면, 거절 규칙 대신 상단의 허용 규칙을 받아들인다.

기록 항목 해석[편집]

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

날짜 날짜 시간을 우선 보는 것이 좋다. 순서가 잘못됐거나 특정 시간대 내용이 덩어리째 빠졌다면 공격자가 로그를 절단냈을 수도 있다.

호스트 이름 서버의 호스트 이름.

가동 시간 부팅하고 나서 지난 초단위 시간이다.

기록 동작 기록한 동작에 대한 간단한 설명이다.

IN 이 항목을 설정했다면 해당 동작은 패킷이 들어온 동작이다.

OUT 이 항목을 설정했다면 해당 동작은 패킷이 나간 동작이다.

MAC 맥 주소와 이더넷 형식 필드를 조합한 근원 노드와 목적 노드 하드웨어에 대한 14바이트 조합 식별자이다. 이 순서는 이더넷 II 헤더에서 찾을 수 있다. 자세한 내용은 이더넷 프레임enEtherTypeen을 참고할 것.

SRC 근원 IP이며 누가 패킷을 보냈는지 나타낸다. 어떤 IP는 인터넷으로 라우팅할 수 있지만 어떤 IP는 LAN 구간을 넘어서만 통신할 수 있고 어떤 IP는 근원 컴퓨터로 되돌리기만 가능하다. 자세한 내용은 개별(비공개) IP 주소en 참고.

DST 대상 IP이며, 누가 패킷을 받았는지 나타낸다. IP주소 소유자(업체)는 whois.net에서 찾아보거나, whois 명령으로 살펴볼 수 있다.

LEN 패킷의 데이터 길이를 나타낸다.

TOS IPv4 헤더의 TOS 필드를 참고한다. 자세한 내용은 TCP Processing of the IPv4 Precedence Field를 참고할 것.

PREC IPv4의 Precedence 필드를 참조한다.

TTL 송신자 컴퓨터에서 생성하여 최종 수신자 컴퓨터로 도달할 때까지 네트워크상의 여러 노드를 거치며 패킷이 떠돌아다닌 시간을 나타낸다. 패킷이 완전히 도달할 때 까지 여러 라우터를 거친다. 만약 TTL을 초과하기 전에 대상 노드를 찾지 못하면, 패킷이 사라졌다는 얘기다. 이 필드는 인터넷상에 패킷이 영원히 떠돌아다니지 않도록, 패킷이 지정 노드에 도달하면 없어지게 한다. 자세한 내용은 TTL(Time To Live) 참고.

ID 뭔진 모르겠지만 로그를 볼 때 상당히 중요한 부분이다. ufw의 내부 ID 체계를 따르는 것 같은데, 아마 운영체제 ID 인 것 같다(?)

PROTO 패킷 프로토콜을 나타낸다. TCP 아니면 UDP다. 자세한 내용은 TCP and UDP 포트 설명en 참고.

SPT 패킷을 보낸 근원 IP의 포트 번호다. List of TCP and UDP port numbers 참고.

DPT 패킷을 받은 대상 IP의 포트 번호다. 이 포트를 기반으로 실행하는 서비스를 의미하기도 한다(하지만 항상 특정 포트가 해당 포트를 사용하는 서비스의 지정 프로토콜 데이터를 받는 것은 아니다).

WINDOW 보낸 쪽이 받을 수 있는 패킷 크기를 나타낸다(이건 네트워크 이론을 알아야 의미 이해 가능).

RES 언제 쓸지 모르는 비트 값이며 항상 0값이다. 기본적으로 동작 기록 파악엔 아무 상관 없다.

SYN URGP SYN에 대해 이해하려면 TCP 프로토콜 기본 동작을 이해해야 한다. 여기서는 설명을 생략한다. 더 알고 싶으면 TCP/IP 프로토콜 이론 문서를 살펴볼 것.

참고자료[편집]

  1. 말 그대로 "안 복잡한 방화벽"이다.
  2. ufw in Launchpad
  3. Classless Inter-domain Routing - Wikipedia