더북(TheBook)

초보 시스템 관리자의 일기 | 우분투 방화벽 ufw로 시스템 보호하기

iptables를 이용해서 패킷 제어하는 방법을 실습해봤다. 다양한 규칙을 정의해서 패킷 흐름을 제어할 수 있다는 장점도 좋지만 테이블이니 사슬이니 방화벽 기능 한 줄 추가하기가 왜 이렇게 어려운지 짜증이 났다. 점심시간에 iptables에 대해 투덜거렸더니 선배가 아메리카노 한 잔을 요구하며 (이 인간은 조금도 베풀 줄 몰라!) 우분투에서 가볍게 사용 가능한 방화벽 도구를 소개해줬다.

ufw Uncomplicated FireWall는 손쉬운 조작으로 iptables 테이블, 사슬 설정을 대신해준다. 게이트웨이 장치처럼 복잡한 패킷 제어가 필요하다면 직접 iptables를 다뤄야 하지만, 네트워크 끝에 연결된 일반적인 컴퓨터라면 간단하게 ufw로 방화벽 설정이 가능하다.

ufw 실습을 위해 텔넷 서버를 운영하고 있는 test02에 로그인했다. ufw status로 방화벽 상태를 확인했다. 기본적으로 방화벽이 비활성 inactive 상태이다. iptables로 nat 테이블을 확인하면 각 사슬은 모든 접근을 허용한다.

administrator@test02:~$ sudo ufw status
Status: inactive
administrator@test02:~$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source              destination

Chain FORWARD (policy ACCEPT)
target     prot opt source              destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source              destination

ufw enable은 방화벽을 활성화한다. 방화벽 상태가 active로 변경된 것을 확인할 수 있다. 방화벽을 활성화한 다음부터 다른 게스트에서 텔넷 접근이 차단된다. 이렇게 ufw는 기본적으로 모든 접근을 제한하고 사용자가 정의한 특정 접근을 허용한다.

administrator@test02:~$ sudo ufw enable
Firewall is active and enabled on system startup
administrator@test02:~$ sudo ufw status
Status: active

방화벽이 활성화되었기 때문에 test01에서 test02(10.0.0.2)에 telnet 접속을 시도해보면 연결이 되지 않는다.

administrator@test01:~$ telnet 10.0.0.2
Trying 10.0.0.2...

nat 테이블 상태를 확인하니 입이 떡 벌어진다. INPUT과 FORWARD 사슬의 기본 정책은 제한( DROP)으로 설정된다. iptables의 기본 사슬인 INPUT, FORWARD, OUTPUT 외에 ufw가 자동 생성한 사슬이 정의되어 있고 기본 사슬에서 생성된 각 사슬을 참조하고 있다. 예를 들어 INPUT에는 ufw-after-input을 비롯한 수많은 사슬이, FORWARD에는 ufw-after-forward를 비롯한 수많은 사슬이 참조되어 있다. ufw로 정의하는 방화벽 규칙은 바로 이 자동 생성된 사슬에 정의된다고 한다. 어쨌든 사용자 입장에서 좋은 것은 이 복잡한 규칙을 신경 쓰지 않아도 된다는 점이다.

administrator@test02:~$ sudo iptables -L
Chain INPUT (policy DROP)
target prot opt source                    destination
ufw-before-logging-input all -- anywhere                anywhere
ufw-before-input all -- anywhere                 anywhere
ufw-after-input all -- anywhere                 anywhere
ufw-after-logging-input all -- anywhere                anywhere
ufw-reject-input all -- anywhere                 anywhere
ufw-track-input all -- anywhere                 anywhere

Chain FORWARD (policy DROP)
target prot opt source                    destination
ufw-before-logging-forward all -- anywhere                anywhere
ufw-before-forward all -- anywhere                anywhere
ufw-after-forward all -- anywhere                anywhere
ufw-after-logging-forward all -- anywhere                anywhere
ufw-reject-forward all -- anywhere                anywhere

Chain OUTPUT (policy ACCEPT)
target prot opt source                    destination
ufw-before-logging-output all -- anywhere                anywhere
ufw-before-output all -- anywhere                anywhere
ufw-after-output all -- anywhere                anywhere
ufw-after-logging-output all -- anywhere                anywhere
ufw-reject-output all -- anywhere                anywhere
ufw-track-output all -- anywhere                anywhere

Chain ufw-after-forward (1 references)
...
Chain ufw-after-input (1 references)
...
Chain ufw-after-logging-forward (1 references)
...

특정 포트에 대한 접근을 허용하려면 ufw allow [포트번호]를 입력한다. 텔넷은 23번 포트를 사용하고 있다. 이렇게 입력한 다음 다른 게스트에서 텔넷으로 test02(10.0.0.2)에 접속이 가능하다.

administrator@test02:~$ sudo ufw allow 23
Rule added
Rule added (v6)
administrator@test02:~$ sudo ufw status
Status: active

To                         Action     From
--                         ------     ----
23                         ALLOW      Anywhere
23                         ALLOW      Anywhere (v6)

해당 포트번호에 대한 접근을 허용하면 tcp, udp 프로토콜 모두 적용된다. 프로토콜을 명시해서 접근을 허용하려면 ufw allow [포트번호]/[프로토콜]을 입력한다. 텔넷은 tcp 프로토콜로 동작하므로 다음과 같이 입력하면 된다.

administrator@test02:~$ sudo ufw allow 23/tcp

접근 제한 규칙을 정의하려면 ufw deny [포트번호]를 입력한다. 22번 포트를 제한하는 규칙은 다음과 같다.

administrator@test02:~$ sudo ufw deny 22
administrator@test02:~$ sudo ufw status
Status: active

To                         Action     From
--                         ------     ----
22                         DENY       Anywhere
23                         ALLOW      Anywhere
22                         DENY       Anywhere (v6)
23                         ALLOW      Anywhere (v6)

정의된 규칙을 삭제하려면 ufw delete [정의된 규칙]이라고 입력한다. 다음과 같이 바로 앞에서 정의한 규칙을 삭제해보자.

administrator@test02:~$ sudo ufw delete deny 22
administrator@test02:~$ sudo ufw status
Status: active

To                         Action     From
--                         ------     ----
23                         ALLOW      Anywhere
23                         ALLOW      Anywhere (v6)

특정 IP 주소에 대한 접근을 차단하려면 하위 옵션을 넣어 ufw deny from [IP 주소]라고 입력한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.