리눅스 Iptables 보안정책

by 조쉬 posted Apr 23, 2014
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

리눅스 방화벽 iptables

 

iptables를 이용한 패킷필터링 사용법

패킷이 커널에 도착하면 그 패킷의 목적지를 확인하는 작업을 수행 이것을 라우팅이라고 한다.

패킷의 목적지가 이 시스템이라면 패킷은 전달되고 입력체인에 도달 패킷이 입력체인을 통과하면 패킷을 기다리고 있던 프로세서가 받게 된다.

그렇지 않고 커널에 포워딩이 불가능하도록 설정되어있거나, 패킷을 어떻게 포워딩해야 할지 알지 못한다면 그 패킷은 폐기(DROP)된다. 만약 이 패킷에 대해 허용(ACCEPT)하게 되면 이 패킷은 포워딩할 네트워크로 보내지게 된다.

마지막으로 로컬상에서 수행하던 프로그램은 네트워크를 통하여 패킷을 전송할 수 있다.

  

보안설정

 

iptables 정책이란 서버에 유입되는 패킷을 어떻게 처리하는가에 대한 정의

 

크게 2가지 - (허가 거부)

세부적으로 3가지 – (Accept Deny[패킷을 허용하지 않는다는 메시지를 보내면서 거부] Drop[패킷을 완전히 무시한다.])

 

 

iptables 기본형식

iptables –A INPUT –s [발신지] –sport[발신지포트] –d[목적지] –dport[목적지포트] –j[정책]

 

기본명령어

iptables –A :새로운 규칙을 추가(--append)

iptables –D : 규칙을 삭제(--delete)

iptables –C : 패킷을 테스트(--check)

iptables –I : 새로운 규칙을 삽입(--insert)

iptables –R : 새로운 규칙을 교체(--replace)

iptables –L : 새로운 규칙을 출력(--liset)

iptables –F : 체인의 모든 규칙을 삭제(--flush)

iptables –Z : 모든 체인의 패킷과 바이트 바운터 값을 0으로 만든다(--zero)

iptables –N : 새로운 체인을 만든다.(--new)

iptables –X : 체인을 삭제한다.(--delete-chain)

iptables –P : 기본정책을 변경한다.(--popicy)

 

iptables 옵션

-p : 패킷의 프로토콜의 포트번호 또는 이름을 명시한다.(--proto)

-s : 패킷의 발신지를 명시(--source)

-d : 패킷의 도착지를 명시(--destination)

-i : 규칙을 적용할 인터페이스 이름을 명시(--in-interface)

-j : 규칙에 맞는 패킷을 어떻게 처리할 것인가를 명시(--jump)

-y : 접속 요청 패킷인 SYN패킷을 허용하지 않는다.(--syn)

-f : 두 번째 이후의 조각에 대해서 규칙을 명시(--fragment)

 

iptalbes –A INPUT –p tcp –dport 80 –m recent –-update –-seconds 1 –-hitcount 10 –-name HTTP –j DROP

1초동안 80포트에 똑 같은 IP 10번 이상의 SYN가 들어오면 드랍시킨다. 정상적인 요청이 아닌 공격으로 간주

 

분당 ssh new커넥션이 10번이상있는 경우 차단

iptales –I INPUT –p tcp –dport 22 –m state –state NEW –m recent –update –seconds 60 –hitcount 11 –j DROP

 

정상적인 패턴의 패킷공격 지연방법

iptables –A INPUT –p icmp –icmp-type echo-request –m limit 5/second –j ACCEPT

iotables –A INPUT –p tcp –tcp-flags ALL syn –m limit –limit 5/second –j ACCEPT

 

iptables에서의 source target 지정

소스발신지의 IP주소를 지정하는 방법

1.도메인네임 2.ip주소를 이용 3.ip주소 대여폭지정

 

iptables –A INPUT –s 0/0 –j DROP => 모든 IP로부터 유입되는 패킷을 거부

-p ! TCP : tcp 프로토콜이 아닌 모든 프로토콜 => ! (not 의미)일치하지 않은 것을 의미

--source-port !옵션이 선행될 수 잇으며, 이후에 하나의 TCP포트나 포트의 범위를 지정

--sport /etc/services파일에 기록된 사항과 같은 포트이름을 사용할수 있으며, 숫자로 포트번호를 지정할 수도 있다.

--destination-port, --dport => 소스포트지정과 같으며 목적지를 지정

--tcp-flags와 같이 두개의 단어를 사용하며, 첫번째 단어는 검사하고자 하는 지시자 리스트의 마스크이며, 두번째 단어는 지시자에게 어떤 것이 설정 될 것인지를 말해준다.

클라이언트---------syn---------à서버

클라이언트ß------syn, ack-------à서버

클라이언트ß------ack---------à서버

syn 패킷은 접속요청 플래그(syn)가 설정도니 패킷이므로 syn 패킷만 막으면 클라이언트가 접속할수 없다. DoS공격의 일종인 Syn Flooding공격은 위에서 언급한 syn형 패킷을 서버로 무수히 많이 보내느 것이다.

 

iptables –A input –p TCP –tcp-flags SYN,RST,ACK SYN –j DROP => --tcp-flags에 첫번째 인자는 검사할 리스트 마스크이며 두번째 인자는 설정되어 있어야 할 플래그이다. SYN, RST, ACK 플래그 중 SYN set 1로 되어있으면 위의 –tcp-flags설정에 해당이되므로 패킷은 DROP된다. => --syn, -y옵션과 같은 의미를 지니고 있다.

 

--tcp-option => !나 숫자가 옵션에 선행될 수 있으며, 숫자가 앞에 올 경우 그 숫자와 TCP옵션이 같은 경우의 패킷을 검사 TCP옵션을 검사하려 할 때 완전한 TCP헤더를 갖지 않는 것은 자동을 DROP

 

iptables방 화벽은 테이블 형식으로 정책을 관리 등록순서에 있어서 먼저 등록한 정책에 대해서 효력이 유효하기 때문에 등록시에는 순서가 매우 중요 모든 입출력패킷에 대해서 거부하는 설정이 먼저 등록되면 그 이후에 포트를 열어주는 설정을 하여도 효과가 없다. 허용하는 정책을 먼저 정의한 다음 거부하는 정책을 설정

 

맨마지막 줄에 추가

-A RH-Firewall-1-INPUT -p tcp --dport 1:65535 -j DROP => 서버의 모든 포트에 대해 접근을 거부

 

nmap 포트스캐너를 이용하여 오픈된 포트 아아보기

[root@urihouse ~]# nmap localhost

 

Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2011-01-24 20:46 KST

Interesting ports on localhost (127.0.0.1):

Not shown: 1672 closed ports

PORT     STATE SERVICE

21/tcp   open  ftp

22/tcp   open  ssh

25/tcp   open  smtp

80/tcp   open  http

111/tcp  open  rpcbind

631/tcp  open  ipp

3306/tcp open  mysql

4000/tcp open  remoteanything

 

Nmap finished: 1 IP address (1 host up) scanned in 0.129 seconds

[root@urihouse ~]#

 

 

패킷의 상태 구분으로 정책 설정

NEW -> 철저히 검색

ESTABLISHED-> 패스 연결이 맺어진 이후의 tcp ack, icmp_echo_reply

RELATED-> 패스 이미 연결 추적 테이블에 접속과 관련된 항목이 있는 경우

INVALIED -> 검색

iptables –I INPUT –m state –state ESTABLISHED,RELATED –j ACCEPT

기본적으로 등록되어져 있음.