Linux7 운영 체제 컴퓨터(이하 서버)에 서버 프로그램을 설치해 사용하고자 한다면 다음과 같이 외부 컴퓨터(이하 클라이언트)에서 접속 할 수 있도록 서버와 약속한 접속Port가 열려있어야 합니다. 그렇지 않는다면 오직 서버 내부에서만 접속해서 사용할 수 있습니다.
서버 프로그램 | 접속 port | 클라이언트 프로그램 |
---|---|---|
Oracle Database Sever | 1521/tcp | sqlplus.exe Oracle SQL Developer |
PostgreSQL Database Server | 5432/tcp | pgAdmin 4 psql |
sshd | 22/tcp | ssh,scp putty,winscp |
httpd (apache web server) | 80/tcp | chrome firefox safari microsoft ie micorosoft edge |
만약 클라이언트에서 서버와 약속한 Port에 접속을 요구해도 서버의 방화벽(firewall)은 모든 port의 접속을 열어 놓지 않기 때문에 실패로 끝나버립니다. 이러한 서버의 방화벽을 관리하기 위해서는 Linux7 운영 체제에 기본으로 설치된 firewall-cmd 명령을 사용해야 합니다. 이 글에서는 firewall-cmd 명령으로 서버의 방화벽을 관리하는 방법을 소개하겠습니다.
작업 환경
다음과 같은 환경에서 작업했습니다. 참고로 CentOS7(Linux7 운영 체제 배포판)에서도 이 글의 내용을 실행 할 수 있습니다.
# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.9 (Maipo)
# uname -a
Linux rhel7machine 3.10.0-1160.31.1.el7.x86_64 #1 SMP Wed May 26 20:18:08 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
방화벽 서비스 현재 상태 확인하기
다음과 systemctl status firewalld.service 명령으로 방화벽 서비스의 기동/정지 상태를 확인 할 수 있습니다.
# systemctl status firewalld.service
? firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since ? 2021-06-22 09:04:36 KST; 15h ago
Docs: man:firewalld(1)
Main PID: 798 (firewalld)
CGroup: /system.slice/firewalld.service
mq798 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
6? 22 09:04:36 rhel7testa systemd[1]: Starting firewalld - dynamic firewa....
6? 22 09:04:36 rhel7testa systemd[1]: Started firewalld - dynamic firewal....
6? 22 09:04:37 rhel7testa firewalld[798]: WARNING: AllowZoneDrifting is e....
Hint: Some lines were ellipsized, use -l to show in full.
방화벽 서비스의 현재 상태 이외에 “정지“, “시작“, “재 기동” 명령은 다음과 같습니다.
- 방화벽 서비스 정지 : systemctl stop firewalld.service
- 방화벽 서비스 시작 : systemctl start firewalld.service
- 방화벽 서비스 재 기동 : systemctl restart firewalld.service
방화벽 관리 명령 firewall-cmd 이해하기
public.xml와 방화벽 설정 정보 관리 메모리(이하 메모리)
Linux7 운영 체제를 처음 설치한 직후의 /etc/firewalld/zones/public.xml파일 상태는 다음과 같습니다.
# cat /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="ssh"/>
<service name="dhcpv6-client"/>
</zone>
메모리로 읽혀진 방화벽 설정 정보는 firewall-cmd 명령을 사용해 관리 합니다. “–list-all” 옵션을 지정하면 메모리에 있는 모든 방화벽 정보를 화면에 출력합니다.
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
메모리 상에서 5432/tcp 접속 허가하기
다음과 같이 “–add-port” 옵션을 지정하여 PostgreSQL Database 서버의 port 5432/tcp 접속을 허가 할 수 있습니다.
# firewall-cmd --add-port=5432/tcp
다음과 같이 “–list-ports” 옵션을 지정하면 메모리 상에서 허가된 접속 port에 관한 정보를 표시합니다.
# firewall-cmd --list-ports
5432/tcp
그러나 다음과 같이 파일에는 아직 덮어쓰지 않은 상태입니다.
# cat /etc/firewalld/zones/public.xml
... 중간 생략 ...
<service name="ssh"/>
<service name="dhcpv6-client"/>
</zone>
메모리 상의 방화벽 정보를 파일에 덮어쓰기
다음과 같이 “–runtime-to-permanent” 옵션을 지정하면 메모리 상의 모든 방화벽 정보를 파일에 덮어쓸 수 있습니다.
# firewall-cmd --runtime-to-permanent
success
다음과 같이 파일에 방화벽 정보가 추가 되었음을 확인 할 수 있습니다.
# cat /etc/firewalld/zones/public.xml
... 중간 생략 ...
<service name="ssh"/>
<service name="dhcpv6-client"/>
<port protocol="tcp" port="5432"/>
</zone>
이로서 컴퓨터의 “재 기동“과 방화벽 서비스 “정지“, “시작“, “재 기동” 시에도 변경된 최신의 방화벽 상태를 유지 할 수 있게 되었습니다..
# firewall-cmd --add-port=1521/tcp --permanent
success
# cat /etc/firewalld/zones/public.xml
... 중간 생략 ...
<service name="ssh"/>
<service name="dhcpv6-client"/>
<port protocol="tcp" port="5432"/>
<port protocol="tcp" port="1521"/>
</zone>
# firewall-cmd --list-ports
5432/tcp 1521/tcp
# firewall-cmd --list-all
... 중간 생략 ...
services: dhcpv6-client ssh
ports: 5432/tcp 1521/tcp
... 중간 생략 ...
실수로 삭제한 메모리 내용을 파일에서 복원하기
“–remove-port“옵션 등을 사용해 메모리의 방화벽 정보를 실수로 변경했을 때 원래 상태로 복원을 하고 싶다면 “–reload“옵션을 사용합니다. 다음과 같이 삭제 후 “–list-ports“옵션으로 확인했을 때 메모리 상에서는 존재하지 않음을 파일에는 아직 남아 있음을 확인 할 수 있습니다.
# firewall-cmd --remove-port=5432/tcp
success
# firewall-cmd --remove-port=1521/tcp
success
# firewall-cmd --list-ports
#
# cat /etc/firewalld/zones/public.xml
... 중간 생략 ...
<service name="ssh"/>
<service name="dhcpv6-client"/>
<port protocol="tcp" port="5432"/>
<port protocol="tcp" port="1521"/>
</zone>
“–reload“옵션으로 파일에서 메모리로 복원했습니다. “–list-ports” 옵션으로 메모리 상에도 존재함을 확인 할 수 있습니다.
# firewall-cmd --reload
success
# firewall-cmd --list-ports
5432/tcp 1521/tcp