𝝅번째 알파카의 개발 낙서장

screen

[Ubuntu] ufw로 방화벽 포트 설정하기

posts

Ubuntu

count

개요 🔗

모든 건물에는 입구가 존재한다. 일반적인 상황에서, 누구든지 해당 건물에 드나들기 위해선 좋든 싫든 입구를 통과해야한다.

이 입구라는 것이 또 마냥 열려있는 건 아니라서, 필요 시엔 개방되어있다가도 특정 시간에는 폐쇄되기도 한다.

심지어 어떤 곳은 까다롭기 그지없어서, 사람을 가려받기도 한다. 이를테면 보안구역이라던가, 금요일 밤의 클럽이라던가.


PC통신도 이와 원리가 별반 다를 바 없다. 보기엔 그냥 막 통신하는 것 같아도, 저마다 할당받은 입구를 통해 PC에 드나든다.

PC가 건물이라고 한다면, PC의 입구는 포트(PORT)라 할 수 있다.


모든 프로그램은 PC와의 통신 시 임의의 입구, 포트를 할당받는다. 프로그램은 해당 포트를 통해 들어오고, 나가며 정해진 동작을 수행한다.

만약 해당 포트가 막혀있다면, 해당 컴퓨터를 대상으론 정상적으로 동작할 수 없을 것이다.

이 프로그램이 내 PC에 필요하다면 포트를 열어주면 될 것이고, 아니라면 포트를 닫음으로써 접근하지 못하게 함이 바람직하다. 혹은 인증된 소수의 프로그램에게만 포트를 허용할 수도 있을 것이다.


말 그대로 보안과 매우 밀접한 개념으로써, 방화벽 설정을 통해 원하는 포트를 원하는 대상에게 개방/폐쇄할 수 있다.

Ubuntu에서 ufw를 통해 방화벽 설정을 원하는대로 설정해보자.

그냥 다 열면 안 돼? 🔗

조선시대 제주도는 문을 잠근다는 개념이 매우 미약했다고 한다.

옛 교통방식과 섬이라는 폐쇄적인 환경 덕분에 유동인구가 매우 적었고, 각 마을 주민에 대한 신원이 확실했을 것이다. 내륙에 비해 외지인이 방문/거주할 일도 매우 적었을 것이다.

이처럼 주변 환경과 사람들 간의 신뢰성이 있다면 굳이 그렇게 폐쇄적일 필요는 없을지도 모른다.


하지만 인터넷이라는 환경은 이와 결이 매우 다르다. 인터넷에 연결만 되어있다면 누구나 내 PC에 접근할 수 있는 잠재적 가능성을 가진다. 누가, 왜, 무엇을 위해 오는지도 알 수 없다.

이 경우 문을 아무렇게나 열어재껴놓는건 바람직한 상황이 아닐 것이다.


방화벽은 이러한 문제로부터 PC를 최대한 보호하기위해, 기본적으로 폐쇄적인 설정을 가진다. 일단 안 된다고 질러놓고 보는 셈이다.

보안을 위해서 방화벽은 가급적 폐쇄하되, 필요한 프로그램만 개방하는 화이트리스트 방식을 쓰는 습관을 들이도록 하자.

ufw 🔗

기본적인 방화벽 명령어 iptables가 있지만, 명령어가 그리 직관적이지 않다는 단점이 있다. 이에 비해 ufwiptables에 비해 훨씬 쉽고 직관적인 명령어로 다룰 수 있다.

iptables과 성능상의 차이가 거의 없다는 점을 감안하면 확실한 장점.

ufw 설치 🔗

ufw는 기본 명령어가 아니다. ufw를 설치하자.

BASH

0sudo apt-get install ufw

위 명령어를 통해 설치할 수 있다.

ufw 상태 관리 명령어 🔗

ufw의 상태를 관리하는 명령어다.

BASH

0# ufw 활성화
1sudo ufw enable
2
3# ufw 비활성화
4sudo ufw disable
5
6# ufw 상태 확인
7sudo ufw status verbose

ufw가 설치된 후 방화벽에 영향을 주는 걸 방지하기 위해 기본적으로 비활성화 상태로 설치된다.

sudo ufw enable 명령어를 입력하여 활성화하자.

ufw 정책 관리 명령어 🔗

ufw에 적용된 정책을 관리한다.

BASH

0# 정책 조회
1sudo ufw show raw
2
3# 기본 정책 허용
4sudo ufw default allow
5
6# 기본 정책 차단
7sudo ufw default deny

모든 포트 통신에 대한 일괄 허용/차단이 가능하다.

BASH

0# 들어오는 통신 차단
1sudo ufw default deny incoming
2
3# 나가는 통신 허용
4sudo ufw default allow outgoing

오는사람 막고 가는사람 안 막는다라는 말을 들어본 적이 있을 것이다. 보안도 똑같다. 내게 들어오는 통신은 최대한 폐쇄적으로, 내게서 나가는 통신은 개방적으로 대한다.

ufw 정책 설정 명령어 🔗

BASH

0# 80포트(HTTP) 허용
1sudo ufw allow 80
2
3# 80포트(HTTP) TCP 허용
4sudo ufw allow 80/tcp
5
6# 80포트(HTTP) UDP 허용
7sudo ufw allow 80/udp
8
9# 80포트(HTTP) 허용
10sudo ufw allow http

위 명령어는 HTTP 포트 80을 허용하는 명령어들의 모음이다.

ufw는 고유 서비스 이름을 사용해서 포트를 관리할 수 있다. HTTP(80), HTTPS(443), FTP(21), SSH(22) 등이 이에 해당한다.

allow 이외에도 deny를 통해 통신을 거부하거나, delete를 통해 해당 정책을 아예 지워버릴 수도 있다.

정책을 지우게 되면 ufw에 설정된 기본 정책을 따르게 된다.

ufw 정책 세부설정 명령어 🔗

IP 통신 정책 🔗

BASH

0# 192.168.0.100 IP의 통신 허용
1sudo ufw allow from 192.168.0.100
2
3# 192.168.0.100 ~ 200 대역의 IP의 통신 허용
4sudo ufw allow from 192.168.0.100/200

위 명령어를 통해서 특정 IP 혹은 IP 대역의 통신을 관리할 수 있다.

IP 및 포트 통신 정책 🔗

BASH

0# 192.168.0.100 IP의 80포트 허용
1sudo ufw allow from 192.168.0.100 to any port 80
2
3# 192.168.0.100 IP의 80포트 TCP 허용
4sudo ufw allow from 192.168.0.100 to any port 80 proto tcp

특정 IP의 특정 포트만 허용/차단할 수도 있다.

ufw 정책 수정 명령어 🔗

BASH

0sudo ufw status numbered

현재 적용된 정책을 인덱스 번호와 함께 보여준다.

해당 번호를 통해 정책을 수정, 삭제할 수 있다.

BASH

0# 1번 정책을 80포트 차단 정책으로 변경
1sudo ufw insert 1 deny 80
2
3# 2번 정책을 192.168.0.100 IP의 통신 허용 정책으로 변경
4sudo ufw insert 2 allow from 192.168.0.100

ufw 정책 삭제 명령어 🔗

BASH

0# 1번 정책 삭제
1sudo ufw delete 1

정리 🔗

서비스에서 서버가 갖는 역할과 비중을 생각해본다면, 서버의 보안은 서비스의 안정성과 직결되는 중요한 문제다.

때문에 서버의 보안은 귀찮을정도로 견고하게 구성되는 것이 바람직하다.


프로그램, 웹 등 모든 서비스의 기초는 데이터의 통신이므로, 통신을 잘 제어하는 것이 중요하다.

반드시 필요한 통신만을 허가하고 관리하여 서버가 항상 최상의 보안을 유지할 수 있도록 보안정책을 구성하자.