본문 바로가기
IT Security/LINUX Basic

28. Linux - 리눅스 방화벽3, 방화벽 규칙(rule) 관련 명령어

by Rosmary 2020. 8. 11.
728x90
반응형

 

 

 

 

 

이전 두 개의 포스팅에서, 리눅스의 방화벽의 개요, 구성과 방화벽을 구성하는 요소 중 하나인 정책(Chain)을 다루는 방법에 대해 알아보았다. 이번 포스팅에서는 리눅스 방화벽의 다른 구성 요소인 규칙(rule)을 다루는 방법에 대해 알아보려한다.

 

규칙의 정의는 매우 간단하다. 말 그대로, 리눅스의 내/외부 통신 중 특정 조건을 만족하는 정책에 대해, 이를 허용할 것인지, 거부할 것인지, 버릴 것인지 결정하는 기준이 규칙이다. 일상 생활에서의 예로 들면, "도로교통법"은 방화벽의 chain에 해당하며, "도로교통법" 내의 세부 규정들, 예를 들어 "빨간 불일 때는 진행을 멈춰야 한다" 등은 방화벽의 규칙(rule)에 해당한다. 리눅스 방화벽은 기본 chain인 INPUT, OUTPUT, FORWARD chain 내에 통신에 필요한 규칙을 생성, 변경, 삭제할 수 있으며, 정책과 마찬가지로 iptables 명령어에 옵션을 붙여 사용한다.

 

* 지난 포스팅에 이어 본 포스팅을 보시는 분들은 systemctl 명령어로 firewalld 서비스를 다시 수행하면, 리눅스의 기본 방화벽 정책과 규칙이 다시 적용된다. 물론, firewalld의 설정파일을 기본값으로 고스란히 유지한 상태라면 말이다. 이 포스팅을 참조하시는 분들은 iptables 명령어 실습을 위해 firewalld 서비스를 다시 실행하도록 하자.

 

# systemctl restart firewalld

 

 

 

1. 특정 chain에 규칙 삭제: iptables -D 

 

만약, 필자가 리눅스에서 http 서비스를 구동하고, 외부에서 http 접속이 가능하도록 설정한다고 하자. 그런데 리눅스의 기본 방화벽 정책/규칙에는 http 서비스에 대한 통신을 허용하지 않은 상태이다.

 

외부에서 들어오는 정책 중 dpt(목적지 포트)가 80번인 규칙은 보이지 않는다. 

 

 그렇기 때문에, 필자가 아무리 열심히 윈도우에서 리눅스 서버 IP를 브라우저 주소창에 입력하더라도, "사이트를 찾을 수 없음"이라는 문구만 창에 뜨는 것을 볼 수 있다.

 

 

이 이유는 리눅스로 들어오는 통신을 정의한 chain의 규칙을 보면 알 수 있다.

 

 

들어오는 통신에 대해 정의한 INPUT chain은 http, tcp/80번 조건에 대한 어떠한 규칙도 가지고 있지 않다. 그리고, 규칙과 일치하지 않는 통신 패킷은 무조건 허용이 되어야한다. 하지만, 마지막 줄에 작성된 규칙에 의해 해당 통신 패킷은 DROP 된다. 따라서, http 서비스를 이용하기 위해서, 이 REJECT 규칙을 삭제해 주어야 한다.

 

방화벽의 특정 chain에서 특정 규칙을 삭제하는 방법은 다음과 같다.

 

----------------------------------------------------

iptables -D [Chain_name] [Rule_Line_number]            ; 특정 chain의 특정 행 규칙 삭제

-----------------------------------------------------

 

INPUT chain에서 우리가 지우려는 DROP 규칙은 10번째 줄에 위치해있다. 따라서 iptables -D INPUT 10 명령어를 입력하면, 이 DROP 규칙은 INPUT chain에서 사라지고, http 접속도 가능해진다.

 

 

 

만약, 하나의 chain 안에 셀 수 없을 만큼 많은 규칙이 존재한다면, 우리는 특정 규칙이 몇 번째 줄에 위치하는지 어떻게 알 수 있을까? iptables -L 명령어를 옵션 --line-number 와 함께 입력하면, 각 정책 내의 규칙이 몇 번째 줄에 작성되어 있는지 함께 표시된다. 아래와 같이.

 

iptables 명령어 결과 중, 가장 좌측을 보면, 이때까지 보이지 않았던 줄 번호가 출력되는 것을 확인할 수 있다.

 

 

 

 

2. 특정 chain에 새 규칙 생성: iptables -A 또는 iptables -I

 

이제, 우리는 INPUT 체인에 80번 포트를 목적지로 들어오는 통신에 대한 규칙을 추가해주려 한다. 이를 위해 사용하는 iptables 명령어의 옵션은 A와 I 두가지가 있다. A는 append의 약자로 정책의 가장 마지막에 규칙을 추가하는 옵션이고, I는 Insert(삽입)의 약자로, 정책의 가장 상단 또는 운영자가 정의한 행에 정책을 생성할 때 사용하는 옵션이다. 

 

이 두 옵션을 사용하는 iptables 의 명령어 포맷은 아래와 같다. 포맷이 꽤 길다.

 

---------------------------------------------------------------------------------------------------------------------------------

iptables -A(I) [chain_name] {I 사용 시 규칙을 생성할 행 번호}  {-p [protocol(tcp|udp)]} {-s [출발지 IP]} {-d [목적지 IP]} {--sport [출발지 포트번호]} {--dport [목적지 포트 번호]} {-j [target 종류(ACCEPT | DROP | REJECT)]}

----------------------------------------------------------------------------------------------------------------------------------

* 참고:  대괄호 {}로 표시된 부분은 선택사항이다.

 

직접 실습을 통해 확인해보자. 우선, A 옵션을 사용하여, INPUT chain의 가장 마지막 규칙에 리눅스의 80번 포트를 목적지로 하는 통신을 거부하는 규칙을 만든다고 가정하자. 단, 거부할 출발지 IP는 필자의 윈도우 IP인 172.30.1.54번 하나만이다. 이 규칙을 마지막에 추가하는 iptables 명령어는 아래와 같이 나타낼 수 있다.

 

#  iptables -A INPUT -p tcp -s 172.30.1.54/32 --dport 80 -j REJECT

 

 

명령어 입력 후, 잘 접속되던 http가 다시 접속이 되지 않는 것을 확인할 수 있다.

 

 

이제, 방금 생성한 규칙은 지우고, I 옵션을 사용해 동일한 규칙을 적용해보자. 명령어는 옵션 하나만 변경하면 된다.

 

# iptables -I INPUT -p tcp -s 172.30.1.54 --dport 80 -j REJECT

 

 

마찬가지로, 윈도우(172,30.1.54)에서 http 접속이 불가능함을 확인할 수 있다. 그러나 54번 IP를 제외한 나머지 기기는 리눅스 http로 접속이 가능하다.

 

 

다시 생성한 규칙을 삭제하고, 이번엔 동일한 규칙을 INPUT chain의 3번에 밀어넣어보자. 명령어는 숫자 하나만 중간에 추가해주면 된다.

 

# iptables -I INPUT 3 -p tcp -s 172.30.1.54/32 --dport 80 -j REJECT

 

 

의도한대로, 우리가 생성한 규칙이 INPUT chain의 세 번째에 위치하고 있음을 확인할 수 있다.

 

 

 

 

3. 특정 행의 규칙 내용 변경하기

 

특정 chain 내에 이미 생성된 규칙 내용을 변경하는 것도 가능하다. 이는 R 옵션을 사용하면 되는데, 사용법은 I와 A 옵션에 익숙해졌다면 매우 간단하다.

 

------------------------------------------------------------------------

iptables -R [chain_name] [rule_number] [새 규칙 정의]

------------------------------------------------------------------------

 

필자는 방금 전에 생성한 INPUT chain의 3번 규칙, tcp/80에 대한 규칙의 target을 REJECT에서 ACCEPT로 변경하려고 한다. 사용하는 명령어 및 옵션은 아래와 같다

 

# iptables -R INPUT 3 -p tcp -s 172.30.1.54 --dport 80 -j ACCEPT

 

 

명령어 입력 이후, 3번 규칙의 target이 ACCEPT로 변경된 것을 확인할 수 있다.

 

 

 


 

이번 포스팅에서는 리눅스 방화벽의 chain 내에 정의되는 규칙을 어떻게 생성 / 변경 / 삭제하는지에 대해, 그리고 그 결과가 어떻게 다른지에 대해 알아보았다. 사실 규칙을 다루는 옵션은 많지 않지만, 규칙을 정의할 때 사용하는 옵션이 은근히 많아서 리눅스 방화벽에 익숙하지 않은 초반에는 매우 복잡하게 느껴질 수 있다. 따라서 지난 포스팅과 마찬가지로, 리눅스 방화벽 규칙 정의에 필요한 옵션들 중 주요한 몇 가지를 표로 정리하여 포스팅 마지막 단락에 제공하려 한다.

 

다음 포스팅은 리눅스 방화벽의 마지막 주제다. 지금까지 다루지 않았던 주제들, "INPUT, OUTPUT, FORWARD 외에 존재하는 chain은 무엇인지", 혹은 "ESTABLISHED나 RELATED 등이 의미하는 것이 무엇인지" 등에 대해 작성할 예정이다.

 

.

 

< Appendix >

 

명령어 옵션 포맷 설명
iptables -A iptables -A [chain_name] [규칙 정의] chain의 마지막에 정책 생성
-I iptables -I [chain_name] {행번호} [규칙 정의] chain의 최상단에 정책 생성
또는 특정 행에 정책 생성
-D iptables -D [chain_name] {행번호} chain 내의 특정 행 규칙 삭제
-s -s [출발지 IP 또는 대역대] 규칙 정의 시 출발지 IP
-d -d [목적지 IP 또는 대역대] 규칙 정의 시 목적지 IP
--sport --sport [출발지 포트 번호] 규칙 정의 시 출발지포트
--dport --dport [목적지 포트 번호] 규칙 정의 시 목적지 포트
-j -j [ACCEPT | DROP | REJECT] 규칙의 허용 여부 정의

 

 

 

FIN.

 

 

반응형

댓글