들어가며

지금까지 리눅스의 iptables 에 대해 알아보았습니다. iptables 는 table, chain, rule 이라는 세가지 구성요소를 이용하여 네트워크의 흐름을 막거나 허용하는 등의 규칙을 netfilter 에 적용하고 netfilter 가 이를 토대로 네트워크를 통제 함으로써 리눅스 서버의 방화벽 역할을 수행합니다.

그리고 룰을 설정하는 명렁어와 여러 옵션들에 대해서도 살펴보았습니다. 이번 글에서는 사용하기 어려운 iptables 를 보다 직관적이고 쉽게 사용할 수 있도록 해주는 tool 인 ufw 에 대해서 알아보겠습니다.

UFW 란

UFW 란 Uncomplicated Firewall 로서, 이름 그대로 복잡하지 않은 방화벽, 즉 iptables 의 설정을 보다 간단하게 할 수 있도록 도와주는 도구입니다. 여기서 중요한 점은 UFW 가 추가적인 로직을 통해서 방화벽 설정을 하는 것이 아닌 iptables 를 설정하기 위한 복잡한 과정을 UFW 를 통해서 사용자들이 보다 쉽게 설정할 수 있도록 도와주는 도구라는 것입니다. ( 때문에 UFW 를 잘 사용하기 위해서는 결국에는 iptables 를 어느정도 이해하고 있어야 하기에 이전 글들을 통해서 알아보았습니다. )

간단하게 UFW 가 나오게 된 흐름을 정리해보면 다음과 같습니다.

  • 네트워크 통로를 단일화하여 외부 네트워크와 내부 네트워크를 분리하여 내부 네트워크를 보호하기 위해 방화벽이 존재합니다.
  • 리눅스에서는 netfilter 에 iptables 를 사용하여 규칙을 적용함으로써 방화벽을 설정할 수 있습니다.
  • 하지만, iptables 는 설정과 관리가 복잡하기 때문에 복잡하지 않은 방화벽이란 의미로 UFW 가 나오게 되었습니다.

기본적으로 설치가 되어 있지만, 만약 설치 되어 있지 않다면 다음의 명렁어를 통해 설치할 수 있습니다.

# 설치
sudo apt-get install ufw

# 활성화
sudo ufw enable

# 비활성화
sudo ufw disable

UFW 명령어

UFW 의 기본 명렁어에 대해서 알아보겠습니다.

UFW 상태 확인

sudo ufw status verbose

현재 어떤 Rule 이 적용되어 있는지 볼 수 있습니다.

UFW 기본 Rule

UFW 에 설정되어 있는 기본 룰은 다음과 같습니다.

  • 들어오는 패킷에 대해서는 전부 거부(deny)
  • 나가는 패킷에 대해서는 전부 허가(allow)
  • forwarding 되는 패킷에 대해서는 전부 거부(deny)
# 기본 룰 확인 = iptables -L
sudo ufw show raw

# 기본 정책 차단
sudo ufw default deny

# 기본 정책 허용
sudo ufw default allow

UFW 허용과 차단

허용하는 경우에는 allow, 차단하는 경우에는 deny 를 사용합니다.

# ssh 접속 허가
sudo ufw allow ssh

# http 접속 거부
sudo ufw deny http

# 특정 포트 접속 허가(tcp/udp 전부)
sudo ufw allow 22

# 특정 포트 + 특정 프로토콜
sudo fuw allow 22/tcp

# 특정 ip 에서 오는 접속 허가
sudo ufw allow from [ip address]

# 특정 ip + 특정 포트 에서 오는 접속 허가
sudo ufw allow from [ip address] port [port number]

# 특정 ip + 특정 포트 + 프로토콜 에서 오는 접속 허가
sudo ufw allow from [ip address] port [port number] proto tcp

# 특정 ip + 특정 포트로 오는 접속 허가
sudo ufw allow from any to [ip address] port [port number]

ssh, http 와 같이 서비스명을 이용해서 설정하기 위해서는 /etc/services 파일에 저장되어 있는 서비스여야 한다. 해당 파일에 있는 포트와 프로토콜을 이용하여 자동으로 룰을 추가해준다.

UFW Rule 삭제

UFW Rule 을 삭제하기 위해서는 룰을 설정할 때 사용했던 명렁어를 delete 명령 뒤에 쳐주면 된다. 예를 들어, 다음의 명렁어로 룰을 설정했다고 하면,

sudo ufw allow 22/tcp

다음과 같이 삭제해주어야 한다.

sudo ufw delete allow 22/tcp

일일히 룰 설정시에 사용했던 명렁을 기억하기는 어렵기 때문에 다음과 같은 방법을 사용하면 편하다.

# 설정되어 있는 룰에 numbering 하여 보여주기
sudo ufw status numbered

위의 명렁어는 설정되어 있는 룰에 숫자를 붙여준다. 그리고 이 숫자를 이용하여 해당 룰을 삭제할 수 있다.

sudo ufw delete [number]

UFW Rule Reload

설정을 변경했으면 reload 하여 꼭 설정을 적용해주어야 한다.

sudo ufw reload

그 외

그 외의 ping 거부 및 추천 ufw 설정으로는 다음과 같다.

ping 거부

기본적으로 ping 요청을 허용하도록 되어 있기 때문에 이를 막기 위해서는 /etc/ufw/before.rules 파일을 수정해주어야 한다.

# /etc/ufw/before.rules 파일 열기
sudo vi /etc/ufw/before.rules

# 아래와 같이 수정
-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

추천 방화벽 정책

sudo ufw enable

# 내 컴퓨터의 원격 요청 허용
sudo ufw allow from [내 컴퓨터의 ip 주소] to any port 22 proto tcp

# ntp protocol 열어주기
sudo ufw allow 123/udp

# http 요청 열어주기
sudo ufw allow 80/tcp

# database 요청 허용
sudo ufw allow 3306/tcp

UFW 설정 파일 ( before & user & after )

UFW 는 명렁어 뿐만 아니라 직접 설정 파일에 설정을 추가하여 방화벽 설정을 할 수 있습니다. 설정 파일로는 before , user , after 3 가지로 rules 확장자를 가지고 root 권한으로만 수정할 수 있습니다.

before.rules

before.rules 파일은 ufw에서 정의된 규칙보다 먼저 적용되는 규칙을 포함합니다. 이 파일은 주로 시스템의 초기화 작업이나 기본적인 네트워크 설정을 포함하는 데 사용됩니다. 이 파일은 /etc/ufw/before.rules에 위치하고 있습니다.

용도: 기본적인 초기 설정, 포트나 서비스에 대한 기본 허용 규칙 등을 정의.

user.rules

user.rules 파일은 사용자가 ufw 명령어를 통해 추가한 규칙을 포함합니다. 이 파일은 /etc/ufw/user.rules에 위치하며, ufw 명령어를 통해 추가하거나 삭제한 규칙이 자동으로 이 파일에 기록됩니다.

용도: 사용자가 정의한 방화벽 규칙을 관리.

after.rules

after.rules 파일은 ufw에서 정의된 규칙 후에 적용되는 규칙을 포함합니다. 이 파일은 /etc/ufw/after.rules에 위치하며, 주로 사용자 정의 규칙 이후에 추가적인 규칙을 정의하는 데 사용됩니다.

용도: 사용자 규칙 이후의 추가 설정, 특별한 로깅이나 최종적인 규칙 등을 정의.

마무리

간단하게 ufw 가 무엇이며 어떤 명렁어가 있는지 살펴보았습니다. 다음 시간에는 도커와 ufw 에 대한 내용을 다루면서 어떠한 문제가 발생했고 이를 해결하기 위한 과정들을 알아보면서 더욱더 iptables 와 리눅스의 방화벽에 대해서 더 이해할 수 있게 되는 시간을 가지도록 하겠습니다.