우분투 20.04 방화벽 확인 - ubuntu 20.04 banghwabyeog hwag-in

요즘 Oracle Cloud Free Tier를 가지고 놀고 있는데 ssh 접속 포트를 바꿔도 방화벽에 막히고, Jekyll을 실행시킨 뒤 포트를 열어줬음에도 자꾸 접속이 되지 않아 찾아보니 오라클 클라우드에서 ufw 방화벽이 제대로 작동하지 않는다는 글을 보았다.

요 며칠간 인스턴스를 지웠다 생성하며 고생했던 시간을 생각하면 허무한 상황이었다.

SSH 포트가 막혀서 내가 제대로 설정하지 못한 건가 싶어서 지웠다 생성했다를 반복했었는데...

우분투 20.04 방화벽 확인 - ubuntu 20.04 banghwabyeog hwag-in

근데 아직 ufw 방화벽이 문제인걸 확인하지 못했으니 ufw를 지우고 firewalld를 사용하여 직접 확인해 보기로 하였다.

우선 ufw가 문제라고 하니 ufw를 제거해 주기로 하였다.

sudo systemctl stop iptables
sudo systemctl mask iptables
sudo systemctl status iptables

위의 명령어를 사용하여 iptables를 중지하고 mask해준 뒤 제대로 정지됐나 확인을 해 준다.

우분투 20.04 방화벽 확인 - ubuntu 20.04 banghwabyeog hwag-in

위 사진처럼 Loaded에 masked가 적혀있고 Active가 inactive가 되어있으면 iptables가 정지된 것이다.

그 후 ufw를 제거해 준다.

sudo apt remove ufw
우분투 20.04 방화벽 확인 - ubuntu 20.04 banghwabyeog hwag-in

firewalld 설치 후 사용하기

ufw를 제거하였고 방화벽을 사용하지 않을 수 없으니 이제 firewalld를 설치해준다.

sudo apt install firewalld
우분투 20.04 방화벽 확인 - ubuntu 20.04 banghwabyeog hwag-in

열심히 설치해 준 뒤 이제 firewalld를 사용하도록 설정해준 뒤 상태를 확인해 준다.

sudo systemctl enable firewalld
sudo systemctl start firewalld
sudo systemctl status firewalld
우분투 20.04 방화벽 확인 - ubuntu 20.04 banghwabyeog hwag-in

Loaded와 Active 상태가 위처럼 나오고 맨 밑에 Started firewalld...이라는 문구가 적혀있으면 정상적으로 실행이 되고 있는 중이다.

이제 정말 ufw 문제가 맞는지 확인하기 위해 Jekyll을 실행해준 뒤 firewalld의 포트를 열어놓고 접속했을 때 페이지가 뜨면 ufw 문제가 맞는 것이 된다.

firewalld의 포트는

sudo firewall-cmd --permanent --zone=public --add-port=4000/tcp
sudo firewall-cmd --reload

위의 명령어를 사용하여 원하는 포트를 열어줄 수 있다.

반드시 포트를 등록한 뒤에는 --reload 옵션을 주어 success를 확인해야 한다.

우분투 20.04 방화벽 확인 - ubuntu 20.04 banghwabyeog hwag-in

이제 Jekyll의 기본 포트 4000번을 열어주었으니 브라우저에서 http://{아이피 주소}:4000을 입력하였을 때 Jekyll의 기본 페이지가 나오면 성공이다.

우분투 20.04 방화벽 확인 - ubuntu 20.04 banghwabyeog hwag-in
페이지 두둥 등장!!!

너무나도 쉽게 등장하였다...

우분투 20.04 방화벽 확인 - ubuntu 20.04 banghwabyeog hwag-in

이거 때문에 며칠을 날린 걸 생각하면 화가 나지만 해결됐으니 우선 됐다...

빨리 오라클 클라우드에서 Rocky 리눅스 지원해줬으면 좋겠네...

우분투의 기본적인 방화벽은 UFW입니다. 이는 iptables를 좀 더 쉽게 설정할 수 있도록 한 것인데 간단한 방화벽 구성에는 문제가 없지만 수준 높은 방화벽 구성에는 iptables 룰을 직접 사용해야 합니다.

참고 : 우분투 UFW help 가이드

UFW 사용법

UFW 기본 설정법에 대하여 알아보자.

UFW 활성화/비활성화

UFW는 기본 비활성화 상태이기에 이를 활성화 한다.

sudo ufw enable

UFW 비활성화

sudo ufw disable

UFW 상태 확인

sudo ufw status verbose

UFW 기본 룰

UFW에 설정되어 있는 기본 룰은 아래와 같다.

  • 들어오는 패킷에 대해서는 전부 거부(deny)
  • 나가는 패킷에 대해서는 전부 허가(allow)

기본 룰 확인

sudo ufw show raw

기본 정책 차단

sudo ufw default deny

기본 정책 허용

sudo ufw default allow

UFW 허용과 차단

UFW 허용

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

예) SSH 포트 22번 허용(tcp/udp 22번 포트를 모두 허용)

sudo ufw allow 22

tcp 22번 포트만을 허용 - SSH는 tcp 22번 포트만 허용하는게 정답

sudo ufw allow 22/tcp

udp 22번 포트만을 허용

sudo ufw allow 22/udp

UFW 거부

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

예) ssh 포트 22번 거부(tcp/udp 22번 포트를 모두 거부)

sudo ufw deny 22

tcp 22번 포트만을 거부

sudo ufw deny 22/tcp

udp 22번 포트만을 거부

sudo ufw deny 22/udp

UFW 룰의 삭제

ufw deny 22/tcp 설정이 되어있다고 가정

sudo ufw delete deny 22/tcp

service 명을 이용한 설정

/etc/services에 지정되어 있는 서비스명과 포트를 이용해 UFW를 설정할 수 있다.

서비스명 보기

less /etc/services

서비스명으로 허용

sudo ufw allow <service name>

예) SSH 서비스

sudo ufw allow ssh
sudo ufw deny ssh

UFW 로그 기록

sudo ufw logging on
sudo ufw logging off

Advanced Syntax

문법을 확장하여 목적지 주소와 포트, 프로토콜등을 지정할 수 있다.

특정한 IP 주소 허가/거부

특정한 IP주소 허용

sudo ufw allow from <ip address>

예) 192.168.0.100 주소 허용(IP 주소192.168.0.100 에서만 접속이 가능해진다)

sudo ufw allow from 192.168.0.100

네트워크 단위로 지정하여 같은 네트워크 상에 있는 컴퓨터들은 접속가능해진다.

sudo ufw allow from 192.168.0.0/24

특정 IP 주소와 일치하는 포트 허용

sudo ufw allow from <ip address> to <protocol> port <port number>

예) 192.168.0.100 주소와 포트, 프로토콜 허용

sudo ufw allow from 192.168.0.100 to any port 22

특정 IP 주소와 프로토콜, 포트 허용

$ sudo ufw allow from <ip address> to <protocol> port <port number> proto <protocol name>

예) 192.168.0.100 주소와 tcp 프로토콜 22번 포트 허용

sudo ufw allow from 192.168.0.100 to any port 22 proto tcp

위의 예제들에서 allow 대신 deny를 입력하면 거부가 된다.

ping (icmp) 허용/거부

UFW 기본설정은 ping 요청을 허용하도록 되어있다.

sudo vi /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으로 변경하거나 삭제하면 ping 요청을 거부하게 된다.

ufw numbered rules

UFW 룰들에 숫자를 붙여서 볼 수 있다. 이를 이용해 룰에 수정이나 삭제, 추가를 할 수 있다.

ufw number 보기

sudo ufw status numbered

ufw numbered 수정

sudo ufw delete 1
sudo ufw insert 1 allow from 192.168.0.100

추천 방화벽 정책

sudo ufw enable
sudo ufw allow from 192.168.0.3 to any port 22 proto tcp
sudo ufw allow 123/udp
sudo ufw allow 80/tcp
sudo ufw allow 3306/tcp
sudo ufw status