Linux7 방화벽(firewall) 서버-클라이언트 프로그램을 위한 접속 port 열어주기

linux Linux

Linux7 운영 체제 컴퓨터(이하 서버)에 서버 프로그램을 설치해 사용하고자 한다면 다음과 같이 외부 컴퓨터(이하 클라이언트)에서 접속 할 수 있도록 서버와 약속한 접속Port가 열려있어야 합니다. 그렇지 않는다면 오직 서버 내부에서만 접속해서 사용할 수 있습니다.

서버
프로그램
접속
port
클라이언트
프로그램
Oracle Database Sever1521/tcpsqlplus.exe
Oracle SQL Developer
PostgreSQL Database Server5432/tcppgAdmin 4
psql
sshd22/tcpssh,scp
putty,winscp
httpd (apache web server)80/tcpchrome
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와 방화벽 설정 정보 관리 메모리(이하 메모리)

방화벽 설정 정보는 /etc/firewalld/zones/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>

이로서 컴퓨터의 “재 기동“과 방화벽 서비스 “정지“, “시작“, “재 기동” 시에도 변경된 최신의 방화벽 상태를 유지 할 수 있게 되었습니다..

참고로 “–permanent 옵션을 같이 사용하면 메모리와 파일 양쪽으로 정보를 추가 할 수 있습니다.

# 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
제목과 URL을 복사했습니다