본문으로 바로가기

- 관련 용어

Firewall ( 방화벽 )

IPS ( 칩입 차단 시스템 )

IDS ( 침입 탐지 시스템 )

각 서비스 Wall (EX: 웹 방화벽 ( WAF ), 스팸 차단 시스템 )


Client -- Firewall -- IPS/IDS -- WAF --> WEB Server


- 방화벽 설정 툴의 종류

# system-config-securitylevel

# system-config-securitylevel-tui ( # lokkit )

# iptables CMD , /etc/sysconfig/iptables


- 네트워크 접근 제어 툴 

tcp_wrappers

모든 서비스를 제어하지 않는다. ( TCP 서비스 중에서 일부 서비스를 제어한다. 

네트워크 서비스 제어 성능을 떨어뜨리지 않는다. 

설정이 단순하다. 

단일 서비스 또는 몇 개의 서비스만 제어하는 경우 사용하면 좋다. 


iptables

모든 서비스 제어가 가능하다. 

네트워크 서비스 제어 성능이 떨어진다. 

설정이 복잡하다. 

네트워크 전체적인 서비스 제어할 때 사용한다. 


- iptables 기본 구조

넷필터(netfilter) 프로젝트에서 개발 했으며 광범위한 프로토콜 상태 추적, 패킷 애플리케이션 계층검사, 속도제한, 필터링 정책을 명시하기 위한 강력한 매커니즘을 제공한다. 


kernel 2.2 ( ipchains ) -> kernel 2.4 ( iptables ) -> kernel 2.6 ( iptables )

[주의] ipchains 과 iptables을 동시에 사용하면 안된다. 


- 구조


라우팅 결정

패킷의 목적지 주소가 로컬 시스템에 해당되면, 패킷은 로컬 프로세스에 의해 처리되도록 라우팅된다. 패킷이 다른 시스템에 전달될 때 커널에서 패킷 포워딩이 활성화되어 있으면(/proc/sys/net/ipv4/ip_forward), 패킷은 라우팅 테이블 정보에 따라 목적지로 전달된다.

패킷 필터링 

지점패킷 필터링은 커널 안의 다섯 개의 필터링 지점에서 발생한다. 필터링 지점 이름은 대소문자를 구별하며 모두 대문자로 이루어진 것에 주의하여야 한다.


PREROUTING    처음 전달 받은 패킷을 처리하는 필터링 지점(nat)


FORWARD    로컬 시스템을 통해 경유되는 패킷을 처리하는 필터링 지점(filter)


INPUT    라우팅 결정 후에 로컬 시스템으로 향하는 패킷을 처리하는 필터링 지점(filter)


OUTPUT     보내기 프로세스를 떠난 패킷을 POSTROUTING 전에 처리하는 필터링 지점(nat/filter)


POSTROUTING    시스템을 떠나기 바로 전의 패킷을 처리하는 필터링 지점(nat)



- 개요

논리적인 3개의 chains 로 구성되어 있고, 각각 INPUT, OUTPUT, FORWARD 라는 이름을 가지고 있다. 

관리자가 정의하여 새로운 사슬을 생성 가능 하다. ( 기본 사슬의 이름은 대문자 이다. )



INPUT 사슬   : 리눅스 박스를 향해 들어오는 패킷들이 거치는 체인

FORWARD 사슬 : 리눅스 박스를 거쳐 OUTPUT 체인을 향하는 체인

OUTPUT 사슬  : 리눅스 박스를 나가는 패킷들이 들어가는 체인


- 정책 개요

방화벽 = 패킷 필터링 + NAT


들어오는 패킷을 순서대로 정의된 Rule 들을 점검하고 처음 일치 되는 규칙을 적용한다. ]

하나의 필터링 규칙에 여러가지 조건으로 지정하면 모든 조건에 일치해야 규칙 적용이 된다. 

사용자 정의 체인의 경우 일치 항목이 없을 경우에는 제어권은 사용자 정의 체인이 호출되었던 체인으로 다시 돌아간다. 


규칙 타겟 ( Rule Target ) 

ACCEPT : 패킷을 허용하는 옵션이다. (Allow)

DROP   : 패킷을 완전히 무시한다.   (Deny)

REJECT : 패킷을 허용하지 않는다는 메세지를 보내면서 거부한다. 사슬 전체 정책 설정(-P)에서는 사용할 수 없다. 

패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송한다.

LOG    : 시스템 로그 커널 장치로 연결한다. 패킷을 syslog에 기록한다.

사용자 정의 체인 : 사용자가 정의하는 체인이다.


[참고] 방화벽은 IP, Port , Protocol, 패킷 특성을 확인한다. 


연결 추적 ( Connection Tracking )

내부 네트워크 상 서비스 연결 상태에 따라서 그 연결을 감시하고 제한할 수 있게 해준다. 

연결 추적 방식은 연결 상태를 표에 저장하기 때문에, 다음과 같은 연결 상태에 따라서 시스템 관리자가 연결을 허용 하거나 거부할 수 있다.


NEW — 새로운 연결을 요청하는 패킷, 예, HTTP 요청

ESTABLISHED — 기존 연결의 일부인 패킷

RELATED         — 기존 연결에 속하지만 새로운 연결을 요청하는 패킷, 예를 들면 접속 포트가 20인 수동 FTP의 경우 전송 포트는 사용되지 않은 

1024 이상의 어느 포트라도 사용 가능하다.

INVALID         — 연결 추적표에서 어디 연결에도 속하지 않은 패킷


- iptables 명령어 

전체 사슬에 대한 설정 ( 대문자, -P, -L , -N , -X 등 )

각 사슬에 대한 규칙 (Rule ) 설정 ( 소문자 , -s, -d, -p 등 )


전체 사슬에 대한 옵션 

 

 옵션

설명 

 

 

-N

새로운 사슬을 만든다. 

# iptables -N NEW 

 

 

-X 

사슬을 제거한다. 

# iptables -X NEW

# iptables -X  

( 이름을 지정하지 않으면 모두 삭제 ) 

 

 

-P 

사슬의 정책을 설정한다.

# iptables -P INPUT (DROP / ACCEPT)

 

 

-L 

 현재 사슬의 규칙을 나열한다. 

# iptables -L

# iptables -vL  ( 더 자세히 )

# iptables -L INPUT ( INPUT 만 나열 )

 

 

-F 

사슬로부터 규칙을 제거한다.

# iptables -F

# iptables -F INPUT

 

 

-Z 

사슬내의 모든 규칙의 패킷과 바이트의 카운트를 0으로 만든다. 

# iptables -Z 

 


사슬 내부 규칙에 대한 옵션

 

 옵션

설명 

 

 

-A

사슬에 새로운 규칙을 추가한다. 

해당 사슬에 맨 마지막 규칙으로 등록된다.

 

 

-I 

사슬에 규칙을 맨 첫부분에 설정한다. 

(대문자 i ) 

 

 

-R 

사슬의 규칙을 교환한다. 

 

 

-D 

사슬의 규칙을 제거한다. 

 


필터링 지정 

-s(Source IP), -d(Destination IP)     ( DNS 이름으로 지정 불가 )

-j(jump) 

-! 

-p(Protocol) 

-i(In-interface), -o(Out-interface) 

-t(Tables) 

--sport(Source Port), --dport(Destination Port) 


- iptables 설정 스크립트

/etc/sysconfig/iptables 파일을 사용하지않고 스크립트를 만들어서 사용한다. 


실습 환경 )     Linux ( CentOS 5.X redhat , kernel 2.6 , ip = 192.168.10.100 )

 

# vi /root/bin/iptables.sh

 

 #!/bin/bash


iptables -F -t filter

iptables -F -t nat


#

# (1) Local ACCEPT

#

iptables -A INPUT -i lo -j ACCEPT 

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 


#

# (2) Policy

#

iptables -A INPUT -m state --state NEW -p tcp -s 192.168.10.200 -d 192.168.10.100 --dport 23 -j ACCEPT

iptables -A INPUT -m state --state NEW -p tcp -s 192.168.10.0/24 -d 192.168.10.100 --dport 22 -j ACCEPT

iptables -A INPUT -p icmp --icmp-type echo-request -s 192.168.10.100 -d 0/0 -j ACCEPT

iptables -A INPUT -p icmp --icmp-type echo-reply -s 0/0 -d 192.168.10.100 -j ACCEPT

iptables -A INPUT -m state --state NEW -p tcp -s 0/0 -d 192.168.10.100 --dport 80 -j ACCEPT

#

# (3) All DROP

#

iptables -P INPUT DROP 

 

1. Local

> local 에서 접속하는 것들은 모두 ACCEPT

> -m state --state ESTABLISHED,RELATED  

연결이 이미 되어 잇는 것, 연결 중인 것은 ACCEPT ( iptable 은 송수신을 모두 설정해야하는대 이런식으로 설정하면 한줄로 설정이 가능하다.)


2. Policy

>  192.168.10.100 서버에 23번 포트로 접속하려는 192.168.10.200 는 허용 /  telnet

>  192.168.10.0/24  대역이 22번 포트로 접속하려는 것은 허용 / ssh

>  192.168.10.100 서버는 0/0 ( 어디든 )  echo- request  가능 / ping 

>  0/0 어떤 IP도 192.168.10.100 에 echo-reply 전송 가능 / ping

>  0/0 어떤 IP도 192.168.10.100 에 echo-unreachable 전송 가능 / ping

>  0/0 어떤 IP도 192.168.10.100 서버에 80 포트로 접속 허가 / httpd


3. DROP

> 위 조건들 이외에는 모두 drop


[참고] 

telnet 서비스는 암호화 통신을 하지 않기 때문에 네트워크 대역을 허용하는 것보다 특정 IP를 지정하는 것이 좋다. 

ssh 는 암호화 통신을 하기 때문에 대역을 지정해도 괜찮다. 

웹 서비스는 모두 다 이용해야 하기 때문에 모든 IP를 허용한다. ( WAF 같은 보안 장비에 맡긴다. ) 

자신의 서버에서는 외부로 ping test가 되지만 자신의 서버로 ping test를 막아둔다. ( EX : naver )


[참고] 각 서비스들에 대한 제어 예제

(주의) 반드시 source ip 부분이나 destination ip 부분의 지정이 필요하다.


- (WEB) HTTP -- TCP 80

iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT


- (WEB) HTTPS -- TCP 443

iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

iptables -A INPUT -m state --state NEW -m tcp -p tcp -m multiport --dports 80,443 -j ACCEPT


- (DB) MySQL(MariaDB) -- TCP 3306  

iptables -A INPUT -p tcp --dport 3306 -j ACCEPT 


- (FTP) active mode -- TCP 21,20

iptables -A INPUT -p tcp --dport 21 -j ACCEPT

iptables -A INPUT -p tcp --dport 20 -j ACCEPT


- (FTP) passive mode -- TCP 21, 1024-65535

iptables -A INPUT -p tcp --dport 21 -j ACCEPT

iptables -A INPUT -p tcp --dport 1024:65535 -j ACCEPT


- (MAIL) SMTP -- TCP 25

iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT


- (MAIL) Secure SMTP -- TCP 465

iptables -A INPUT -p tcp -m tcp --dport 465 -j ACCEPT


- (MAIL) POP3 -- TCP 110

iptables -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT


- (MAIl) Secure POP3 -- TCP 995

iptables -A INPUT -p tcp -m tcp --dport 995 -j ACCEPT


- (MAIl) IMAP -- TCP 143

iptables -A INPUT -p tcp -m tcp --dport 143 -j ACCEPT


- (MAIl) Secure IMAP -- 993

iptables -A INPUT -p tcp -m tcp --dport 993 -j ACCEPT


- (ICMP) ICMP 허용 (ping)

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT


- (NTP) -- UDP 123

iptables -A INPUT -p udp --dport 123 -j ACCEPT


- (DHCP) -- UDP 67,68

iptables -A INPUT -p udp --dport 67:68 –j ACCEPT


- (SAMBA) -- TCP 445, 137,138,139

iptables -A INPUT -m state --state NEW -p tcp --dport 445 –j ACCEPT

iptables -A INPUT -m state --state NEW -p tcp --dport 137:139 –j ACCEPT