리눅스 방화벽 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
기본적으로 등록되어져 있음.