Rocky Linux - Firewall 방화벽

    Firewall

    Rocky Linux에서는 기본 패키지로 제공하는 네트워크 방화벽 프로그램입니다.

    방화벽은 기본적으로 외부의 침입을 막기 위해 실행되며, 콘솔이 아닌 외부에서 원격 접속을 위해 기본 포트(Port) 22번, SSH(Secure SHell)만 허용이 되어 있습니다. 예를 들어 웹(Web) 서비스 접근은 80번 포트를, 데이터베이스(DB)는 Mysql/MariaDB(3306), Mssql(1433)등 각 소프트웨어에 접근하기 위해 고유 포트를 허용을 해야 한다는 뜻입니다. 포트뿐만 아니라 특정 IP 또는 대역대에 대해서도 차단 및 허용 처리를 할 수 있으므로 포트+IP를 잘 혼합하여 규칙을 설정한다면 앞단 방화벽 장비가 없더라도 높은 수준의 보안을 유지할 수 있습니다.

     

    록키 참고 문서 : https://docs.rockylinux.org/guides/security/firewalld-beginners/

    테스트 서버

    [root@localhost ~]# cat /etc/redhat-release  [OS 정보]
    Rocky Linux release 8.4 (Green Obsidian)

     

    [root@localhost ~]# cat /etc/selinux/config | grep SELINUX  [Selinux 보안 해제]
    SELINUX=disabled  (사용 안 함으로 설정, 서버 재시작이 필요함)


    ■ Firewall 패키지 설치 확인

    CentOS 7 / CentOS 8 (Stream) / Rocky Linux는 기본 패키지로 설치가 되어 있습니다.

    [root@localhost ~]# rpm -qa | grep firewall
    firewalld-0.8.2-7.el8_4.noarch
    python3-firewall-0.8.2-7.el8_4.noarch (종속 패키지)
    firewalld-filesystem-0.8.2-7.el8_4.noarch (종속 패키지)

     

    ■ Firewall 패키지 업데이트가 필요한 경우

    [root@localhost ~]# dnf update firewalld

    마지막 메타 데이터 만료 확인 :2:17:23. 2021년 07월 21일 (수) 오전 01시 09분 06초 이전에 확인
    종속성이 해결되었습니다.
    처리가 필요하지 않습니다 (최신 버전일 경우)
    완료되었습니다!

     

    ■ Firewall 패키지 없을 경우 설치하기

    [root@localhost ~]# dnf install -y firewalld

     

    ■ Firewall 패키지 기본 설치 경로

    [root@localhost ~]# cd /etc/firewalld

     

    [root@localhost ~]# /etc/firewalld/firewalld.conf  [환경 설정]

    [root@localhost ~]# /etc/firewalld/zones/public.xml  [방화벽 규칙 저장 설정]

     

    ■ 부팅 시 Firewall 방화벽 자동 실행 및 해제

    [root@localhost ~]# systemctl enable firewalld  [자동 실행]
    Created symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service → /usr/lib/systemd/system/firewalld.service.

    Created symlink /etc/systemd/system/multi-user.target.wants/firewalld.service → /usr/lib/systemd/system/firewalld.service.

     

    [root@localhost ~]# systemctl disable firewalld  [자동 실행 해제]
    Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
    Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.

     

    ■ Firewall 방화벽 시작 및 중지

    [root@localhost ~]# systemctl start firewalld  [시작]

     

    [root@localhost ~]# ps -ef | grep firewalld  [프로세스 구동 확인]

    /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid

     

    [root@localhost ~]# systemctl stop firewalld  [중지]

     

    ■ Firewall 구동 및 상태 확인

    [root@localhost ~]# systemctl status firewalld | grep -i active  [systemctl 명령어]
       Active: active (running) since Wed 2021-07-21 04:35:30 EDT; 1min 10s ago (실행 중)

       Active: inactive (dead) since Wed 2021-07-21 04:38:20 EDT; 1s ago (다운)

     

    [root@localhost ~]# firewall-cmd --state  [firewall 명령어]

    running (실행 중) / not running (다운)


    여기서부터는 방화벽 허용 방법입니다.

     

     

    ■ 서비스(Services) 이름으로 방화벽 허용

    ※ Firewall의 경우는 어플레이션에서 정해진 이름으로 허용이 가능합니다.

     

    ▷ 등록할 수 있는 서비스 이름 확인

    [root@localhost ~]# firewall-cmd --get-services

    ▷ 서버 원격 접속을 위해 SSH를 허용할 경우

    [root@localhost ~]# firewall-cmd --permanent --add-service=ssh  [추가]

    [root@localhost ~]# firewall-cmd --permanent --remove-service=ssh  [제거]

    success  (등록 성공)

     

    ▷ 추가된 룰 적용

    ※ 추가 및 제거 시에 무조건 룰 재시작이 필요합니다.

    [root@localhost ~]# firewall-cmd --reload

    success  (적용 완료)

     

    ▷ 등록된 규칙 확인(전체 확인)

    [root@localhost ~]# firewall-cmd --list-all

    public (active)
      target: default
      icmp-block-inversion: no
      interfaces: ens33
      sources:
      services: cockpit dhcpv6-client ssh  [추가 확인]
      ports:
      protocols:
      masquerade: no
      forward-ports:
      source-ports:
      icmp-blocks:
      rich rules:

    ※ SSH 접속 포트가 다를 경우

    SSH 포트는 기본적으로 (22)로 정해져 있습니다. 하지만 알려진 번호는 공격에 취약하므로 관리자만 아는 접근 포트로 변경하여 설정을 할 수가 있습니다. 예를 들어 SSH 포트를 (8888)로 변경했을 때 서비스 이름(SSH)으로 등록한 규칙이 접속이 될까요?

    ▷ 결론은 안됩니다. add-service=ssh 서비스 이름으로 등록한 규칙은 무조건 기본 포트(22)를 따라갑니다. 하지만 정의된 파일이 있으므로 파일 수정이 가능합니다.

     

    ▷ Services 정의 파일 경로

    [root@localhost ~]# ls /usr/lib/firewalld/services/

    ▷ SSH.xml 정의 파일 포트 수정

    [root@localhost ~]# vi /usr/lib/firewalld/services/ssh.xml

    이후 서비스 이름으로 등록한 SSH는 (8888) 포트로 접속할 수 있게 됩니다. 이래서 서비스 이름으로 등록하는 것보다는 유동성 있는 특정 포트로 허용 처리하는 게 더 좋습니다.

     

     

    ■ 특정 포트로 허용

    [root@localhost ~]# firewall-cmd --permanent --add-port=80/tcp  [추가]

    [root@localhost ~]# firewall-cmd --permanent --remove-port=80/tcp  [제거]

    success

     

    ※ 서비스 이름으로 (HTTP)로 추가해도 되지만 포트를 알고 있다면 (80)으로 등록을 합니다.

    아래는 홈페이지 접속을 예로 들어봅니다.

     

    ■ 특정 포트를 구간으로 허용

    [root@localhost ~]# firewall-cmd --permanent --add-port=80-100/tcp  [추가]

    [root@localhost ~]# firewall-cmd --permanent --remove-port=80-100/tcp  [제거]

    success

     

    ※ 구간 적용 확인을 위해 단일 Port(80) 허용 규칙을 삭제하고 Port(80-100)으로 등록을 합니다.

    HTTP(80) 번이 포함되어 있으니 홈페이지가 정상적으로 접근이 되는지 확인합니다.

     

    ■ 특정 IP(대역대)로 허용

    ▷ 특정 IP

    [root@localhost ~]# firewall-cmd --permanent --add-source=192.168.150.132  [추가]

    [root@localhost ~]# firewall-cmd --permanent --remove-source=192.168.150.132  [제거]

    success

     

    ▷ 특정 IP 대역대

    [root@localhost ~]# firewall-cmd --permanent --add-source=192.168.150.0/24  [추가]

    [root@localhost ~]# firewall-cmd --permanent --remove-source=192.168.150.0/24  [제거]

    success

    ※ C클래스(192.168.150.0/24) = 192.168.150.0 ~ 192.168.150.255 사이의 IP를 허용

     

    ※ iptables의 경우는 IP(대역대)를 허용하면 기본 설정으로 모든 들어오는 Port에 대해서 허용이 되지만 firewall의 경우는 IP(대역대)만 허용한다고 해서 Port에 대해서 모두 허용하지 않습니다. 아래와 같이 테스트를 해보면 알 수 있습니다.

    그래서 다음 내용에 혼합 사용에 대한 명령어를 따로 설명하겠습니다.

     

    ☆예시

    [root@Rocky-zabbix ~]# firewall-cmd --permanent --add-source=192.168.150.133  [추가]

     

    ■ 특정 IP(대역대) + 포트 허용[rich rules]

    ※ rich라는 말이 풍부한, 여기서는 다양한 규칙을 적용하기 위한 말로 사용자에게 맞는 커스텀 룰쯤 생각하면 됩니다. 아래는 IP [192.168.150.133]에서 접근할 때에 (8888) Port만 허용하겠다는 뜻입니다. 서버 운영자라면 기본 규칙보다는 rich rules를 이용하여 등록할 경우가 많으실 것으로 생각됩니다.

    [root@localhost ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address=192.168.150.133 port port="8888" protocol="tcp" accept'  [추가]

    [root@localhost ~]# firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address=192.168.150.133 port port="8888" protocol="tcp" accept'  [제거]

    success

     

    ☆예시

    [root@localhost ~]# firewall-cmd --list-all

    ※ 같은 대역 대이니 만약 범위로 허용하고 싶다면, source address=192.168.150.0/24 넣으면 됩니다.

     

    ■ 특정 IP(대역대)에 대한 접근 불가

    ※ SSH(22)으로 들어오는 포트에 대해서 모두 허용이지만 특정 IP(대역대)를 접근 못하게 막는 경우

    [root@localhost ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address=192.168.150.133 reject'  [추가]  ☆Reject는 상대방이 접속 시도를 했을 경우 피드백을 보내줍니다.

    [root@localhost ~]# firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address=192.168.150.133 reject'  [제거]

    success

     

    [root@localhost ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address=192.168.150.129 drop'  [추가] Reject는 상대방이 접속 시도를 했을 경우 피드백을 보내지 않고 차단

    [root@localhost ~]# firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address=192.168.150.129 drop' [제거]

     

    ☆예시

    [root@localhost ~]# firewall-cmd --list-all


    그 외 참고 사항

     

    ■ 명령어가 아닌 public.xml 규칙에 직접 입력

    ※ 상황에 따라 설정 파일에 직접 등록하고 삭제하는 게 더 편할 수도 있습니다.

    [root@localhost ~]# vi /etc/firewalld/zones/public.xml

    [root@localhost ~]# firewall-cmd --reload  [적용]

    [root@localhost ~]# firewall-cmd --list-all  [적용 확인]

     

    ■ 거의 TCP를 많이 사용하지만 UDP를 사용하는 경우

    ※ UDP는 대표적으로 네임서버(DNS)를 질의하기 위한 (53)Port가 있습니다.

    [root@localhost ~]# firewall-cmd --permanent --add-port=53/udp  [추가]

    [root@localhost ~]# firewall-cmd --permanent --remove-port=53/udp  [제거]

    success

     

    [root@localhost ~]# firewall-cmd --list-all

    ports: 53/udp  [추가된 룰 확인]

     

    ■ 좀더 자세한 조건식(옵션)을 확인하기 위한 도움말[HELP] 참고

    [root@localhost ~]# firewall-cmd --help | more  [텍스트 양이 많기 때문에 more]


    마치며

    이외에도 추가적으로 알게 된 정보가 있다면 해당 게시글에 계속 정보를 추가하겠습니다.

     

    필자는 iptables를 더 선호하다 보니 firewall를 사용할 일이 없어 모르는 상태에서 공부를 하고 직접 테스트 및 검증을 거치는데 오랜 시간이 소요가 되었네요. CentOS7 ~ 8 (Stream)이나 Rocky부터는 기본적으로 firewall패키지가 설치가 되므로 iptables은 도태될 가능성이 있다고 봅니다. 아직까지는 iptables패키지를 별도로 제공하고 있기 때문에 어떤 게 더 좋고 나쁨은 없습니다. 편한 것을 사용하면 되며, 굳이 나쁜점을 말씀드리자면 firewall은 등록된 리스트를 보는 게 가독성이 떨어지는 부분? 장점은 iptables의 경우는 서비스를 무조건 중지/시작을 거쳐야 하지만 firewall은 --reload 명령어를 통해 서비스 중지 없이 바로 적용이 가능한 점입니다. 이후 서버운영 관련 포스팅 방화벽 허용 부분은 firewall을 이용하도록 하겠습니다. 긴 글 읽으시느라 고생이 많으셨습니다. 오타나 잘못된 정보가 있다면 댓글에 남겨주시기 바랍니다. 바로 수정 조치 들어가도록 하겠습니다.

    Designed by JB FACTORY