You cannot see this page without javascript.

▒ Doly의 CentOS7 강좌29 12. 네트워크 보안설정 12.1 firewalld (2/2)
 
 
#################################################
    작성자 : 정우영
    작성일 : 2015.04.28
    대상 OS : CentOS7 x86_64
    완성될 서적 : Doly의 센트OS(CentOS)7 구축 관리 실무 (2016년 1월-->수정됨ㅠㅠ)
 
 본 강좌를 기반으로 서적을 집필합니다. 연재강좌가 마무리되고 몇달 후면 서적이 나오겠죠? CentOS7은 서적도 없지만 강좌도 많이 부족하네요. 리눅스 서버를 10년 넘게 구축하고 관리하고 컨설팅하면서 꼭 필요한 부분과 알아야 할 부분들을 꼼꼼히 체크하면서 강좌를 써보려합니다. 강좌중 오탈자가 있거나 설명이 부족하고 잘못된 경우 doly골뱅이superuser.co.kr으로 메일한통 부탁드립니다. 강좌가 수정되면 더 많은 분들께 도움이 될것이라 생각하고 강좌를 기반으로 집필될 서적또한 완성도가 높아지지 않을까 생각합니다.
#################################################
 
12.1. firewalld
CentOS7부터 많은 부분이 통합되고 추상화 되었다. CentOS6까지 방화벽 설정파일을 변경하고 iptables 서비스를 재시작하여 방화벽 규칙을 설정하였다면, CentOS7은 방화벽 규칙을 관리하는 데몬(firewalld)가 작동되고 이 방화벽 데몬이 제공하는 DBUS API를 통해 방화벽을 제어한다. GUI환경에서는 firewall-config를 이용하여 방화벽설정을 할 수 있으며, CUI환경에서는 firewall-cmd를 이용하여 방화벽 설정을 할 수 있다. 방화벽을 제어하려는 별도 어플리케이션을 개발할 때도 filrewalld API를 사용하면 설정파일 변경에 따른 각 방화벽 관리 어플리케이션과의 충돌을 피할 수 있다. 
firewalld에서 사용되는 용어, GUI 프로그램인 firewall-config, CUI 프로그램인 firewall-cmd에 대해 알아보겠다.
 
12.1.3. 방화벽 CUI 설정 (firewall-cmd)
firewalld의 CUI인터페이스인 firewall-cmd에 대해 알아보기 이전에 웹서버를 운영하기 위해 HTTP, HTTPS 포트를 허용하는 방법에 대해 알아보자.
 
터미널 창에서 다음과 같이 입력한다.
 
~]# firewall-cmd --permanent --add-service=http --add-service=https
success
~]# firewall-cmd --reload
success
~]# firewall-cmd --list-all
public (default)
  interfaces:
  sources:
  services: dhcpv6-client http https ssh
  ports: 5900-5910/tcp
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules:
 
firewall-cmd명령을 사용하여 위와 같이 룰을 추가할 수 있다. --permanent 옵션은 영구적인 설정을 의미하며 옵션을 주지 않으면 런타임 환경에서 적용되기 때문에 서버를 리부팅하면 룰이 없어진다. --add-service 옵션을 사용하여 오픈하고자 하는 서비스를 지정한다. 만약 이미 추가된 서비스를 제거하기 위해서는 --remove-service 옵션을 사용한다. 다음으로 --reload 옵션을 사용하여 영구적으로 설정된 룰을 런타임 환경에 적용시킨다. 적용이 완료된 후 --list-all 옵션으로 설정된 룰을 확인한다.
 
방화벽 오픈 여부를 위해 다른 리눅스 컴퓨터에서 다음과 같이 확인해 보자.
 
~]#  nmap 192.168.0.201 -p 443,80,22,25
 
Starting Nmap 5.21 ( http://nmap.org ) at 2015-03-24 19:57 KST
Nmap scan report for 192.168.0.201
Host is up (0.00041s latency).
PORT    STATE    SERVICE
22/tcp  open     ssh
25/tcp  filtered smtp
80/tcp  closed   http
443/tcp closed   https
 
Nmap done: 1 IP address (1 host up) scanned in 0.03 seconds
 
nmap명령어를 방화벽 설정 내역을 확인할 수 있다. 22/tcp(SSH)는 오픈된 것이 확인되고, 25/tcp(SMTP)는 filtered되었다. 웹서비스 포트 80/tcp(HTTP), 443/tcp(HTTPS)는 방화벽에서 차단된 것은 아니지만 닫혀 있다고 나타난다. 
 
[참 고]
firewall-cmd 자동완성 기능
CentOS7의 통합된 명령어들은 자동완성 기능을 제공한다. 자동완성이란 옵션의 몇몇 단어만 입력하고 <TAB>키를 누르게 되면 관련 옵션의 단어가 자동완성된다. 또 여러개의 가능한 옵션이 있을때는 <TAB>키를 여러번 누르면 옵션 리스트가 나타난다. 아래와 같이 옵션을 모를 때는 <TAB>키를 여러번 누르면 사용할 수 있는 옵션 리스트가 나타난다.
 
~]#  firewall-cmd --permanent --
--add-forward-port=                   --list-rich-rules
--add-icmp-block=                     --list-services
--add-interface=                      --list-sources
--add-lockdown-whitelist-command=     --query-forward-port=
... 
 
 
12.1.3.1. 영역(zone) 변경
앞에서 설명한 영역(zone)은 다음과 같은 방법으로 변경할 수 있다.
 
~]#  firewall-cmd --set-default-zone=block
success
 
기본 영역을 block으로 변경하였다. 설정 가능한 영역은 영역값을 입력하지 않고 <TAB>키를 여러번 누르면 다음과 같이 확인할 수 있다.
 
~]#  firewall-cmd --set-default-zone=<TAB><TAB>
block     dmz       drop      external  home      internal  public    trusted   work
 
설정된 내역은 다음과 같이 확인할 수 있다.
 
~]#  firewall-cmd --list-all
block (default, active)
  interfaces: eth0
  sources:
  services:
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
 
위 결과를 보면 기본영역이 block으로 변경된 것을 확인할 수 있다. 물론 --get-default-zone 옵션으로 기본영역을 확인할 수 있다.
 
12.1.3.2. 서비스(service) 수정
GUI와 다르게 firewall-cmd는 서비스 추가/수정 방법을 제공하지 않는다. 다음과 같은 방법으로 미리 정의된 서비스를 편집하여 사용할 수 있다. 리눅스 서버 접속을 위해 SSH를 가장 많이 사용한다. 많이 사용되는 만큼 인터넷에 공개된 서버의 경우 사전(dictionary) 공격을 통해 접속정보를 획득하려는 시도가 많이 일어난다. 이러한 접근 시도를 회피하기 위해 SSH 기본포트(tcp/22)를 1024이후 잘 알려지지 않은 포트로 변경한다. 이러한 경우 SSH 서비스에 대한 서비스 포트 또한 변경이 되어야 하기에 다음과 같이 방화벽 설정을 변경해 보도록 하자.
 
~]#  cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/
 
서비스가 정의된 파일(ssh.xml)을 /usr/lib/firewalld/services 디렉토리에서 /etc/firewalld/services 디렉토리로 복사한다.
/etc/firewalld/services/ssh.xml 파일을 열어 다음과 같이 수정한다.
 
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>SSH</short>
  <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
  <port protocol="tcp" port="15322"/>
</service>
 
필자는 SSH포트로 15322를 입력하였다.
 
~]#  firewall-cmd --reload
success
--reload옵션으로 변경내역을 반영한다. 
 
~]#  iptables -nL |grep 15322
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0      tcp dpt:15322 ctstate NEW
 
firewall-cmd으로는 서비스의 변경내역을 확인할 수 없었다. iptables명령을 사용하여 변경된 서비스 포트를 확인하였다.
 
 
12.1.3.3. 포트 및 프로토콜 직접 추가
앞에서 다뤘던 서비스를 이용하여 방화벽을 관리하기도 하지만, 앞 예와 같이 미리 정의된 서비스의 포트를 변경하는 경우는 포트 및 프로토콜을 직접 추가하는 것이 방화벽 관리에 더 효율적이다. SSH 포트를 변경한 경우 서비스 리스트에서는 바로 확인하기 어렵기 때문에 서버를 이전하는 경우 실수할 수 있다. 
 VNC접속을 위해 포트 및 프로토콜을 직접 추가해 보도록 하자.
 
~]# firewall-cmd --permanent --add-port=5900-5910/tcp
success
~]# firewall-cmd --reload
success
~]# firewall-cmd --list-all
public (default, active)
  interfaces: eth0
  sources: 
  services: dhcpv6-client http https ssh
  ports: 5900-5910/tcp
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules: 
 
firewall-cmd명령을 사용하여 위와 같이 룰을 추가할 수 있다. --permanent 옵션은 영구적인 설정을 의미하며 옵션을 주지 않으면 런타임 환경에서 적용되기 때문에 서버를 리부팅하면 룰이 없어진다. --add-port 옵션을 사용하여 오픈하고자 하는 포트 및 포트범위/프로토콜을 지정한다. 만약 추가된 포트를 제거하기 위해서는 --remove-port 옵션을 사용한다. 다음으로 --reload 옵션을 사용하여 영구적으로 설정된 룰을 런타임 환경에 적용시킨다. 적용이 완료된 후 --list-all 옵션으로 설정된 룰을 확인한다. 물론 추가된 포트는 --list-ports 옵션으로 확인 가능하다.
 
12.1.3.4. 마스커레이딩(Masquerading)
리눅스 시스템을 인터넷 공유 목적의 라우터 기능을 사용하기 위해 마스커레이딩 기능을 활성화 시킨다. 
마스커레이딩을 사용하기 위해 공인망, 사설망 네트워크 구성을 미리 해 두어야 한다.
 
~]# firewall-cmd --permanent --add-masquerade
success
~]# firewall-cmd --reload
success
~]# firewall-cmd --list-all
public (default, active)
  interfaces: eth0
  sources:
  services: dhcpv6-client http https ssh
  ports: 5900-5910/tcp
  masquerade: yes
  forward-ports: 
  icmp-blocks: 
  rich rules:
 
firewall-cmd명령을 사용하여 위와 같이 마스커레이딩을 활성화 시킬 수 있다. --permanent 옵션은 영구적인 설정을 의미하며 옵션을 주지 않으면 런타임 환경에서 적용되기 때문에 서버를 리부팅하면 룰이 없어진다. --add-masquerade 옵션을 사용 마스커레이딩을 활성화시킨다. 만약 마스커레이딩을 비활성화시고 싶다면 --remove-masquerade 옵션을 사용한다. 다음으로 --reload 옵션을 사용하여 영구적으로 설정된 룰을 런타임 환경에 적용시킨다. 적용이 완료된 후 --list-all 옵션으로 masquerade 활성화 유부를 확인한다. 
 
12.1.3.5. 포트 포워딩(port forwarding)
앞에서 마스커레이딩 설정으로 인터넷 공유 라우터를 설정한 경우 외부에서 공인IP로 접속되는 연결에 대해서 포트에 따라 내부 서버로 연결시킬 수 있는 포트 포워딩 기능을 사용할 수 있다. 
또, 시스템으로 들어오는 포트를 포워딩하여 로컬의 다른 포트로 포워딩할 수 있다. 시스템의 각 서비스들은 보안을 위해 일반 사용자 권한으로 서비스를 실행하기를 권장한다. 예를 들어 Tomcat은 JSP 컨테이너이면서 웹서버 기능을 가지고 있다. Tomcat은 일반 사용자 계정으로 실행할 것을 권장한다. 하지만, HTTP기본포트 80을 사용할 경우 root권한이 아니면 80포트를 Bind할 수 없다. 이러한 경우 포트포워딩을 사용하여 80포트로 접속되는 패킷을 로컬의 8080(Tomcat의 기본 HTTP 포트)포트로 포워딩 시킴으로 root권한 없이 80포트를 사용하여 웹서비스를 할 수 있다.
80포트로 접속되는 패킷을 8080포트로 포워딩 설정해 보자.
 
~]# firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080
success
~]# firewall-cmd --reload
success
~]# firewall-cmd --list-all
public (default, active)
  interfaces: eth0
  sources:
  services: dhcpv6-client http https ssh
  ports: 5900-5910/tcp
  masquerade: yes
  forward-ports: port=80:proto=tcp:toport=8080:toaddr=
  icmp-blocks: 
  rich rules:
 
firewall-cmd명령을 사용하여 위와 같이 포트 포워딩 하였다. --permanent 옵션은 영구적인 설정을 의미하며 옵션을 주지 않으면 런타임 환경에서 적용되기 때문에 서버를 리부팅하면 룰이 없어진다. --add-forward-port 옵션을 사용 포트 포워딩 규칙을 추가하였다. 다음과 같은 방법으로 입력된다.
--add-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]]
만약 포트포워딩을 제거하기 위해서는 --remove-forward-port 옵션을 사용한다.다음과 같은 방법으로 입력된다.
--remove-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]]
 다음으로 --reload 옵션을 사용하여 영구적으로 설정된 룰을 런타임 환경에 적용시킨다. 적용이 완료된 후 --list-all 옵션으로 포트포워딩 설정내역을 확인할 수 있다. 물론 --list-forward-ports 옵션으로 확인할 수 있다.
 
 
12.1.3.6. ping 응답 하지 않기
시스템의 네트워크 상태를 확인하기 위해 ping명령어를 이용하여 응답 테스트를 한다. ping은 네트워크 확인을 위해 유용하게 사용되지만, 악의적으로 패킷크기를조절하여 네트워크의 과다한 트래픽을 유발하기도 한다. 이러한 공격을 차단하기 위해 ping에 대해 응답하지 않도록 설정하는 경우가 있다. 
다음은 ICMP 프로토콜 중 ping에 대해 응답하지 않게 설정하고 있다.
 
~]# firewall-cmd --permanent --add-icmp-block=echo-request
success
~]# firewall-cmd --reload
success
~]# firewall-cmd --list-all
public (default, active)
  interfaces: eth0
  sources:
  services: dhcpv6-client http https ssh
  ports: 5900-5910/tcp
  masquerade: yes
  forward-ports: port=80:proto=tcp:toport=8080:toaddr=
  icmp-blocks: echo-request
  rich rules:
 
firewall-cmd명령을 사용하여 위와 같이 ping을 차단할 수 있다. --permanent 옵션은 영구적인 설정을 의미하며 옵션을 주지 않으면 런타임 환경에서 적용되기 때문에 서버를 리부팅하면 룰이 없어진다. --add-icmp-block 옵션을 사용 ICMP 차단할 유형을 추가하였다. 만약 차단할 유형을 제거하기 위해서는 --remove-icmp-block옵션을 사용한다. 다음으로 --reload 옵션을 사용하여 영구적으로 설정된 룰을 런타임 환경에 적용시킨다. 적용이 완료된 후 --list-all 옵션으로 차단된 ICMP 유형을 확인할 수 있다. 물론 --list-icmp-blocks 옵션으로도 확인할 수 있다.
 
 
12.1.3.7. 직접 방화벽 규칙 넣기
리눅스 방화벽 iptables는 막강한 확장기능을 제공한다. firewalld에서 제공되는 기능은 확장 기능 중 일부만 사용할 수 있으며, 원하는 확장 기능 사용을 위해 다음과 같은 방법으로 직접 입력하여 사용할 수 있는 인터페이스가 제공된다.
웹서버를 대상으로 DOS공격이 많이 발생된다. 특정 클라이언트 IP에서 접속이 많이 발생된다면 특정 클라이언트 IP 차단을 위해 사용하는 모듈이 connlimit이다. 
다음은 connlimit를 사용하여 DOS공격을 막도록 설정해 보겠다.
 
~]# firewall-cmd --permanent --direct --add-passthrough ipv4 -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 -j REJECT
success
~]# firewall-cmd --reload
success
 
firewall-cmd명령을 사용하여 DOS공격을 막을 수 있다. --permanent 옵션은 영구적인 설정을 의미하며 옵션을 주지 않으면 런타임 환경에서 적용되기 때문에 서버를 리부팅하면 룰이 없어진다. --direct 옵션은 직접 입력한다는 설정이다. --add-passthrough는 통과 규칙을 직접 입력하는 옵션이다. 만약 통과 규칙을 제거하기 위해서는 --remove-passthrough을 사용한다. 다음으로 --reload 옵션을 사용하여 영구적으로 설정된 룰을 런타임 환경에 적용시킨다. 
 
~]# iptables -nL |grep conn
REJECT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 flags:0x17/0x02 #conn src/32 > 16 reject-with icmp-port-unreachable
 
firewall-cmd으로는 직접 설정한 규칙 확인이 어려워 iptables명령을 사용하여 직접 추가한 규칙을 확인하였다.
 
 이상으로 29번째 강좌를 마무리 합니다. CentOS7의 새로운 기능중에 하나가 firewalld이다. firewalld의 CUI 인터페이스에 대해 알아보았습니다.  시작을 했으면 끝을 봐야 합니다. 그렇지 않으면 그건 남아있지 않는 것이죠.  CentOS 7의 다양한 기능에 대해서 중점적으로 다루겠습니다. 2015년 4월 28일(화) 열심히 뛰는 도리(Doly)였습니다.^^ 
 
#################################################
* 본 강좌는 언제든 갱신될 수 있으며, 원글은 www.linux.co.kr 강좌>리눅스>Doly의 연재강좌 에서 수정됩니다. 
* 본 강좌의 일부 또는 전체를 인용하실 경우, 반드시 출처를 밝혀 주시기 바랍니다.
 
* 수정이력 :
 2015.4.28(화): 최초작성
List of Articles
번호 제목 글쓴이 날짜 조회 수
369 APM mariadb download origin address LynX 2019-06-19 1991
368 APM What one can and should optimize LynX 2019-06-03 1418
367 CentOS mariadb install LynX 2019-05-31 1182
366 CentOS init mode change LynX 2019-05-30 1290
365 APM ext zip install LynX 2019-02-19 1614
364 APM ext ImageMagick install LynX 2019-02-19 513
363 3D Printer Pronterface(PrintRun) install file LynX 2018-09-13 753
362 CentOS Grub UUID change LynX 2018-08-08 869
361 Linux letsencrypt wildcard LynX 2018-07-26 798
360 Printer cura usb connection LynX 2018-07-06 666
359 CentOS cli 무선랜 LynX 2018-06-07 448
358 APM 윈도우에 APM 페키지 설치 file LynX 2018-05-04 590
357 APM MySQLTuner 설치 LynX 2018-04-27 545
356 CentOS CentOS7 커널 업데이트 LynX 2018-04-23 702
355 HTML Tag CSS 여러가지 모양 만들기 LynX 2018-02-08 772
354 Linux wkhtmltopdf wkhtmltoimage install LynX 2018-01-31 602
353 APM LZ4_LIBS Not Found (CentOS7, MariaDB 10.1.29) LynX 2018-01-03 485
352 APM mysql ./configure LynX 2017-12-15 805
351 APM PHP-7.2.0 LynX 2017-12-12 3157
350 Linux libiconv LynX 2017-12-08 558

XE Login