본문 바로가기

리눅스

[리눅스] iptables 방화벽 정책

반응형

# Sangchul Byun 2010-07-29

 

# Loopback traffic allow

-A INPUT -i lo -j ACCEPT

-A OUTPUT -o lo -j ACCEPT

 

# 사내네트워크

-A INPUT -s 192.168.0.19 -j ACCEPT

 

# TCP flag check

-A INPUT -p tcp --tcp-flags ALL NONE -j DROP

-A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

 

# State chase

-A INPUT -m state --state INVALID -j DROP

-A OUTPUT -m state --state INVALID -j DROP

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

 

# Service Port Configuration

# DNS

-A INPUT -p udp -m udp --sport 53 -m state --state ESTABLISHED -j ACCEPT

-A INPUT -p udp -m udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT

-A INPUT -p tcp -m tcp --sport 53 -m state --state ESTABLISHED -j ACCEPT

-A INPUT -p tcp -m tcp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT

# HTTP

-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

# SSL

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

# MySQL

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

# Mail

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

# SSH

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 2165 -j ACCEPT

# FTP

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

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

# SNMP

-A INPUT -p udp -m udp --dport 161 -j ACCEPT

 

# Deny port

-A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j REJECT --reject-with icmp-port-unreachable

-A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j DROP

-A INPUT -p icmp -m icmp --icmp-type 8 -j DROP

-A INPUT -p tcp -m tcp --dport 0:1023 -j DROP

-A INPUT -p udp -m udp --dport 0:1023 -j DROP

COMMIT

 


1.1 IPTALBES 의 COMMAND와 옵션 방법.

 

1.1.1 명령의 기본 형태

 

iptable - [ADC]chain-rule-specification [option]
iptable - [RI] chain rulenum rule - specification [option]
iptable - D chain rulenum [options]
iptable - [LFZ] [chain] [options]
iptable - [NX] chain
iptable - P chain target [option]
iptalbe - E old-chain-name new-chain-name

 

* iptables -A INPUT -s 211.254.138.130 -j DROP
* iptables -A OUPUT -d 211.254.138.130 -j DROP


 

#iptables -A INPUT -s 근원지 --sport 근원지포트 -d 목적지 --dport 목적지의 포트 -j 정책
EX) iptables -A INPUT -s ! 211.100.100.110 -d 211.200.200.122 -p tcp -j DROP
(출발지가 211.100.100.110 이 아니며 목적지가 211.200.200.122 인 경우 패킷을 파기)

 

 

1.1.2 commands

 

-A (--append) : 지정된 체인의 끝에 하나 또는 그 이상의 정책을 첨가
-I (--insert) : 지정된 체인의 시작에 하나 또는 그 이상의 정책을 삽입
-D (--delete) : 정책 내용과 일치하는 특징 체인에서 하나 또는 그 이상의 정책을 삭제
(ex) iptables -D 1 (룰번호 1번 삭제)
-R (--replace) : 선택된 체인에서 정책을 교채
-L (--list) : 선택된 체인에서 모든 정책의 목록을 출력 (룰번호등을 확인 출력)
-F (--flush) : 지정된 체이 내의 정책들을 삭제
-Z (--zero) : 모든 체인의 byte와 packet 카운트를 0으로 만든다.
-N (--new-chain)
-X (--delete-chain) : 지정한 상용자 정이 체인을 삭제 한다.
-P (--policy) : 지정된 체인에 정책을 세운다.
-E (--rename-chain) : 체인의 이름을 바꾼다.
-h

 

1.1.3 Rule specification parameters (중요)

-p : 점검할 패킷 또는 정책에 대한 프로토콜이 정의 ex) -p tcp, -p udp
-s : 근원지 정의 (패킷이 오는곳) ex) -s 211.100.100.111
TIP) IP 영역 선택 :
200.200.200.0/24 ==> 200.200.200.*
-d : 목적지 정의 (패킷이 가는곳)
-j : 지정된 target이동 ex) -j DROP
-i : 패킷을 받는 인터페이스 (eth0, ppp0)의 이름 ex) -i ppp0
-o : 패킷이 보내지는 인터페이스의 이름 ex) -o ppp0

 

 

* 패킷이 들어오는 체인 : -INPUT, FORWARD, PREROUTING
패킷이 나가는 체인 : -OUTPUT, FORWARD, POSTROUTING
-f : 두 번째 이후의 패킷에 대한 규칙을 지정할 수 있다.
-c(-set-counters) PKTS BYTES : 정책에 패킷과 byte를 초기화 할 수 있다.
1.1.4 OPTIONS
-v(--verbose) : 상세 정보를 출력
-n(--numeric) : 호스트 이름이나 포트 이름 대신 숫자로 출력
-x(--exact) : 패킷과 바이트 카운터 값을 단위(K,M,G)로 보여주지 않고 전제 숫자로 보여줌
--line-numbers : 정책을 출력시 각 정책의 시작 부분에 라인의 넘버를 추가.

 

* TCP, UDP, ICMP Extensions (중요)
* TCP : --protocol tcp로 지정되면 적용된다.
--sport(--source-port) [!][port[:port]]: 패킷이 오는 tcp포트 또는 포트범위
ex) -sport 20:21
--dport(--destination-port)[!][portp[:port]]: 패킷이 나가는 tcp포트, 포트범위
ex) --dport 21, --dport 21:80, --dport ! 80
--tcp-flags[!] mask comp : mask에서 지정한 tcp flag가 있을때 comp로대응
ex) --tcp-flags SYN,ACK,FIN,RST SYN -j DROP
참고:유요한 TCP flags SYN, ASK, FIN, RST, URG, PSII, ALL, NONE
[!]--syn : --tcp-flags SYN, RST, ACK, SYN의 약어
--tcp-option [!] number : TCP 옵션과 일치할 경우 패킷을 검사한다.
* UDP : --protocol u에fh 정의 되어 있다며 적용된다.
--sport(--source-port) [!][port:[port]] : 근원지의 포트, 포트 범위 지정
--dport(--destination-port) [!][port:[port]] ; 목적지의 포트, 포트 범의 지정
* ICMP : --protocal icmp 로 정의 되어 있다면 적용된다.
--icmp-type [!] typename : 지정된 ICMP 형태를 허용한다.

 

 

1.1.6 그 외의 적용확장
* mac : 들어오는 패킷의 이터넷 주소를 감시하며 INPUT 체인에서만 유용하다.
--mac-source [!] address : (:)으로 분리된 16진수의 이더넷 주소를 지정
* limit : 로그 메시지를 억제하는 것과 같이 적용검사의 속도를 제한하는데 사용되며
1초에 주어진 숫자만큼의 적용만 검사하게 된다.
--limit rate : 초당 평균 최대 적용 검사수(rate)지정하며 시간단위를 지정할 수있다.
--limit-burst number : 일치하는 패킷의 최대 수 (default는 5)
* owner : 지역 프로세서에 의해서 발생한 패킷의 생성자(유저)의 다양한 특징을 적용
--uid-owner userid : 지정된 사용자에 의해서 발생한 프로세서에서 만들어진 패킷
--uid-owner groupid : 지정된 그룹에 의해서 발생한 프로세서 만들어진 패킷
--pid-owner processid : 지정된 프로세서에 의해서 발생한 프로세서에 의해 만들어진 패킷인지를 검사
--sid-owner sessionid : 지정된 세션그룹에 의해서 발생한 프로세서에의해 만들어진 패킷인지를 검사
* state : 'ip_conntrack'모듈이 접속 추적 분석(connection-trackin analysis)를 해석한다.
NEW : 새로운 접속을 만드는 패킷
ESTABLISHED : 존재하는 패킷에 속하는 패킷(i,c. 응답 패킷 또는 응답을 보안 접속에서 나가는 패킷)
RELATED : 실재의 접속은 아니지만 관계있는 패킷으로 ICMP error 또는 ftp data 접속을 성릭하는 패킷
INVALID : 몇 가지 이유로 인증되지 않는 패킷으로 ICMP error 와 out of memory등 을 포함.

1.1.7 target 확장
* LOG : 일치하는 패킷이 커널 로그를 제공
--log-level level : 레벨 숫자나 이름을 적게 된다.
--log-prefix : 로그 시작 부분에 prefix의 내용을 첨가 하게 된다.
--log-tcp-sequence : TCP sequence 넘버를 로그에 기록한다. 만약 사용자들이 로그를 읽을 수 있을 경우 보안이 위험이 있다.
--log-tcp-options : TCP 패킷 헤더의 option들을 로그에 남긴다.
--log-ip-options : ip패킷 헤더의 options을 로그에 남긴다
* REJECT : DROP 과 동일한 작용을 하며 상대편 호스트에 ‘port unreachable'이란 에러 메시지를 icmp로 보내게 된다.
--reject-with : 응답 패킷에 대한 변경을 할 수 있다.


icmp-net-unreachable, icmp-host-unreachable

 

icmp-port-unreachable, icmp-proto-unrechable, icmp-net-prohibited


echo-reply, tcp-reset 사용 할 수 있다

* 재부팅후에도 설정이 되려면 쉘프로그램으로 설정후 /etc/rc.d/rc.local 에 넣어준다.

IPTABLE 적용 사례

iptables -A INPUT -p ! tcp -j DROP
TCP를 죄외한 모든 패킷은 파기하라!

iptables -A INPUT -p tcp -j ACCEPT
TCP 이면 모든 허용하라!

iptables -A INPUT -s 211.100.100.111 -j DROP
211.100.100.11에서 오는 모든 패킷은 파기하라

iptables -A INPUT -d 211.100.100.777 -j DROP
211.100.100.777로 나가는 모든 패킷은 파기하라

iptables -A PREROUTING -s 211.11.17.9 -i ppp0 -j DROP
ppp0장치에서 수신하는 패킷 출발지가 211.22.17.9 이면 파기하라

iptables -A INPUT ?s 200.200.200.1 ?p tcp --dport 21 ?j DROP
출발지가 200.200.200.1이고 목적지 포트가 21번 이면 파기하라
iptables -A INPUT --dport 25 ?j DROP
목적지 포트가 25이면 파기하라

iptables -A INPUT ?p tcp --dport 22 ?i ppp0 ?j DROP
목적지가 22번 포트 패킷이고 ppp0(인터넷접속연결) 인경우 차단
(만약, eth0 랜카드라면 무관)

iptables -A INPUT ?i ppp0 ?p tcp --syn --dport ! 80 ?j DROP
인터넷 연결에 들어오는 syn패킷은 80포트가 아니라면 모두 파기

NAT(NETWORK ADDRESS TRANSLATION) 서버에 대한 요약과 사례

SNAT (Source NAT) : 사설 IP -> SNAT서버(공인IP) -> 외부에 패킷전달
(ex) iptable -t nat -A POSTROUTING -s 192.168.1.10 -o ppp0 -j SNAT --to 211.1.1.2
출발지가 192.168.10.10 인 패킷은 SNAT에 도착하여 211.1.1.2 로 변환 외부로 패킷 전송


DNAT(Destination NAT) : 외부 클라이언트 -> DNAT 서버(공인IP) -> 사설 IP 서버
(ex)iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 192.168.0.7:8080
eth0에 도착한 패킷중 목적지 포트가 80번인 경우 사설IP 192.168.0.7의 8080포트로 패킷을 전송한다.

 

 

 

 

728x90
반응형