지난 포스팅에서는 컴퓨터의 방화벽이 무엇인지, 그리고 리눅스에서 방화벽 정책과 규칙이 어떤 형태로 작성되어 있는지 확인해보았다. 지난 포스팅의 내용에 이어, 이번 포스팅부터 리눅스 방화벽의 정책 및 규칙을 어떻게 생성 / 변경 / 삭제하는지 살펴보려 한다.
리눅스의 방화벽은 큰 그림으로 보면 윈도우와 마찬가지로 크게 두 부류로 나눌 수 있다. 통신의 방향을 결정하는 Chain 과, 각 Chain 내에 정의되는 규칙으로 말이다. 이 chain과 규칙의 생성 / 변경 / 삭제 등의 작업은 모두 iptables 명령어에 옵션을 달리 주면서 진행할 수 있다. 이번 포스팅에서는 Chain에 대한 iptables 명령어를 사용하는 방법에 대해 알아보려한다.
1. Chain에 대한 작업
Chain은 서두에서도 언급했듯이, 통신의 방향을 정의한다고 생각하면 된다. 리눅스에서 통신의 방향은 크게 세 가지로 구분된다. 외부에서 리눅스로 들어오는 INPUT, 리눅스에서 외부로 나가는 OUTPUT, 그리고 외부에서 리눅스를 '경유'하여 지나가는 통신에 대한 Chain인 Forward로 구분할 수 있다. CentOS 7 에서는 기본 Chain이 INPUT, OUTPUT, Forward 외에도 기타 잡다한 Chain이 추가로 포함되어 있는데, 서버로 리눅스를 사용하는 경우에는 INPUT과 OUTPUT Chain 만으로도 충분히 방화벽 구성이 가능하다.
* 단, 특정 통신 패킷이 서버를 경유하여 지나가도록 라우팅 설정을 하였다면, Forward Chain도 추가를 해야 한다. 네트워크 장비에 대해 다루지 않기 때문에 Forward에 대한 내용은 생략한다.
각 Chain은 리눅스 관리자가 지정한 정책이 들어가게 된다. 그리고 각 Chain은 규칙과 일치하지 않는 패킷을 모두 버릴지, 허용할 지에 대해 미리 정의가 되어 있어야 한다. 방화벽 정책을 구성하는 방법은 크게 두 가지가 있다.
- 모든 통신을 허용하되, 일부 규칙과 일치하는 통신은 거부한다 (blacklist 방식)
- 모든 통신을 불허하되, 일부 규칙과 일치하는 통신만 허용한다 (whitelist 방식)
자신의 성향에 따라, Chain의 정책 구성을 선택하여 사용하면 된다. 본 포스팅에서는 연습을 위해 "모든 통신을 허용하되, 일부 규칙과 일치하는 통신을 거부"하는 blacklist 방식으로 진행할 예정이다.
(1) Chain 의 생성: iptables -N
새 chain, 그러니까 통신의 방향을 정의할 '정책서'를 새로 생성하는 옵션은 -N이다. -N 옵션 뒤에 새로 생성할 chain의 이름을 넣어주면, 해당 chain이 iptables -nL 명령어의 결과 중 가장 아래에 출력되는 것을 확인할 수 있다.
--------------------------------------
# iptables -N [Chain_name] ; 새 Chain을 [Chain_name] 이름으로 생성
--------------------------------------
필자는 'ABCDEFG'라는 특이한 이름으로 Chain을 만들어보려 한다.
iptables -N 명령어로 ABCDEFG라는 이름의 chain을 만들기 전에는 리스트에 나타나지 않던 ABCDEFG라는 chain이 chain 형성 후 출력되는 것을 확인할 수 있다(물론 아직 ABCDEFG는 규칙이 따로 작성되지 않았다).
(2) 생성된 chain의 삭제: iptables -X [chain_name]
iptables -nL 로 나타나는 체인 중, 삭제를 원하는 체인이 있다면, iptables -X 명령어를 사용하면 된다. -N과 마찬가지로, 옵션 뒤에 삭제할 chain 이름을 지정해주면 된다.
--------------------------------------
# iptables -X [Chain_name] ; 기존의 [Chain_name] chain을 삭제
--------------------------------------
방금 생성했던 ABCDEFG를 삭제해보자.
처음에 ABCDEFG chain을 생성하기 전처럼, NO chain match라는 문구가 출력되는 것을 볼 수 있다.
(3) Chain 이름 변경: iptables -E [old_chain_name] [new_chain_name]
다시 ABCDEFG chain을 생성하고, 이번엔 이 chain의 이름을 변경해보자. chain의 이름 변경은 iptables -E 명령어로 진행하면 된다.
---------------------------------------------------------
# iptables -E [old_chain_name] [new_chain_name] ; 기존 chain의 이름 수정
---------------------------------------------------------
필자는 생성한 ABCDEFG chain을 XYZ 로 이름을 변경해보려한다.
(4) 특정 chain의 모든 규칙 삭제: iptables -F [chain_name]
chain 내의 규칙을 지우는 명령어가 존재하긴 하지만, chain 내에 규칙이 일일이 삭제하기에 너무 많고, 한번에 지워야되는 상황이라면, 옵션 -F를 이용하여 특정 chain에 존재하는 규칙을 모두 삭제하는 것도 가능하다. 아직 규칙 생성과 삭제에 대해서는 설명하지 않았기 때문에, 기본 iptables 리스트에서 영향도가 가장 없는 chain 하나를 선정하여 이 명령어를 수행해보려 한다.
CentOS 7 의 경우, chain 이름 중에 FWDO_public 이라는 이름을 가진 chain이 존재한다.
이 chain은 3개의 정책을 가지고 있는데, 이 정책이 사라지더라도 기본적인 동작 자체에는 영향이 없기 때문에 -F 옵션으로 chain 내의 모든 규칙을 지워보려 한다.
-F 옵션은, Chain 내에 모든 규칙을 한 번에 삭제하기 위한 명령어로 기억하면 된다.
(5) 각 chain의 정책 구성 설정: iptables -P
iptables -nL로 기본 chain인 INPUT, OUTPUT, FORWARD의 내용을 보면, 다음과 같이 괄호 안에 (Policy Accept)로 기록된 부분을 볼 수 있다.
이것이 의미하는 것은, 현재 이들 chain의 정책 구성이, "chain 내에 일치하는 규칙이 없다면 모두 허용(ACCEPT)하라는 의미다. 통신 패킷이 방화벽과 맞닥들이면, 방화벽은 가장 상단의 규칙부터 통신 패킷과 일치하는 정책이 있는지 확인하고, 일치하는 규칙이 존재하면 해당 패킷을 target 값에 따라(ACCEPT/DROP/REJECT) 처리한다. 만약, chain 내에 일치하는 규칙이 없다면, 해당 패킷은 chain의 정책 구성, 즉 (policy ) 내의 내용에 따라 처리되게 된다.
이 정책 구성을 설정하는 옵션이 바로 -P다. -P 옵션으로 iptables를 사용하는 방법은 다음과 같다.
----------------------------------------------------------
iptables -P [chain_name] [ACCEPT | DROP | REJECT] ; 해당 chain의 규칙과 일치하지 않는 패킷의 처리 방법 설정
----------------------------------------------------------
이 정책 구성 명령어는 INPUT, OUTPUT, FORWARD 기본 3가지 chain에서만 동작한다. 따라서, 가장 영향도가 적은 FORWARD chain 에 대해 이 명령어를 수행해보자. 현재 FORWARD chain은 정책 구성이 ACCEPT로 설정된 상태다.
iptables -P 명령어로 인해, FORWARD chain은 기존의 정책 구성과 달리 규칙과 일치하지 않는 통신 패킷을 모두 DROP 시키게 된다.
이번 포스팅에서는 방화벽의 통신 방향에 대한 정책을 정의하는 chain에 대한 iptables 명령어 옵션을 살펴보았다. 사실 리눅스의 iptables 명령어는 매우 많은 옵션이 존재하여 숙달하기까지 시간이 오래 걸리는 기술이다. 위의 글을 읽으면서 이 많은 옵션을 기억하기란 매우 어려운 일이라, 필자가 포스팅 마지막에 chain 과 관련된 iptables 옵션을 조금 정리했다. 참고하기 바란다.
다음 포스팅에서는 각 chain에 들어갈 규칙을 생성하고, 삭제하고, 변경하는 작업에 대해 알아보려 한다.
< Appendix>
명령어 | 옵션 | 사용법 | 설명 | |||||||||||
iptables | -(n)L | iptables -(n)L | 방화벽 chain/규칙 목록 출력 | |||||||||||
-N | iptables -N [Chain_name] | 새 chain 생성 | ||||||||||||
-X | iptables -X [Chain_name] | 기존 chain 삭제 | ||||||||||||
-E | iptables -E [old_Chain_name] [new_Chain_name] | 기존 chain 이름 변경 | ||||||||||||
-F | iptables -F [chain_name] | 기존 chain의 규칙 모두 삭제 | ||||||||||||
-P | iptables -P [Chain_name] [ACCEPT | DROP | REJECT] | INPUT, OUTPUT, FORWARD chain의 정책 구성 설정 |
FIN.
'IT Security > LINUX Basic' 카테고리의 다른 글
29. Linux - 리눅스 방화벽 4, 기타 방화벽 설정 (0) | 2020.08.16 |
---|---|
28. Linux - 리눅스 방화벽3, 방화벽 규칙(rule) 관련 명령어 (0) | 2020.08.11 |
26. Linux - 리눅스 방화벽1, 방화벽 서비스 및 정책 확인 (0) | 2020.08.09 |
25. Linux - DNS 서버 구축 3, Zone 파일 생성 및 구축 결과 확인 (0) | 2020.08.02 |
24. Linux - DNS 서버 구축 2, 패키지 및 DNS 설정 파일 (0) | 2020.07.27 |
댓글