ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CentOS 7] Firewalld 방화벽
    Linux/CentOS 2017. 8. 23. 01:03

    Firewalld는 CentOS7부터 이전의 Iptables를 대체해 새롭게 선보인 패킷 필터링 방화벽 프로그램이다. CentOS7뿐 아니라 RHEL과 페도라 등 여러 리눅스 시스템에서 기본 방화벽으로 채택돼 사용되고 있는데, 처음에는 페도라 커뮤니티에 의해 개발이 시작되었다. 리눅스 시스템에서 사용된 방화벽의 역사를 간단히 살펴보면 먼저 커널 2.0에서 사용된 Ipfwadm, 커널 2.2에서 사용된 Ipchains, 커널 2.4에서 커널의 Netfilter 모듈에 기반을 둔 Iptables가 사용됐다. Firewalld도 커널의 Netfilter 모듈 기능을 기반을 둔 방화벽으로서 설정에 대한 변경을 언제든지 할 수 있고, 또한 변경 사항을 저장할 필요 없이 즉시 적용하기 때문에 이전 방화벽이 정적(static)인 방면 Firewalld는 동적(dynamic) 방화벽인 점이 차이점이라고 할 수 있다. Firewalld는 Iptables와의 호환성이 아직 완벽하지 않으며, 조만간 Iptables가 사라지고 그 자리를 대신 물려받을 것으로 전망된다. Iptables가 INPUT, OUTPUT, FORWARD 같은 체인을 이용해 방화벽을 설정한다면 Firewalld는 네트워크 인터페이스에 기초한 Zone을 통해 설정을 적용한다. 




    1. Firewall 서비스 이해


    Firewalld는 방화벽 프로그램이고, 커널의 Netfilter 모듈에 기초를 두고 있다.

    1.1 방화벽의 개념과 종류

    a. 방화벽의 개념

    방화벽은 화재의 확산을 방지하기 위해 사용하는 물리적 장벽에서 유래한 용어로, 컴퓨터 세계에서의 방화벽은 정해진 규칙에 따라 들어오고 나가는 모든 네트워크 패킷을 통제하기 위해 사용되는 소프트웨어 또는 하드웨어로서 네트워크 보안 시스템에 그 기반을 두고 있다.

    방화벽에서 사용하는 기본 정책은 두 가지인데, 첫 번째는 "명확하게 하용되지 않은 것은 모두 금지한다."이고, 두 번째는 "명확하게 금지되어 있는 것은 모두 허용한다."인데 일반적인 경우 첫 번째의 정책이 안전하게 때문에 더 많이 사용된다.

    방화벽은 일반적으로 내부와 외부 네트워크의 경계 지점에 위치하며, 이 중에서 내부 네트워크를 안전하고 신뢰할 만하다고, 외부 네트워크는 안전하지 못할 뿐 아니라 신뢰하기 어렵다는 가정하에 그 정책과 규칙을 적용한다. 기본적으로 들어오고 나가는 패킷에 대해 지정된 정책과 규칙을 사용해 두 가지의 반응, 허용(Accept)과 거절(Reject)이라는 행동을 통해 모든 패킷을 통제한다. 


    b. 방화벽의 종류

      방화벽 종류

     설명 

     1.패킷 필터링 방화벽

    - 제 1세대 방화벽

    - 레이어 1~4에서 사용

    - 단순하기 때문에 빠르고 효과적

     2. Stateful 방화벽 

    - 제 2세대 방화벽

    - 패킷의 연결 상태를 관찰

    - 메모리에서 상태 테이블 사용 

     3. 애플리케이션 레이어 방화벽 

    - 제 3세대 방화벽

    - 레이어7까지 패킷 검사와 필터링 

    1. 패킷 필터링 방화벽(Packet Filtering Firewall)

     1980년대 말 개발된 제 1세대 방화벽으로서 패킷에 대해 규칙을 적용해 패킷을 허용할지 아니면 거절 또는 버릴지를 결정한다. 각 패킷에 대해 구체적 행동을 결정하기 위해 패킷 내의 헤더에서 출발지와 목적지 IP 주소, 출발지와 목적지의 포트 및 프로토콜 정보(TCP,UDP)를 검사하고, 이 정보들이 정해진 규칙에 일치할 경우 허용하고 일치하지 않으면 해당 패킷을 버리게 된다. 어떤 규칙에도 일치하지 않는 경우 기본 규칙이 적용된다. 

     패킷 필터링 방화벽은 작동 방식이 단순하기 때문에 처리 속도가 빠르고, 사용자는 이러한 과정을 전혀 알지 못한다는 장점이 있는 반면 OSI 레이어 중 5~7에 위치한 취약점은 발견할 수 없다는 단점이 있다.


    2. Stateful 방화벽

     1990년대 AT&T Bell 연구소에서 개발한 제 2세대 방화벽으로서 앞의 패킷 필터링 기능을 제공할 뿐 아니라 상태 기반 패킷 검사(Stateful Packet Inspection) 기능을 제공한다. 이는 패킷 필터링 방화벽과는 달리 방화벽을 통과한 패킷에 대해서도 그 연결 상태를 관찰해 테이블에 기록한 다음에 새로운 규칙을 추가할 수 있다. 

     여기서 연결 상태란 패킷이 새로운 연결인지, 기존 연결과 관련이 있는지, 아니면 어떤 연결과도 관려이 없는지 등의 검사를 의미한다. 이러한 패킷에 대한 관찰을 지속하기 위해서는 이런 정보를 저장할 메모리가 충분해야만 이 기능을 지원할 수 있 기 때문에 하드웨어에 대한 고려와 기록 이후 정보의 사용에 대한 처리 과정이 필요하다. 그리고 이 방화벽은 수많은 가짜 연결 정보를 이용해 이러한 메모리를 가득 채우는 Dos 공격에 취약하다는 단점이 있다.


    3. 애플리케이션 레이어 방화벽 (Application Layer Firewall)

     1990년대 중반 개발된 제 3세대 방화벽으로서 앞의 두 방화벽이 레이어 1~4에서 동작하는것과 달리 애플리케이션 방화벽은 가장 상위 레이어인 애플리케이션 레이어에서 동작한다. 이 방화벽은 FTP나 HTTP처럼 특정 애플리케이션으로 들어오거나 나가는 모든 패킷을 가로채 그 콘텐츠를 검사하고 올바르지 않은 패킷인 경우 제한을 가하거나 예방을 통해 네트워크 바이러스나 트로이목마의 확산을 방지하는 역할을 수행한다. 

     이러한 과정을 통해 방화벽은 허용되지 않은 프로토콜이 방화벽을 통과하거나 이미 바이러스나 웜에 감염된 애플리케이션을 탐지하는데 유용하게 사용된다. 이 애플리케이션과 상관없는 패킷인 경우 모두 버려지며, 이에 대해 송신자에게 어떤 메시지도 보내지 않는다.


    1.2 Netfilter의 작동 원리와 구성 요소

    a. 작동 원리

    1. PREROUTING : 패킷이 네트워크 인터페이스로 들어오자마자 이 패킷의 최종 목적지를 결정하기 이전에 이 패킷을 내부에서 어디로 보낼지 결정하는 체인이다. 여기서 내부란 포워딩을 위해 사용되는 다른 인터페이스 또는 로컬 프로세스를 의미하며, 라우팅이 불가능한 경우 패킷을 버리게 된다.

    2. INPUT : 로컬 시스템을 목적지로 하는 패킷에 적용되는 체인이다. 즉 라우팅이 결정에 의해 그 목적지가 시스템 자체가 제공하는 서비스인 경우 그 체인에 정의된 규칙이 적용된다.

    3. FORWARD : 라우팅 결정에 의해 패킷의 목적지가 다른 인터페이스인 경우 적용되는 체인이다.

    4. OUTPUT : 로컬 시스템에서 생성돼 외부 네트워크를 목적지로 향하는 패킷을 위해 사용되는 체인이다.

    5. POSTROUTING : 패킷을 위해 마지막으로 사용되는 체인으로서 라우팅에 의해 목적지가 결정돼 외부로 나가는 패킷이나 포워딩이 필요한 패킷을 위해 사용되는 체인이다.


    b. 구성 요소

    Netfilter는 규칙, 타겟, 정책, 체인과 테이블을 통해 그 기능을 구현하고 있다.

    1. 규칙(Rule) : Netfilter에서 가장 핵심적인 구성 요소로서 하나 또는 그 이상 일치돼야 할 항목들로 구성되며, 패킷이 이러한 규칙이 일치(match)할 경우 타겟을 이용해 구체적인 행동 사항을 지정한다. 들어오는 패킷이 설정된 여러 규칙 중 한가지와 일치할 경우 더 이상의 규칙 검사는 진행되지 않으며 이 규칙에 정의된 target, 즉 구체적인 행동이 적용되면서 이 패킷에 대한 동작을 종료하게 된다.

    2. 타겟(Target) : 정해진 규칙에 일치된 패킷은 해당 규칙에 지정된 타켓으로 보내진다. 이 타겟은 이렇게 일치된 패킷에 대해 구체적인 행동을 정의한 것인데, 각각 내장 타겟과 확장 타겟을 통해 다양한 종류의 타겟을 사용할 수 있다. 대표적으로 사용되는 내장 타겟으로 패킷을 받아들이는 Accept, 패킷을 거부하는 Drop과 Reject, 패킷에 대한 자세한 정보를 기록하는 Log, 마지막으로 주소 변환에 사용되는 SNAT와 DNAT 등이 있다.

    3. 체인 (Chain) : Netfilter 구조에서 체인은 정책이 결합된 하나의 그룹이다. 일반적으로 한 개의 체인은 여러 개의 규칙과 한 개의 정책으로 구성된다. 체인으로 들어온 패킷은 각각의 규칙을 순서대로 거치게 되며, 이 중 한 규칙과 일치되면 이 패킷은 그 규칙에 정의된 타겟으로 보내진다. 이로써 그패킷에 대한 체인에서의 모든 과정은 종료된다. 최종적으로 일치되는 규칙이 없는 경우 이 체인에 설정된 정책이 적용된다. 체인과 체인 간에 복잡한 설정이 필요한 경우 Netfilter가 지원하는 매우 뛰어난 기능이며, 가장 대표적인 체인으로 PREROUTING, INPUT, OUTPUT, FORWARD, POSTROUTING이 사용된다.

    4. 정책(Policy) : Netfilter가 제공하는 모든 체인을 갖고 있는데, 이 정책은 체인에서 각 규칙을 모두 통과한 패킷에 적용된다. 이 정책은 수행하는 마지막 행위로서 최종 타겟이라고도 하는데, 정책의 종류로 DROP, ACCEPT 등이 사용된다.

    5. 테이블(Table) : 체인은 여러 개의 규칙과 한 개의 정책이 결합된 그룹이라고 설명했는데, 테이블은 여러 체인이 결합된 그룹이다. 

     Table

     Filter

    NAT 

    MANGLE 

    INPUT 

    PREROUTING 

    PREROUTING

    FORWARD 

    POSTROUTING 

    INPUT 

    OUTPUT 

    OUTPUT 

    FORWARD 

     

     

    OUTPUT

     

     

    POSTROUTING 

    기본적으로 Netfilter 시스템은 세 가지의 내장 테이블을 제공하는데, Filter, NAT, MANGLE이다. 기본 설정에서 테이블 내의 체인은 ACCEPT 정책을 따르고 있으며, 실제 설정에서는 기본 정책으로 DROP이나 REJECT를 사용하길 추천한다.


    1.3 Firewall 이해

    a. Firewall 작동 원리

    1. 명령어 GUI 프로그램인 firewall-config, 커맨드라인 firewall-cmd를 이용해 firewalld데몬을 이용한 패킷 필터링 설정을 진행한다. 이 두 명령어는 각각 firewalld와 firewall-config 패키지를 설치해야만 사용할 수 있는데, GUI인 firewall-config는 명령어인 firewall-cmd에 비해 설정이 매우 제한적이다.

    2. Firewalld 이러한 명령어들은 firewall 데몬이 실행되고 있어야 설정할 수 있으며, firewalld 데몬은 이러한 명령어들로부터 설정 내용을 전달받아 명령어 iptables로 전달한다. 이 firewalld 데몬은 명령어 systemctl start firewalld를 통해 서비스를 시작할 수 있다.

    3. Iptables 명령어 iptables는 firewalld 데몬이 보내온 설정 내용을 적용해서 패킷 필터링을 시스템에서 진행한다. 이 명령어 iptables는 서비스 iptables와는 다르며, 이 서비스가 활성화되지 않아도 사용이 가능하다. Firewalld가 보내온 명령어가 제대로 적용됐는지 확인하기 위해 명령어 iptables -L을 사용한다.

    4. System-config-firewall 한편 iptables가 제공하는 GUI명령어도 방화벽 설정이 가능한데, 이 프로그램을 사용하기 위해서는 iptables 서비스가 시작돼야 한다. 이 프로그램이 설정한 내용도 iptables에 전달되기 때문에 firewalld와 함께 사용하는 경우 규칙이 서로 혼동되거나 충돌할 수 있으므로 한 가지만 선택해서 사용하는 것이 효과적이다.

    5. Netfilter 이러한 iptables 명령어는 리눅스 커널에서 모듈 Netfilter가 활성화돼야 제대로 동작하는데, 기본적으로 활성화돼 있다.


    b. 구성 요소

    1. firewalld 데몬

    firewall 데몬은 네트워크 연결이나 인터페이스에 대한 신뢰의 정도를 의미하는 Zone 기능을 지원하는 동적인 방화벽 프로그램이다. Firewalld는 IPv4, IPv6 설정을 지원할 뿐 아니라 실행 중일 때의 설정과 영구적인 사용을 위한 설정을 분리해서 사용할 수 있다. 또한 서비스나 애플리케이션에 대한 방화벽 규칙을 직접 생성해서 추가하는 기능도 지원한다. 

    2. GUI firewall-config

    firewalld를 관리하기 위한 GUI설정 도구로서 일반적인 옵션만을 제공하기 때문에 그 기능이 firewall-cmd에 비해 매우 제한적이다.

    3. 명령어 firewall-cmd

    firewalld 데몬이 제공하는 커맨드라인 클라이언트 프로그램으로서 실행 중에 임시로 사용되는 설정뿐 아니라 영구적 설정을 위한 인터페이스를 제공한다. 또한 이 두 가지는 모두 분리돼 사용될 수 있다.


    c. Firewalld와 Iptables의 차이

      차이

     설명 

     설치

     CentOS7에서 Firewalld는 기본적으로 설치되지만, Iptables는 별도의 패키지 설치가 필요하다. 

     구성 요소

     Iptables는 서비스 제공을 위해 체인과 규칙을 사용하지만, Firewalld는 Zone(public, dmz 등)과 Service를 사용한다.

     설정 파일 

     Iptables는 설정 파일로서 /etc/sysconfig/iptables를 사용하지만 Firewalld는 디렉토리 /etc/firewalld와 /usr/lib/firewalld 

     에 저장된 XML 파일을 사용해 설정을 관리한다.

     작동 방법 

     Iptables는 변경될 때마다 이전 규칙(Rule)들을 모두 버리고 /etc/sysconfig/iptables에서 새로운 규칙을 다시 읽어 적용하

     지만, Firewalld는 단지 변경된 규칙만 다시 읽어 들여 적용한다. 또한 Firewalld 이미 기존의 연결된 세션의 중단 없이 언제

     든지 설정 추가와 변경이 가능한 점이 Iptables와의 차이점이다. 



    2. Firewalld 서비스 시작과 사용


    2.1 Firewalld 서비스 시작

    Firewalld 서비스를 시작하는데, Iptables를 사용하고 있다면 Firewalld를 사용하기 위해서 서비스를 중지해야 한다.

    a. Iptables 중지

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 현재 iptables 서비스가 실행 중인지 확인한다.
    [root@master ~]# systemctl status iptables
    Unit iptables.service could not be found.
     
    # 실행 중이라면 iptables 서비스를 중지한다. 
    [root@master ~]# systemctl stop iptables
    Failed to stop iptables.service: Unit iptables.service not loaded.
     
    # 방화벽으로서 firewalld를 계속 사용하고 iptables 서비스를 사용하지 않기 위해 mask로 설정한다. 
    # 그러면 start 명령어를 사용해도 unmask를 사용하기 전까지 iptables 서비스를 사용할 수 없다.
    [root@master ~]# systemctl mask iptables
    Created symlink from /etc/systemd/system/iptables.service to /dev/null.
    cs


    b. Firewalld 서비스 시작

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    # 서비스에 사용할 두 가지의 패키지를 설치한다.
    [root@master ~]# yum install firewalld firewall-config -y
     
    # rpm을 이용해 설치 및 버전 정보를 확인한다.
    [root@master ~]# rpm -qa | grep firewall
    firewall-config-0.4.3.2-8.1.el7_3.3.noarch
    firewalld-0.4.3.2-8.1.el7_3.3.noarch
     
    # firewalld를 시작한다.
    [root@master ~]# systemctl start firewalld
     
    # 부팅 후에도 서비스가 자동으로 시작되게 설정한다.
    [root@master ~]# systemctl enable firewalld
     
    # firewalld 서비스에 대한 두 개의 링크 파일이 생성되는데, basic.target 디렉토리는 기본 Taget이 
    # multi-user.target이나 graphical.target이든 기본적으로 시작되는 서비스가 바로 이 Target에 속한다.
    [root@master ~]# ls -l /etc/systemd/system/basic.target.wants/
    total 0
    lrwxrwxrwx. 1 root root 41 Aug  8 08:38 firewalld.service -> /usr/lib/systemd/system/firewalld.service
     
    # 서비스의 상태를 확인하기 위해 status를 사용하면 active와 firewalld가 시작됐다는 메시지를 확인할 수 있다. 
    [root@master ~]# systemctl status firewalld
    â firewalld.service - firewalld - dynamic firewall daemon
       Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
       Active: active (running) since Tue 2017-08-08 13:27:20 UTC; 56s ago
         Docs: man:firewalld(1)
     Main PID: 3132 (firewalld)
       CGroup: /system.slice/firewalld.service
               ââ3132 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
    Aug 08 13:27:19 master.chul.com systemd[1]: Starting firewalld - dynamic firewall daemon...
    Aug 08 13:27:20 master.chul.com systemd[1]: Started firewalld - dynamic firewall daemon.
     
    # ps를 통해서도 그 프로세스를 확인할 수 있다.
    [root@master ~]# ps -ef | grep firewalld
    root      3132     1  0 13:27 ?        00:00:00 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
     
    cs


    2.2 Firewalld 기본 사용

    a. 기본 내용 확인

    명령어 firewall-cmd를 이용해 기본 정보를 확인해보자.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    # 사용중인 firewalld 버전 정보를 확인한다.
    [root@master ~]# firewall-cmd --version
    0.4.3.2
     
    # 제공하는 모든 옵션을 확인할 경우 사용한다.
    [root@master ~]# firewall-cmd -h
    Usage: firewall-cmd [OPTIONS...]
     
    # 현재 firewalld의 상태를 확인할 경우 사용된다. 시작하지 않으면 "not running"이라는 메시지를 볼 수 있다.
    [root@master ~]# firewall-cmd --state
    running
     
    # 서비스 시작 이후 아무런 설정 변경 없이 firewalld의 현재 설정 정보를 확인할 경우 사용한다.
    [root@master ~]# firewall-cmd --list-all
    public (active)
      target: default
      icmp-block-inversion: no
      interfaces: eth0
      sources:
      services: dhcpv6-client ssh
      ports: 3306/tcp
      protocols:
      masquerade: no
      forward-ports:
      sourceports:
      icmp-blocks:
      rich rules:
     
    # firewalld가 사용하는 기본 설정 파일에서 변경 가능하다.
    [root@master ~]# ls /etc/firewalld/firewalld.conf
    /etc/firewalld/firewalld.conf
     
    # firewalld 서비스가 지원 가능한 서비스 목록을 확인하기 위해 사용한다.
    [root@master ~]# firewall-cmd --get-service
    RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client ceph ceph-mon dhcp dhcpv6 dhcpv6-client dns 
    docker-registry dropbox-lansync freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https 
    imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mosh 
    mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp 
    ptp pulseaudio puppetmaster radius rpc-bind rsyncd samba samba-client sane smtp smtps snmp snmptrap squid ssh 
    synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https 
    xmpp-bosh xmpp-client xmpp-local xmpp-server
     
    # 현재의 Zone에서 허용되고 있는 서비스 목록을 확인하고, 기본적으로 /etc/firewalld/zones/public.xml에 지정돼 있기 때문에 허용된다.
    [root@master ~]# firewall-cmd --list-service
    dhcpv6-client ssh
     
    # 현재 사용 중인 기본 Zone을 확인할 경우 사용되는데, 이 Zone은 설정 파일 /etc/firewalld/firewalld.conf에 정의돼 있다.
    [root@master ~]# firewall-cmd --get-default-zone
    public
    cs


    b. 새 서비스를 Firewalld 지원 목록에 추가

    서버 패키지를 설치한다고 모든 서버를 Firewalld가 지원하는 것은 아니다. Firewalld가 사용하는 XML 형태의 파일이 특정 디렉토리에 존재해야 비로소 Firewalld는 이 서버에 대한 방화벽 서비스를 제공할 수 있다. 여기서는 기존 Firewalld가 사용하는 XML파일을 이용해서 새 서비스를 Firewalld 지원 목록에 추가하는 방법을 알아본다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    # 서버 목록은 모두 이 디렉토리에 존재하는 XML 파일을 Firewalld가 읽어 들여 보여주는 것이다.
    # 새로운 서버 프로그램을 설치할 경우 이 디렉토리에 XML 파일이 있어야 Firewalld는 새로운 서버에 방화벽 서비스를 제공할 수 있다.
    [root@master ~]# ls /usr/lib/firewalld/services/
    amanda-client.xml        https.xml         mountd.xml      puppetmaster.xml    telnet.xml
    amanda-k5-client.xml     http.xml          ms-wbt.xml      radius.xml          tftp-client.xml
    bacula-client.xml        imaps.xml         mysql.xml       RH-Satellite-6.xml  tftp.xml
    bacula.xml               imap.xml          nfs.xml         rpc-bind.xml        tinc.xml
    ~
    docker-registry.xml      kpasswd.xml       pop3s.xml       snmptrap.xml        xmpp-client.xml
    dropbox-lansync.xml      ldaps.xml         pop3.xml        snmp.xml            xmpp-local.xml
    freeipa-ldaps.xml        ldap.xml          postgresql.xml  squid.xml           xmpp-server.xml
    freeipa-ldap.xml         libvirt-tls.xml   privoxy.xml     ssh.xml
     
    # 테스트를 위해 ssh.xml 파일을 /etc/firewalld/service 디렉토리로 이동한다. 수동으로 서비스를 추가할 경우 이 디렉토리를 사용한다.
    [root@master ~]# cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/
    [root@master ~]# cd /etc/firewalld/services/
     
    # 명령어 mv를 사용해 SSH 서비스를 임의의 서비스 이름 RCCP로 변경한다.
    [root@master services]# mv ssh.xml rccp.xml
     
    # vim으로 열어서 아래 내용을 수정한다.
    [root@master services]# vim rccp.xml
    [root@master services]# cat rccp.xml
    <?xml version="1.0" encoding="utf-8"?>
    <service>
      <short>RCCP</short>
      <description> RCCP is a new service for Testing Firewalld.</description>
      <port protocol="tcp" port="2500"/>
    </service>
     
    # 변경 사항을 Firewalld가 인식하게 reload 옵션을 사용한다.
    [root@master services]# firewall-cmd --reload
    success
     
    # 서비스 지원 목록을 확인하기 위해 get-service 옵션을 사용하면 새로 추가된 서비스를 확인할 수 있다.
    [root@master services]# firewall-cmd --get-service | grep rccp
    rccp
    cs


    c. GUI 프로그램 firewall-config 사용

    명령 창에서 명령어 firewall-config만을 사용하면 Firewall GUI 프로그램을 사용할 수 있다. X 윈도우에서 사용이 가능하기 때문에 참조하기 바랍니다.

    1
    2
    3
    4
    [root@master services]# firewall-config
     
    ** (firewall-config:3549): WARNING **: Could not open X display
    cs



    3. Firewalld Zone 사용


    Firewalld에서 새로이 소개된 Zone은 네트워크 연결에 대한 사용자의 신뢰 정도를 정의하기 위해 사용되는 개념이다. 이를 위해 Firewalld는 구체적으로 IP 주소가 지정된 네트워크 인터페이스를 기초로 해서 Zone을 사용하며, 그 신뢰 정도에 따라 각각 다른 규칙 세트(Ruleset)를 생성해 적용한다. 예를 들어 신뢰할 수 있는 내부 네트워크 사용자들에게는 모든 서비스로의 접근을 허용하지만, 외부 네트워크 사용자들에게는 공개 서비스만 제공하는 경우 Firewalld는 Zone를 사용해 이러한 환경을 제공할 수 있습니다.

    3.1 Zone 종류

      Zone

     설명 

     Drop 존 

    Iptables에서 사용하던 DROP과 동일하며, 들어오는 모든 패킷은 버려지고 이에 대한 응답 메시지도 보내지 않으며 단지 외부로로 나가는 연결만 허용된다. 

     Block 존

    Drop 존처럼 들어오는 모든 네트워크 연결은 거부되는데, 이에 대해 단지 icmp-host-prohibited와 i cmp6-prohibited라는 응답 메시지를 보낸다. 그러나 시스템 내부에서 시작된 연결은 허용된다. 

     Public 존 

    서비스를 제공하는 특별한 포트로의 연결만을 허용하고, 그 외 포트로의 연결은 모두 거부되며 기본 Zone으로 사용된다. 

     External 존 

    특별히 매스커레이딩 규칙이 적용되는 외부의 라우터를 위해 사용되며, 단지 내부로의 연결 요청 중에서 선택된 연결만을 허용 

     DMZ 존 

    내부 네트워크로의 접근은 제한적으로 허용되지만, 공개된 네트워크에 대한 접근을 허용하는 경우에 사용되며 이 경우도 선택된 연결만이 허용된다. 

     Work 존 

    같은 회사에 위치한 네트워크를 위해 사용되며, 대부분 같은 네트워크에 위치한 다른 시스템을 신뢰하고 오직 선택된 연결만을 접속 허용한다. 

     Home 존 

    홈 영역을 위해 사용되며, 네트워크에 존재하는 다른 시스템을 신뢰하고 오직 선택된 연결만을 접속 허용한다. 

     Internal 존

    내부 네트워크를 위해 사용되고, 선택된 연결만을 접속 허용한다. 

     Trusted 존 

    모든 네트워크 접속 연결을 허용하는 경우 사용한다. 


    3.2 Zone 사용

    a. Zone 정보 확인

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    # 사용 가능한 Zone의 목록을 확인하기 위해 사용한다. 이 Zone들은 모두 /usr/lib/firewalld/zones에 XML 설정 파일로 저장돼 있다.
    [root@master services]# firewall-cmd --get-zones
    work drop internal external trusted home dmz public block
    [root@master services]# ls /usr/lib/firewalld/zones/
    block.xml  dmz.xml  drop.xml  external.xml  home.xml  internal.xml  public.xml  trusted.xml  work.xml
     
    # 현재 사용 중인 Zone과 이 Zone이 속한 네트워크 인터페이스 목록을 확인한다.
    [root@master services]# firewall-cmd --get-active-zones
    public
      interfaces: eth0
     
    # 현재 Firewalld가 사용 가능한 Zone 중에서 기본으로 설정된 Zone을 확인한다. 
    [root@master services]# firewall-cmd --get-default-zone
    public
     
    # 모든 Zone의 자세한 정보를 알기 위해 사용한다.
    [root@master services]# firewall-cmd --list-all-zones
    drop
      target: DROP
      icmp-block-inversion: no
      interfaces:
      sources:
      services:
      ports:
      protocols:
      masquerade: no
      forward-ports:
      sourceports:
      icmp-blocks:
      rich rules:
    public (active)
      target: default
      icmp-block-inversion: no
      interfaces: eth0
      sources:
      services: dhcpv6-client ssh
      ports: 3306/tcp
      protocols:
      masquerade: no
      forward-ports:
      sourceports:
      icmp-blocks:
      rich rules:
     
    # 현재 사용 중인 네트워크 인터페이스가 어느 Zone에 속해 있는지 알기 위해 사용한다.
    [root@master services]# firewall-cmd --get-zone-of-interface=eth0
    public
     
    # 사용 중인 public 존에 어떤 네트워크 인터페이스가 속해 있는지 확인하기 위해 사용한다.
    [root@master services]# firewall-cmd --zone=public --list-interfaces
    eth0
     
    # public 존이 제공하는 모든 정보를 확인하기 위해 사용되는데, 이 Zone에 속한 네트워크와 서비스 종류를 알 수 있다.
    [root@master services]# firewall-cmd --zone=public --list-all
    public (active)
      target: default
      icmp-block-inversion: no
      interfaces: eth0
      sources:
      services: dhcpv6-client ssh
      ports: 3306/tcp
      protocols:
      masquerade: no
      forward-ports:
      sourceports:
      icmp-blocks:
      rich rules:
    cs


    b. Zone 정보 변경

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    # 현재 세 개의 네트워크 인터페이스 중에서 한 인터페이스를 선택해 public 존에 추가한다.
    [root@master services]# firewall-cmd --zone=public --add-interface=eth0
    The interface is under control of NetworkManager, setting zone to 'public'.
    success
     
    # 현재 public 존에 속한 인터페이스를 home 존으로 변경하기 위해 사용한다.
    [root@master services]# firewall-cmd --zone=home --change-interface=eth0
    The interface is under control of NetworkManager, setting zone to 'home'.
    success
     
    # home 존에서 이 인터페이스를 제거할 경우 사용한다.
    [root@master services]# firewall-cmd --zone=home --remove-interface=eth0
    The interface is under control of NetworkManager, setting zone to default.
    success
     
    # 이 인터페이스에 대해 질의하면 없다는 메시지를 볼 수 있다.
    [root@master services]# firewall-cmd --zone=home --query-interface=eth0
    no
     
    # 이 인터페이스는 home 존에서 삭제됐기 때문에 아무런 Zone에 속하지 않았으므로, 다시 public 존에 포함시킨다.
    [root@master services]# firewall-cmd --zone=public --add-interface=eth0
    The interface is under control of NetworkManager, setting zone to 'public'.
    success
     
    # 네트워크 인터페이스 Zone을 변경해도 시스템을 다시 시작하는 경우 그 정보가 사라지게 된다. 영구적으로 이 Zone의 정보를 유지할 경우 
    # 네트워크 인터페이스 설정 파일 마지막 줄에 ZONE=public를 추가한다. 그러면 이 파일을 NetworkManager가 읽어 지정된 Zone으로 연결해준다.
    [root@master network-scripts]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep ZONE
    ZONE=public
     
    # 사용 중인 기본 존을 변경하는 방법은 두 가지인데, 첫 번째는 이렇게 명령어로 바로 변경할 수 있고, 두 번째는 설정 파일을 열어 변경할 수 있다.
    [root@master network-scripts]# firewall-cmd --set-default-zone=home
    success
    [root@master network-scripts]# cat /etc/firewalld/firewalld.conf | grep DefaultZone
    DefaultZone=home
     
    # 명령어로 변경할 경우 firewalld 데몬을 다시 읽어 들이지 않고 적용되지만, 설정 파일 변경할 경우 reload 옵션을 사용해야 내용이 적용된다.
    [root@master network-scripts]# firewall-cmd --reload
    success
    cs



    4. Firewalld를 이용한 서비스 사용


    4.1 서비스와 포트 관리

    Firewalld를 이용해 서비스와 포트를 관리하기 위한 방법을 설명한다. 이후에 설명할 내용과 비교했을 때 가장 많이 사용되는 방법이다.

    a. 서비스 관리

    Firewalld가 지원 가능한 서비스는 모두 /usr/lib/firewalld/services에 내용이 XML 파일로 지정돼 있어야 사용할 수 있다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    # 현재 지원하는 서비스 목록을 확인할 수 있는데, 이 목록은 /usr/lib/firewalld/service/에 저장된 XMl 파일을 의미
    [root@master ~]# firewall-cmd --get-service
    RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client ceph ceph-mon dhcp dhcpv6 dhcpv6-client 
    ~
    synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https 
     
    # 새 서비스 http를 추가하기 위해 사용된다. timeout=60 옵션을 사용하면 그 서비스 제공 시간을 제한가능하다. (기본 초 단위) 
    [root@master ~]# firewall-cmd --add-service=http
     
    # 서비스를 특정 Zone에 추가할 경우 Zone이름을 지정할 수 있다. Zone을 지정하지 않으면 기본 존에 추가된다.
    [root@master ~]# firewall-cmd --zone=public --add-service=https
     
    # 여러 서비스도 { }를 이용해 동시에 추가할 수 있다.
    [root@master ~]# firewall-cmd --zone=public --add-service={smtp,ftp,dns}
     
    # 지금까지 추가한 서비스 목록을 확인한다.
    [root@master ~]# firewall-cmd --list-service
    dhcpv6-client ssh http https smtp ftp dns
     
    # firewall-cmd 설정한 내용이 firewalld 데몬을 통해 명령어 iptables로 전달되고, 여기 Chain IN_public_allow에 추가한 서비스 확인이 가능
    [root@master ~]# iptables -L
    Chain IN_public_allow (1 references)
    target     prot opt source               destination
    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh ctstate NEW
    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:mysql ctstate NEW
    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https ctstate NEW
    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:smtp ctstate NEW
    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ftp ctstate NEW
    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain ctstate NEW
    ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain ctstate NEW
    ~
     
    # Firewalld를 다시 시작하면
    [root@master ~]# firewall-cmd --reload
     
    # 앞에서 추가한 서비스 목록을 확인하면 보이지 않는다.
    [root@master ~]# firewall-cmd --list-service
    dhcpv6-client ssh
     
    # 이번에는 http 서비스에 permanent 옵션을 추가한다.
    [root@master ~]# firewall-cmd --permanent --add-service=http
     
    # Firewalld를 다시 시작하면
    [root@master ~]# firewall-cmd --reload
     
    # firewalld는 동적 방화벽이어서 언제든지 설정을 추가할 수 있고, 내용은 바로 적용된다. 그런데 데몬을 다시 시작하거나 시스템을 
    # 다시 시작하는 경우 모두 사라지게 된다. 서비스를 계속 사용한다면 permanent 옵션을 추가해야 한다.
    [root@master ~]# firewall-cmd --list-service
    dhcpv6-client http ssh
     
    # 영구적으로 사용할 서비스 목록은 아래 파일에 저장된다. 명령어뿐아니라 직접 입력해도 영구적으로 사용할 수 있다.
    # 이 테스트를 통해 Firewalld는 실행 중일 때의 설정과 영구적인 설정을 분리해서 사용할 수 있다는 사실을 보여준다.
    [root@master ~]# cat /etc/firewalld/zones/public.xml | grep http
      <service name="http"/>
     
    # 추가한 실행 중인 서비스를 제거할 때 remove-service 옵션을 사용한다.
    [root@master ~]# firewall-cmd --zone=public --remove-service=http
     
    # 영구적 Zone 파일로부터 제거할 경우에도 permanent 옵션을 추가해야 한다. 
    [root@master ~]# firewall-cmd --permanent --zone=public --remove-service=http
    cs


    4.2 머스커레이딩과 포트 포워딩

    서버가 게이트웨이로 사용되는 경우 머스커레이딩(masquerade, 은폐)은 내부 네트워크 주소와 외부 네트워크 주소를 서로 연결하기 위해 사용하는 기능이다.  즉, 외부 네트워크에서는 external 존으로만 접속 가능하고, internal 존은 내부 네트워크 사용자만 사용 가능하게 설정하고, 포트 포워딩을 통해 external 존에서의 요청을 internal 존으로 전달하거나 내부 네트워크에서의 요청을 외부로 전달할 수 있다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    # 현재 활성화된 Zone과 인터페이스를 확인할 수 있다.
    [root@master ~]# firewall-cmd --get-active-zone
    public
      interfaces: eth0
     
    # eth0 인터페이스를 external 존으로 변경하는데, 이는 외부로 연결되고
    [root@master ~]# firewall-cmd --zone=external --change-interface=eth0
    The interface is under control of NetworkManager, setting zone to 'external'.
     
    # eth1 인터페이스를 internal 존으로 변경하는데, 이는 내부 네트워크로 연결하기 위해서다.
    [root@master ~]# firewall-cmd --zone=internal --change-interface=eth1
     
    # 변경된 Zone과 인터페이스 정보를 확인한다.
    [root@master ~]# firewall-cmd --get-active-zone
    internal
      interfaces: eth1
    external
      interfaces: eth0
     
    # external 존에 masquerade 기는ㅇ을 추가한다. 제거할 경우 add 대신 remove를 사용한다.
    [root@master ~]# firewall-cmd --zone=external --add-masquerade
     
    # 이 기능에 대해 질의하면 yes, 즉 추가됐음을 알 수 있다.
    [root@master ~]# firewall-cmd --zone=external --query-masquerade
    yes
     
    # 포트 포워딩을 허용하는 커널의 기능이 활성화(1)됐는지 확인한다. 활성화되지 않았다면 이 파일을 숫자 1로 변경하면 된다.
    [root@master ~]# cat /proc/sys/net/ipv4/ip_forward
    1
     
    # 포트 포워딩을 설정하는데 external 존의 22번 포트로의 연결을 내부의 1234 포트로 전달하라는 의미다.
    [root@master ~]# firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=1234
     
    # 동일한 포트 포워딩인데 단지 22번 포트의 연결을 포토는 같지만 IP 주소가 다른 시스템으로 전달하라는 의미다.
    [root@master ~]# firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=22:toaddr=192.168.20.6
     
    # 설정 변경을 확인하기 위해 external 존을 조회하면, 포트 포워딩에 대한 두 가지 설정을 확인할 수 있다.
    [root@master ~]# firewall-cmd --list-all --zone=external
    external (active)
      target: default
      icmp-block-inversion: no
      interfaces: eth0
      sources:
      services: ssh
      ports:
      protocols:
      masquerade: yes
      forward-ports: port=22:proto=tcp:toport=22:toaddr=192.168.20.6
            port=22:proto=tcp:toport=1234:toaddr=
      sourceports:
      icmp-blocks:
      rich rules:
    cs


    4.3 패닉 모드

    패닉 모드(Panic Mode)는 나가고 들어오는 모든 패킷을 거부할 때 사용한다. 기존 연결도 중단돼 다시 패닉 모드를 비활성화할 때까지 연결이 이뤄지지 않는다.

    학습중에 테스트로 패닉 모드를 활성화 했다가 System Hang ㅠㅠ 발생......... 절대 따라하지 맙시다. 그냥 이런게 있구나... --Skip

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 패닉 모드를 활성화 한다.
    [root@master ~]# firewall-cmd --query-panic

    # 패닉 모드인지 질의하기 위해 사용한다.
    [root@master ~]# firewall-cmd --query-on
     
    # 패닉 모드를 비활성화하면 다시 연결이 이뤄진다.
    [root@master ~]# firewall-cmd --panic-off
    success
                        Colored by Color Scripter
    cs


    4.4 다이렉트 인터페이스

    다이렉트 인터페이스(Direct Interface)란 특정한 서비스나 애플리케이션을 위해 실행 중인 Firewalld에 새로운 체인이나 규칙을 생성하거나 삭제할 수 있는 기능을 의미한다. 그러나 iptables 사용법이 능숙하지 않은 경우 주의가 필요한데, 새로운 규칙이나 체인이 기존의 규칙이나 체인과 충돌하거나 위반할 수 있기 때문이다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # direct와 add-rule을 이용해 INPUT 체인에 포트 9000번으로의 연결을 허용하라는 규칙을 생성한다.
    # 생성된 규칙을 영구적으로 사용하거나 permanent 옵션을 사용하는 경우 파일에 저장된다. 
    [root@master ~]# firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 9000 -j ACCEPT
    success
     
    # 이 규칙을 생성 후에 그 목록을 확인할 수 있다.
    [root@master ~]# firewall-cmd --direct --get-all-rules
    ipv4 filter INPUT 0 -p tcp --dport 9000 -j ACCEPT
     
    # 생성한 규칙을 제거할 경우 remove-rule 옵션을 사용한다. 
    [root@master ~]# firewall-cmd --direct --remove-rule ipv4 filter INPUT 0 -p tcp --dport 9000 -j ACCEPT
    success
                                       Colored by Color Scripter
    cs


    4.5 ICMP 사용

    Firewalld는 ICMP에 대한 관리도 지원한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    # Firewalld가 지원하는 ICMP 유형의 목록이다.
    [root@master ~]# firewall-cmd --get-icmptypes
    destination-unreachable echo-reply echo-request parameter-problem redirect router-advertisement router-solicitation 
    source-quench time-exceeded timestamp-reply timestamp-request
     
    # public존에 ICMP유형 echo-request를 허용하지 않기 위해 추가한다. 이외에도 다양한 ICMP 유형을 사용할 수 있다.
    [root@master ~]# firewall-cmd --zone=public --add-icmp-block=echo-request
    success
     
    # 목록을 확인해보면 ICMP가 거부하고 있는 목록을 볼 수 있다.
    [root@master ~]# firewall-cmd --zone=public --list-all
    public (active)
      target: default
      icmp-block-inversion: no
      interfaces: eth0 eth1
      sources:
      services: dhcpv6-client http ssh
      ports:
      protocols:
      masquerade: no
      forward-ports:
      sourceports:
      icmp-blocks: echo-request
      rich rules:
     
    # 클라이언트 node1에서 핑을 확인해보면 금지됐다는 메시지를 볼 수 있다.
    [root@node1 ~]# ping 192.168.80.5
    PING 192.168.80.5 (192.168.80.556(84) bytes of data.
    From 192.168.80.5 icmp_seq=1 Destination Host Prohibited
    From 192.168.80.5 icmp_seq=2 Destination Host Prohibited
     
    # 규칙을 제거할 경우 remove-icmp-block 옵션을 사용한다.
    [root@master ~]# firewall-cmd --remove-icmp-block=echo-request
    success
    cs


    4.6 오프라인 설정과 백업

    Firewalld 데몬이 시작되지 않아도 규칙을 생성할 수 있게 지원하는 명령어가 바로 firewall-offline-cmd다. Firewalld가 활성화되면 이렇게 생성된 규칙들도 모두 추가돼 사용된다. 또한 Iptables 명령어는 firewall-cmd로 생성한 규칙들을 모두 백업하고 복구할 수 있게 지원하고 있는데, 그 방법은 다음과 같다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # firewalld 데몬을 시작하기 이전에 규칙을 생성하는데, INPUT 체인에 80번 포트로 들어오는 새로운 연결을 허용하라는 내용이다.
    [root@master ~]# firewall-offline-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
    success
     
    # 생성된 규칙을 적용하기 위해서 데몬을 시작한다.
    [root@master ~]# systemctl start firewalld
     
    # iptables를 보면 INPUT_direct라는 체인에 http 서비스를 허용하라는 규칙이 추가된 것을 알 수 있다.
    [root@master ~]# iptables -L
    Chain INPUT_direct (1 references)
    target     prot opt source               destination
    ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:http
    ~
     
    # 모든 설정 내용을 저장할 경우 명령어 iptables가 제공하는 저장 명령어를 통해 파일에 저장할 수 있다.
    [root@master ~]# iptables-save > firewall_rules
     
    # 이 파일로부터 설정 내용을 복구할 것을 사용한다.
    [root@master ~]# iptables-restore < firewall_rules Colored by Color Scripter
    cs


    4.7 Firewalld Rich Rule 생성

    Rich Rule은 'rich language'라는 문법을 사용해 다이렉트 인터페이스보다 더 복잡한 규칙을 생성하기 위해 사용되는 Firewalld의 기능이다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    # public 존에 한 IP 주소를 지정하고 이 IP 주소로부터 접속을 허용하는 rich rule을 생성한다. 
    [root@master ~]# firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.168.80.6 accept'
     
    # 한 IP로부터 포트 23/tcp로의 접속을 요청한 경우 거부하라는 규칙이다.
    [root@master ~]# firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.80.6" port port=23 protocol=tcp reject'
     
    # 한 IP로부터 포트 80번으로의 접속 요청을 받은 경우 포트 포워딩을 통해 포트 8080으로 전달하라는 규칙이다.
    [root@master ~]# firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=10.1.1.6 forward-port port=80 protocol=tcp to-port=8080'
     
    # 포트 80번으로 연결 받은 경우 다른 IP 주소를 가진 컴퓨터의 8080 포트로 연결을 전달하라는 규칙이다.
    [root@master ~]# firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" forward-port port=80 protocol=tcp to-port=8080 to-addr=10.1.1.6'
     
    # 네트워크 주소를 지정하고 이 네트워크 주소에서 오는 vnc-server로의 연결을 허용하라는 규칙을 생성한다.
    [root@master ~]# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.80.0/24" service name="vnc-server" accept'
     
    # 현재까지 생성된 rich rule의 목록을 확인하기 위해 사용한다.
    [root@master ~]# firewall-cmd --list-rich-rules
    rule family="ipv4" source address="192.168.80.6" accept
    rule family="ipv4" source address="192.168.80.6" port port="23" protocol="tcp" reject
    rule family="ipv4" source address="10.1.1.6" forward-port port="80" protocol="tcp" to-port="8080"
    rule family="ipv4" forward-port port="80" protocol="tcp" to-port="8080" to-addr="10.1.1.6"
    rule family="ipv4" source address="192.168.80.0/24" service name="vnc-server" accept
     
    # 이러한 규칙들이 어느 Zone에 생성됐는지 확인ㅇ하기 위해 사용 한다.
    [root@master ~]# firewall-cmd --zone=public --list-all
    public (active)
      target: default
      icmp-block-inversion: no
      interfaces: eth0
      sources:
      services: dhcpv6-client http ssh
      ports:
      protocols:
      masquerade: no
      forward-ports:
      sourceports:
      icmp-blocks:
      rich rules:
            rule family="ipv4" source address="192.168.80.6" accept
            rule family="ipv4" source address="192.168.80.6" port port="23" protocol="tcp" reject
            rule family="ipv4" source address="10.1.1.6" forward-port port="80" protocol="tcp" to-port="8080"
            rule family="ipv4" forward-port port="80" protocol="tcp" to-port="8080" to-addr="10.1.1.6"
            rule family="ipv4" source address="192.168.80.0/24" service name="vnc-server" accept
     
    # 생성된 규칙을 삭제하는 경우 remove-rich-rule을 사용한다.
    [root@master ~]# firewall-cmd --remove-rich-rule 'rule family="ipv4" source address="192.168.80.0/24" service name="vnc-server" accept'
    cs


    'Linux > CentOS' 카테고리의 다른 글

    [CentOS 7] Apache 웹 서버 " 2 "  (2) 2017.10.26
    네트워크  (0) 2017.09.12
    [CentOS 7] Apache 웹 서버 " 1 "  (0) 2017.09.11
    [CentOS 7] MariaDB 데이터베이스 서버 " 2 "  (0) 2017.08.19
    [CentOS 7] MariaDB 데이터베이스 서버 " 1 "  (0) 2017.08.11

    댓글

작은거인's Blog / Designed by TISTORY