Linux (Ubuntu) UFW
Linux Study Note3
들어가며
지금까지 리눅스의 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 와 리눅스의 방화벽에 대해서 더 이해할 수 있게 되는 시간을 가지도록 하겠습니다.