ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [리눅스/Linux] 방화벽 구성 - iptables
    IT/리눅스 (Linux) 2023. 5. 15. 17:55
    반응형

    용도) 방화벽 구성

    - 방화벽 사용방법에 대해 기술

    OS기준) CentOS

     

     

     

    [설치방법 (yum)]

    - 레드햇 계열) CentOS7 이상인 경우 이후로는 firewalld가 기본 방화벽으로 변경되어 별도 설치요구

    yum install iptables-services -y

     

     

     

    [iptables 설명]

    - 규칙은 위에서부터 순서대로 적용됨

    - 적용된 규칙이 없다면 최종적으로 테이블의 정책에 따라 결정

    - 명령어 입력 시 옵션은 붙여 쓸 수 있으며, 특정 명령어는 따로 써야 함 (ex: iptables -nvL --line-number)

     

    ※ 방화벽 테이블 종류 ※

    INPUT) 외부 → 내부로 들어오는 패킷 처리

    OUTPUT) 내 → 외부로 들어오는 패킷 처리

    FORWARD) 외부 → 호스트 → 외부로 경유하여 넘기는 패킷 처리

    PREROUTING) INPUT 으로 들어오기 전에 IP와 포트를 변경 처리

    POSTROUTING) OUTPUT 으로 나간 후 IP와 포트를 변경 처리

     

    ※ iptables 화면 설명 ※

    [root@linux ~]# iptables -nvL --line-number
    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
    num   pkts bytes target     prot opt in     out     source               destination         
    1     1027  523K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
    2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
    3        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
    4        1    52 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
    5       64  7530 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 
    
    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
    num   pkts bytes target     prot opt in     out     source               destination         
    1        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 
    
    Chain OUTPUT (policy ACCEPT 658 packets, 264K bytes)
    num   pkts bytes target     prot opt in     out     source               destination
    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)

    - Chain INPUT : 테이블명 (INPUT/OUTPUT/FORWARD)

    - policy ACCEPT : 테이블별 설정된 정책 (ACCEPT/DROP). 규칙이 적용된 게 없다면 테이블 정책에 따라 처리됨

    - 0 packets, 0 bytes : 테이블에 사용된 패킷수/패킷크기 통계

     

    ※ 필드설명 ※

    ▷ num : 테이블별 규칙번호

     pkts : 규칙에 대한 패킷수 통계값

     bytes : 규칙에 대한 패킷크기 통계값 (단위 : byte)

    target : 규칙에 대한 처리여부 (ACCEPT/REJECT/DROP/LOG)

     prot : 사용된 프로토콜

     opt

     in/out : 규칙에 대해 설정된 in/out 인터페이스명

     source/destination : 출발지/목적지 주소. 0.0.0.0/0 은 모든 주소를 뜻함

     그 외 설정된 내역 표시

     

     

     

    [명령어 사용방법(iptables)]

    적용된 방화벽 보기

    - iptables -nL

    [root@linux ~]# iptables -nL
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 
    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 
    
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 
    
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination

    ※ L 옵션이 보여주는 것이며, n 옵션을 넣어야 빠르게 출력됨 (IP 주소를 DNS에서 변환하는 과정이 생략됨)

    주의) 붙여서 옵션 주는 순서는 L 뒤에 넣으면 에러가 발생하므로 반드시 L 앞쪽에 넣어줘야 함

    [root@linux ~]# iptables -Ln
    iptables: No chain/target/match by that name.

     

    ※ 옵션 ※

    -t, --table table 테이블명 (생략 가능)
    - 생략시 filter 테이블이 기본
    - 테이블(filter) : INPUT/OUTPUT/FORWARD 정책 표시
    - 테이블(mangle) : INPUT/OUTPUT/FORWARD/PREROUTING/POSTROUTING 정책 표시
    - 테이블(nat) : PREROUTING/POSTROUTING/OUTPUT 정책 표시
    - 테이블(raw) : PREROUTING/OUTPUT 정책 표시 
    -L, --list [chain] 적용 방화벽 리스트 보기
    - chain 은 테이블명이며 생략가능 (INPUT, OUTPUT, FORWARD)

    iptables -nL INPUT
    - INPUT 테이블 규칙만 보기
    -n, --numeric IP주소를 DNS를 통해 변환하지 않음
    -v, --verbose 규칙별 통계값 확인 (패킷량, 패킷수)

    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination         
     1639  561K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0
    --line-number 테이블별 규칙 순서 번호 표시

     

    영구 저장된 상태의 방화벽 보기)

    - 레드햇 계열) /etc/sysconfig/iptables

    [root@linux ~]# cat /etc/sysconfig/iptables
    # Firewall configuration written by system-config-firewall
    # Manual customization of this file is not recommended.
    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    -A INPUT -p icmp -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
    -A INPUT -j REJECT --reject-with icmp-host-prohibited
    -A FORWARD -j REJECT --reject-with icmp-host-prohibited
    COMMIT

     

    정책 추가)

    - -A 또는 -I 를 사용하여 추가

    ▷ 테이블 마지막에 추가 : -A 테이블명

    ▷ 테이블 임의의 라인에 추가 : -I 테이블명 (추가할 라인숫자)

    특정 라인에 추가시 --line-number 옵션을 이용해 조회를 하고 추가

    - 방화벽은 바로 적용되지만, 저장은 되지 않으니 별도 저장 명령을 내려야 함

    - 일부 옵션은 not 논리 연산 가능 (iptables 명령으로 조회시 ! 표시가 있다면 'not' 을 의미)

    예를 들면 아래와 같이 표기됨 (UDP를 제외한 TCP/ICMP 허용)

    [root@linux ~]# iptables -A INPUT ! -p udp -j ACCEPT
    [root@linux ~]# iptables -nL INPUT
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    ACCEPT    !udp  --  0.0.0.0/0            0.0.0.0/0           
    [root@linux ~]# iptables -A INPUT -p tcp -j ACCEPT
    [root@linux ~]# iptables -nL INPUT
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    ACCEPT    !udp  --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           
    [root@linux ~]# iptables -I INPUT 2 -p icmp -j ACCEPT
    [root@linux ~]# iptables -nL INPUT
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    ACCEPT    !udp  --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0

     

    ※ 옵션 ※

    [!] -p, --protocol protocol
    not 선언 가능
    통신 프로토콜 (생략시 all)
    - tcp, udp, udplite, icmp, esp, ah, sctp or all

    예제)
    -p tcp
    ! -p tcp
    [!] -s, --source address[/mask][,...]
    [!] -d, --destination address[/mask][,...]
    not 선언 가능
    출발지/목적지 주소 (생략시 모두로 선언 : 0.0.0.0/0)

    예제)
    -s 1.1.1.1
    ! -s 1.1.1.1
    -s 1.1.1.1 -d 2.2.2.2
    [!] --source-port,--sport port[:port]
    [!] --destination-port,--dport port[:port]
    not 선언 가능
    출발지/목적지 포트 (생략시 모든 포트로 선언 : 1:65535)
    TCP/UDP 등의 포트가 있는 프로토콜에 해당
    m 옵션에서 1개의 규칙에 여러 포트 선언도 가능 (최대 15개)

    예제)
    --sport 10000:10010 --dport 21
    -m multiport --dport 22,80,137:139,443,445
    [!] -i, --in-interface name
    [!] -o, --out-interface name
    인터페이스 선택 (인바운드/아웃바운드. 생략시 모든 인터페이스)

    예제)
    -i eth0
    -m (매치명) 일반적인 방화벽 기능 외에 특정 기능 호출시 사용
    기능이 많아 아는것만 표기해둠
    - comment : 방화벽 주석 달기
    - conntrack : 통신상태 추적
    - multiport : TCP/UDP에서 포트 선언시 다중포트 선언 (최대 15개)
    - state : TCP 통신 상태
    ▷ NEW (신규 패킷), ESTABLISHED (연결된 상태), RELATED (관련된 패킷. FTP), INVALID (올바르지 않은 연결)

    예제)
    -m comment --comment "SSH"
    ▷ 규칙 주석에 SSH 라고 표기
    -m conntrack --state INVALID
    통신 상태가 올바르지 않은 것
    -m multiport --dport 22,80,137:139,443,445
    ▷ 한 규칙에 다중 포트 선언
    -m state --state RELATED,ESTABLISHED
    통신 상태가 연결되었거나 관련된 것들
    -m state --state NEW -m comment --comment "client"
    여러 매치 혼합 (주석설과 신규 패킷)
    -j, --jump target 패킷을 어떻게 처리할지 결정
    - ACCEPT, REJECT, DROP, (chain명)
    - 'chain' 의 경우 규칙 모음 같은건데, 일부 규칙들을 공유하게 한다면 편리하게 사용가능

    예제)
    -j ACCEPT
    규칙 허용
    -j REJECT
     규칙 거부 (상대에게 알림)
    -j DROP
     규칙 차단 (상대에게 알리지 않음)
    -j BLACK_LIST
    BLACK_LIST chain 으로 이동
    -N, --new-chain chain
    -X, --delete-chain [chain]
    chain (규칙모음) 의 생성/삭제

    예제)
    -N BLACK_LIST
    ▷ BLACK_LIST 라는 chain 을 생성
    -X BLACK_LIST
    ▷ BLACK_LIST 라는 chain 을 삭제

    ※ jump 옵션 및 chain 설명 ※

    -j 옵션은 패킷의 처리여부를 결정한다. 이외 다른 chain (일종의 규칙모음) 으로 규칙 처리순서를 바꿀 수도 있다 (아래 예제로 참조)

     

    /etc/sysconfig/iptables

    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    :WHITE_LIST - ACCEPT [0:0]

    -A INPUT -p icmp -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A WHITE_LIST -s 10.0.0.0/24 -j ACCEPT
    -A WHITE_LIST -s 172.30.1.0/24 -j ACCEPT
    -A WHITE_LIST -s 192.168.1.0/24 -j ACCEPT
    -A WHITE_LIST -j DROP
    A INPUT -p tcp --dport 80 -m comment --comment "WEB" -j WHITE_LIST
    A INPUT -p tcp --dport 443 -m comment --comment "WEB" -j WHITE_LIST
    -A INPUT -j DROP
    COMMIT

    ▷ 'INPUT' 으로 80/443 패킷이 들어온다면

    ▷ 80/443 규칙들은 'WHITE_LIST'로 넘어감 (-j WHITE_LIST)

     10.0.0.0/24 172.30.1.0/24 192.168.1.0/24 규칙을 순서대로 확인하고 마지막 규칙 (-A WHITE_LIST -j DROP) 에 따라 DROP 처리

     

     

    정책 삭제)

    - -D 를 사용하여 추가

    ▷ 규칙명을 정확하게 입력  (-D 테이블명 조건)

     규칙 순서 번호를 입력 (-D 테이블명 숫자)

     특정 라인 삭제 시--line-number 옵션을 이용해 조회를 하고 삭제하기를 권장

    - 방화벽은 바로 적용되지만, 저장은 되지 않으니 별도 저장 명령을 내려야 함

    [root@linux ~]# iptables -nL INPUT
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    ACCEPT    !udp  --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           
    [root@linux ~]# iptables -D INPUT 2
    [root@linux ~]# iptables -nL INPUT
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    ACCEPT    !udp  --  0.0.0.0/0            0.0.0.0/0           
    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           
    [root@linux ~]# iptables -D INPUT -p tcp -j ACCEPT
    [root@linux ~]# iptables -nL INPUT
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    ACCEPT    !udp  --  0.0.0.0/0            0.0.0.0/0

     

     

     

    [iptables 운영관리]

    기동 관련

    수행작업 레드햇 계열 (CentOS 6 이하) 레드햇 계열 (CentOS 7 이상)
    기동 service iptables start systemctl start iptables
    정지 service iptables stop systemctl stop iptables
    재시작
    설정 다시 불러오기

    - 현재 방화벽 규칙이 사라지고 다시 읽어오니 작업해둔게 있다면 미리 저장할것
    service iptables restart

    iptables-restore < /etc/sysconfig/iptables
    systemctl restart iptables

    iptables-restore < /etc/sysconfig/iptables
    저장 service iptables save

    또는

    iptables-save > /etc/sysconfig/iptables
    service iptables save

    또는

    iptables-save > /etc/sysconfig/iptables
    부팅시 자동기동 확인 runlevel
    chkconfig --list | grep iptables

    현재 runlevel(부팅방법)에 따른 자동기동 여부 확인
    systemctl is-enabled iptables
    부팅시 자동기동 ON/OFF 켜기) chkconfig iptables --level 2345 on

    끄기) chkconfig iptables --level 2345 off
    systemctl enable iptables
    systemctl disable iptables

     

    주요 파일들

    - 규칙) /etc/sysconfig/iptables

    - 프로그램 설정) /etc/sysconfig/iptables-config

    - 서비스 파일)

    ▷ CentOS 6 이하 : /etc/rc.d/init.d/iptables

    ▷ CentOS 7 이상 : /usr/lib/systemd/system/iptables.service

    -rw-------. 1 root root 470 May 15 15:31 /etc/sysconfig/iptables
    -rw-------. 1 root root 2116 Oct  2  2020 /etc/sysconfig/iptables-config
    -rwxr-xr-x. 1 root root 11123 Jun 20  2018 /etc/rc.d/init.d/iptables
    -rw-r--r--. 1 root root 517 Oct  2  2020 /usr/lib/systemd/system/iptables.service

     

    정책관리

    - 주석관리 철저히 (이 규칙이 어떤 건지 구분하기 위함 또는 관리자가 변경되면 인수인계를 위함)

    -m comment --comment 옵션을 사용

    직접 파일에 주석 넣기 (라인 첫 글자가 # 이 들어가면 주석으로 인식)

    /etc/sysconfig/iptables

    ####################
    # ----- HOST ----- #
    ####################
    -A INPUT -p icmp ! -s 172.30.1.0/24 -j DROP
    
    ####################
    # ----- Port ----- #
    ####################
    -A INPUT -p tcp --dport 80 -m comment --comment "WEB" -j ACCEPT

    - 정책의 추가/삭제처리를 간편하게 하기에는 명령어 보다 vi 등으로 규칙파일을 편집 후 방화벽을 재기동하는 방법을 많이 사용

    - 정책백업 (rsync 등을 이용)

     

    정책순서

    - 정책이 다수 존재한다면 정책의 순서를 고려해야 함

    - 고객사 별로 나누는 것이 아닌 목적별로 나눈다면 정책 순서 관리는 개인이 생각하여 적은 거니 참고할 것

     

    1) 차단

    - 차단할 규칙이 있다면 차단을 먼저 하고 나머지 패킷을 통과시켜야 방화벽 부하 경감 및 규칙이 올바르게 동작

    2) 로컬통신

    3) host 단위

    4) 네트워크 IP 범위 단위

    5) 모든 포트 허용

    6) 해당하는 규칙이 없다면 모든 통신 차단

    - 모든 통신을 차단하는 방법이 2가지가 있는데 전자는 규칙에 선언을 하여 차단하는 것이고, 후자는 테이블 정책을 차단으로 선언

    - 경험상 안정성은 전자, 보안성은 후자 (개인적으로 전자를 더 선호함)

     

    전자를 선호하는 이유는 방화벽이 정책이 순수하게 삭제되었을 때 장애가 발생되지 않기 위함이다

    - 만약 모든 통신 차단을 테이블 정책으로 구성하였다면, 정책만 삭제되는 경우 통신 자체가 되지 않는다 (규칙이 없으니 최종적으로 테이블 정책을 따르니 테이블 정책이 '차단'이라면 아무 작업도 할 수 없다)

     

    - /etc/sysconfig/iptables

    *mangle
    :PREROUTING ACCEPT [0:0]
    :INPUT ACCEPT [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    :POSTROUTING ACCEPT [0:0]
    
    (...정책들...)
    
    -A INPUT -j DROP   <- 모든통신 차단

    위처럼 규칙이 존재하다가 규칙만 삭제되는 경우 기본 정책이 ACCEPT(허용) 이므로 원격 통신이 가능하다. 물론 누구나 들어올 수 있는 상태이므로 바로 조치는 해줘야 한다

     

    만약 후자였다면

    - /etc/sysconfig/iptables

    *mangle
    :PREROUTING DROP [0:0]   <- 모든통신 차단
    :INPUT DROP [0:0]   <- 모든통신 차단
    :FORWARD DROP [0:0]   <- 모든통신 차단
    :OUTPUT DROP [0:0]   <- 모든통신 차단
    :POSTROUTING DROP [0:0]   <- 모든통신 차단
    
    (...정책들...)

    방화벽이 켜진 상태에서 규칙만 삭제된 경우 통신 자체가 불가능해진다

     

    굳이 이런 상황이 발생될 수 있느냐인데, 있다..

     

    경험상으로

    1) 인적 장애

    - 관리자가 잘못하여 규칙만 삭제하여 통신이 불가능해지는 사태 발생

    2) 해킹

    - 리눅스 해킹 중 방화벽 정책을 삭제해 버리는 케이스가 있었음

    3) 방화벽 재기동 영향

    - 방화벽 재기동을 하면 [방화벽 정책 정리] → [방화벽 정지] → [방화벽 기동] → [방화벽 정책 불러오기] 등의 절차를 거치는데 [방화벽 정책 정리] → [방화벽 정지] 과정에서 테이블 정책이 '차단'이라면 통신량이 많은 경우 일부 패킷이 차단될 수 있다 (드물지만 안정성을 생각한다면 고민해봐야 한다)

     

    최종 선택은 운영자 몫이다


    업데이트) 2023.5.15

    홈페이지) https://www.netfilter.org

    라이센스) 무료 (GNU GPLv2)

    첨부파일) iptables 기본 설정 / 서비스 파일

    iptables.service (centos7 서비스 파일)
    0.00MB
    iptables (centos6 서비스 파일)
    0.01MB
    iptables (기본설정 파일)
    0.00MB

    반응형

    'IT > 리눅스 (Linux)' 카테고리의 다른 글

    [리눅스/Linux] 명령어 - awk  (0) 2023.12.20
    [리눅스/Linux] 명령어 - grep  (0) 2023.05.15
    [리눅스/Linux] 패키지 설치 - lrzsz  (0) 2023.05.13
Designed by Tistory.