강좌
클라우드/리눅스에 관한 강좌입니다.
리눅스 분류

▒ SU의 CentOS7 강좌32 12. 네트워크 보안설정 12.2 iptables 서비스 (3/3)

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

▒ SU의 CentOS7 강좌32 12. 네트워크 보안설정 12.2 iptables 서비스 (3/3)





12.2. iptables 서비스

12.2.4. iptables 고급 설정
리눅스 커널 2.4부터 Netfilter라는 패킷 처리 엔진이 포함되어 있다. 이 엔진을 제어하기 위해 사용하는 툴이 iptables이다. 앞에서 살펴본 firewalld, iptables 서비스 모두 iptables를 이용하는 것이다. iptables를 이용한 방화벽 규칙 설정 법에 대해 알아보도록 하자. 이 책에서 다루지 않는 iptables의 많은 기능은 “리눅스 서버 보안관리 실무”서적을 참조하길 바란다.

12.2.4.1. iptables 규칙 확인(-nL)
이미 설정된 iptables의 규칙을 확인할 경우 다음과 같이 입력한다. 아주 빈번하게 사용되는 옵션이니 꼭 기억해 두자.

~]# 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
REJECT     icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 8 reject-with icmp-host-prohibited
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
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:443
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpts:5900:5910
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
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
REJECT     icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 8 reject-with icmp-host-prohibited
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     all  --  0.0.0.0/0            0.0.0.0/0
ACCEPT     tcp  --  0.0.0.0/0            127.0.0.1            state NEW tcp dpt:8080
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


위 내용은 iptables 명령의 -L 옵션을 사용하여 설정된 규칙을 확인하고 있다. -n옵션은 포트번호, IP 주소 등을 숫자로 보여주기 위해 사용하였다. -v를 함께 사용하면 더 상세한 내용과 규칙을 통화한 패킷, 트래픽을 확인할 수 있다. -t 옵션을 따로 주지 않았기 때문에 기본 테이블인 filter 테이블에 대해서만 보여준다.



12.2.4.2. 규칙 초기화(-F)
설정된 모든 규칙을 초기화 하고자 한다면 다음과 같이 입력해 보자.

~]# iptables -F

iptables 명령의 -F옵션을 사용하여 모든 규칙을 초기화(Flush)하였다. 여기서도 -t 옵션을 주지 않았기 때문에 기본 테이블인 filter 테이블에 대해서만 초기화 된다. 초기화 후 규칙을 확인해 보자.

~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination


filter 테이블의 기본체인인 INPUT, FORWARD, OUTPUT만 존재하는 것을 확인할 수 있다.

12.2.4.3. 특정 IP에 대한 접근 제어(-s)
iptables를 이용하여 특정 IP에 대해 접근을 허용하거나, 차단할 수 있다. 리눅스 서버에 내가 사용하는 IP에 대해서는 모든 접근을 허용하고자 한다면 다음과 같이 입력하자.


~]# iptables -A INPUT -s 192.168.0.200 -j ACCEPT


위 내용은 -A옵션을 사용하여 INPUT 체인에 규칙을 추가(append, 체인의 마지막에 규칙 추가)한다. -s를 사용하여 출발지(source)가 192.168.0.200인 모든 패킷은 -j옵션을 사용하여 ACCEPT(허용) 한다는 것이다. 여기서 -j는 타겟을 설정하는 옵션이다. 
악의 적인 사용자 IP를 차단하고자 한다면 다음과 같은 룰을 입력할 수 있다.


~]# iptables -A INPUT -s 192.168.0.100 -j DROP


위와 같이 입력하면, 192.168.0.10에서 접근하는 모든 패킷을 DROP(폐기) 하여 접속하지 못하게 한다. 타겟을 REJECT(거부)로 설정하여 거부할 수도 있다.

12.2.4.4. 특정 포트 및 프로토콜 접근 제어
웹서비스 접속을 허용해 보자. 웹서비스는 HTTP(tcp/80), HTTPS(tcp/443)를 사용한다. 다음과 같이 웹서비스에 대해 허용해 보자.


~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
~]# iptables -I INPUT -p tcp --dport 443 -j ACCEPT


위 내용은 -I옵션을 사용하여 INPUT 체인에 규칙을 삽입(insert, 체인의 앞쪽에 규칙을 삽입)한다. -p를 사용하여 프로토콜을 tcp로 설정, --dport를 사용하여 목적지 포트가 80번, 443번으로 지정한다. -j옵션을 사용하여 ACCEPT(허용) 한다는 것이다. 여기서 -j는 타겟을 설정하는 옵션이다.

~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination


앞에서 입력한 규칙이 INPUT 체인에 추가된 것을 확인할 수 있다. -I 옵션을 사용하였기 때문에 나중에 삽입한 규칙이 위쪽에 놓인 것을 확인할 수 있다. iptables는 위에서부터 아래로 규칙이 적용되기 때문에 위쪽에 규칙이 우선 적용된다.

12.2.4.5. iptables 주요 옵션
앞에서 간단하게 iptables 설정 법에 대해 알아보았다. iptables 명령어를 직접 사용하는 경우 자주 사용되는 옵션에 대해 알아보도록 하겠다.


12.2.4.6. iptables 주요 테이블 및 체인
iptables는 5개의 테이블(filter, nat, mangle, raw, security)이 있다. 여기서 주로 사용되는 테이블은 filter, nat, mangle이다. 각 테이블에는 기본 체인이 있다.

각 테이블과 기본체인과의 관계는 다음 그림을 살펴보자.

[그림]  출처 http://linux-ip.net/nf/nfk-traversal.png


위 그림을 보면 패킷의 흐름을 알 수 있을 것이다. iptables의 기본 테이블인 filter테이블을 기준으로 보자. filter테이블에는 3개의 기본 체인이 있다. 패킷이 서버로 들어올 때 INPUT, 패킷이 서버에서 나갈 때 OUTPUT, 패킷이 서버를 통과할 때 FORWARD 체인이 사용된다. 위 그림과 같이 FORWARD 체인은 서버를 통과하기 때문에 INPUT과 OUTPUT룰에 영향을 받지 않는다. 
MASQUERADING설정은 내부적으로 다음 룰이 적용된다.

~]# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

-t 옵션으로 nat 테이블을 지정하고, -A 옵션으로 POSTROUTING 체인에 -o 옵션으로 eth0 디바이스를 통해 나가는 패킷에 대해서 -j 옵션으로 MASQUERADE 타겟을 정의한다. 위 그림을 보면 nat테이블의 POSTROUTING 체인은 가장 마지막에 적용되는 체인이다.
포트포워딩 설정은 내부적으로 다음 룰이 적용된다.

~]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:8080

-t 옵션으로 nat 테이블을 지정하고, -A 옵션으로 POSTROUTING 체인에 -i 옵션으로 eth0 디바이스를 통해 들어오는 패킷 중 -p 옵션으로 tcp 프로토콜, --dport 옵션으로 80포트에 대해서 -j 옵션으로 DNAT 타겟을 정의하고 --to-destination 옵션으로 127.0.0.1의 8080포트로 포워딩한다. 위 그림을 보면 nat테이블의 PREROUTING 체인은 filter테이블의 체인들 보다 먼저 적용되는 체인이다.



12.2.4.7. filter 테이블의 주요 타겟
리눅스를 이용하여 서버구축 시 가장 많이 사용하는 테이블이 filter이다. 이 filter 테이블의 주요 타겟에 대해 알아보도록 하자.



12.2.4.8. iptables 서비스 규칙 수정
system-config-firewall(또는 system-config-firewall-tui)을 사용하여 설정한 파일을 직접 수정하여 원하는 규칙을 적용시켜 보도록 하자. 앞에서 여러 설정을 하였다면 다음내용과 비슷한 설정파일(/etc/sysconfig/iptables)을 확인할 수 있을 것이다.

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*nat
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o eth+ -j MASQUERADE
-A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:8080
COMMIT
*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 -m icmp --icmp-type echo-request -j REJECT --reject-with icmp-host-prohibited
-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 -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 5900:5910 -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -p icmp -m icmp --icmp-type echo-request -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -p icmp -j ACCEPT
-A FORWARD -i lo -j ACCEPT
-A FORWARD -o eth+ -j ACCEPT
-A FORWARD -i eth0 -m state --state NEW -m tcp -p tcp -d 127.0.0.1 --dport 8080 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT


처음 보면 복잡해 보일 것이다. 여기서 MASQUERADING 설정은 제거하고, FORWARD룰 까지 제거 하고나면 다음과 같이 깔끔해 진다. 그리고 몇 몇 규칙에 #으로 시작하는 주석을 달아 보았다.


# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*nat
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
## 포트 포워딩 80 -> 8080
-A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:8080
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
## Ping 막기
-A INPUT -p icmp -m icmp --icmp-type echo-request -j REJECT --reject-with icmp-host-prohibited
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
## SSH
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
## WEB
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
## VNC
-A INPUT -m state --state NEW -m tcp -p tcp --dport 5900:5910 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT

각 설정 내용에 주석을 달아 좀 더 보기 편하게 수정하였다. 
SSH의 경우 범용적으로 사용되기 보다는 특정 IP에서만 접속되도록 제한하는 경우가 대부분이다. 물론 고정IP가 할당된 경우이다. 다음과 같이 룰을 수정해 보자.

...
## SSH
-A INPUT -s 192.168.0.200 -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -s 192.168.0.205 -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
...

위 설정은 192.168.0.200번, 192.168.0.205번 IP에서 SSH에 접속 가능하도록 제한한 것이다. 또는 다음과 같이 설정할 수 있다.

...
## SSH
-A INPUT -s 192.168.0.200,192.168.0.205 -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
...

만약 192.168.0.xxx에서 모두 접속 가능하게 하려면 다음과 같이 수정한다.

..
## SSH
-A INPUT -s 192.168.0.0/24 -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
...

설정을 완료한 후에는 iptables 서비스를 재시작하면 적용된다.


7~]# systemctl restart iptables

iptblaes 명령어를 사용하여 설정된 룰을 확인해 보자.

~]# 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
REJECT     icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 8 reject-with icmp-host-prohibited
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  --  192.168.0.200        0.0.0.0/0            state NEW tcp dpt:22
ACCEPT     tcp  --  192.168.0.201        0.0.0.0/0            state NEW tcp dpt:22
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:443
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpts:5900:5910
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

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination


~]# iptables -t nat -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:127.0.0.1:8080

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

-t nat 옵션을 사용하여 nat 테이블의 설정 내역 또한 확인 하였다.


 이상으로 32번째 강좌를 마무리 합니다. CentOS7이든 그 하위 버전이든 iptables를 사용하여 방화벽 규칙을 관리하기 때문에 iptables의 기본은 알고 있어야 한다. filter규칙에 대해서라도 기본은 꼭 알고 있기를 바란다. 책은 집필도 집필이지만 탈고후에 검수, 교정 과정이 복잡하네요. 책 출판 후 잠시 쉬었다가 많은 분들의 요청에 의해 강좌를 작성합니다. 초지일관 처음뜻 그대로 끝까지 강좌를 쓸것입니다.^^  열심히 뛰는 에스유였습니다.^^ 
 
#################################################
* 본 강좌는 언제든 갱신될 수 있으며, 원글은 www.linux.co.kr 강좌>리눅스>SU의 연재강좌 에서 수정됩니다. 
* 본 강좌의 일부 또는 전체를 인용하실 경우, 반드시 출처를 밝혀 주시기 바랍니다.

* 수정이력 :
 2016.04.06(수): 대전행 KTX에서 강좌적어 봅니다.


관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,015 명
  • 현재 강좌수 :  35,688 개
  • 현재 접속자 :  170 명