DROP : 패킷에 대한 어떠한 정보도 되돌려 주지 않고 폐기 해버린다.
DENY : DROP처럼 패킷을 폐기 하기는 하지만, 폐기된다는 것을 송신 측에
전달한다.
ACCEPT : 위에서 말한 DROP이나
DENY와는 반대로 패킷을 수용하는 것을 말한다.
리눅스에서는 Packet
Filtering이 리눅스 커널 내부에 구성된다.
커널을 재구성할 때 netfilter에 관련된 옵션들을 설정해주면 Packet Filtering을 위한 환경이 구성된다. Packet
Filtering중에서 iptables는 리눅스 커널의 모듈로서 동작하게 된다.
iptables은 커널에 존재하는 netfilter의 룰을 세워주는 역할을
한다. 즉, iptables은 netfilter을 이용하기 위한 일계 유틸리티일 뿐이다.
iptables 중 filter의 기본
chain은 다음과 같다.
- INPUT
chain // host로 들어 오는 모든 패킷은 INPUT chain을 통과
- FORWARD chain // 수신지가 host가 아닌 패킷이 통과하게 되는 chain
- OUTPUT chain // host에서 나가는 모든
패킷은 OUTPUT chain을 통과
iptables 옵션
commands :
--append -A chain 체인에 새로운 규칙을 추가하기
--delete -D chain 체인의 어떤 지점에 규칙을 제거하기
--delete -D chain rulenum 체인에서 rulenum에
일치하는 규칙제거
--insert -I chain [rulenum] 체인의 rulenum 지점에
규칙을 삽입 (default 1=first)
--replace -R chain rulenum 체인의 rulenum 지점에 규칙을
교환
--list -L [chain] 모든 체인의 규칙들을 나열
--flush -F [chain] 모든 체인의 모든 규칙을 제거(일시적, 재 부팅하면 원상복구)
--zero -Z [chain] 해당 체인이나 모든 체인내의 모든 규칙들의 패킷과
바이트의 카운트를 0으로 만듦
--new -N chain 새로운 체인 생성
--delete-chain -X [chain] 사용자
정의 비어진 체인 제거
--policy -P chain target 미리 만들어진 체인 정책 바꾸기
--rename-chain -E old-chain new-chain 체인의
명칭 바꾸기
options:
--proto -p [!] proto
프로토콜(by number
or name, eg. `tcp')
--source -s [!] address[/mask] source
address
--destination -d [!] address[/mask] destination address
--in-interface -i [!] input name[+] network interface name ([+] for
wildcard)
--jump -j target 이건
설명하기 어렵다-_-;; 그냥 아래를 보자.
--match -m match extended
match (may load extension)
--numeric
-n
numeric output of addresses and ports
--out-interface -o [!] output name[+] network interface name ([+] for
wildcard)
--table -t
table table to manipulate
(default: `filter')
--verbose
-v
verbose mode
--line-numbers
print line numbers when listing
--exact
-x
expand numbers (display exact values)
[!] --fragment
-f
match second or further fragments only
--modprobe=<command>
try to insert modules using this command
--set-counters PKTS BYTES set the
counter during insert/append
[!] --version
-V
print package version.
--dport 목적지의 Port
--sport 출발지의 Port
iptables 사용
# iptables -L
살펴보면 Chain INPUT
(policy ACCEPT)와 같은 문구가 보임.
저 문구 밑에는 룰의 정보를 볼 수 있을 것이다.
(policy ACCEPT)를 설명하자면 세운 룰에 해당되지 않을 때 마지막으로 기본정책을 따라 패킷을 처리하는 것이다.
여기서는 ACCEPT이므로 패킷은 받아 질것이고 이것을
DROP으로 하면 패킷은 버려질 것이다.
기본정책을 바꾸기 위해서는
-P 옵션을 사용한다.
# iptables -P INPUT DROP
# iptables -L
을 하면 기본정책이 Chain INPUT (policy DROP) 와 같이 바뀌었을 것이며
설정된 룰에 해당 되지 않는 패킷은 마지막으로 그냥 DROP될 것이다.
-N과 -X 두 옵션은 체인을 직접 생성과 비어진 체인을 제어 할
경우에 사용 되면 기본체인(INPUT, OUTPUT, FORWARD)에는 해당되지 않는다.
# iptables
-F // 모든 체인의 룰을 제거 한다.(일시적)
# iptables -A
INPUT -j DROP
INPUT체인으로 들어오는 패킷을 모두 버린다. (-j 타겟을 실행한다)
# iptables -D
INPUT 1 // index를 지정해서 룰 삭제
or
# iptables -D INPUT -j DROP // 룰 내용을 삭제
체인에 대한 내용을 해보았고 이제 각종 옵션들에 대해서 알아
보자.
# iptables -A
INPUT -s 192.168.11.100 -j DROP
송신 측 IP가
192.168.11.100인 패킷이 들어 오면 버려진다.
# iptables -A
INPUT -d 192.168.11.100 -j DROP
도착지IP가
192.168.11.100인 패킷이 들어 오면 버려진다.
**IP지정 이외에 몇 가지 방법이 더 존재한다.
-s www.xxxx.com
: 도메인으로 제어
-s 192.168.10.0/24 : 네트워크 또는 집단으로 제어
-s 192.168.10.0/255.255.255.0 : 위와 동일
** ! 기호는 not 이다.
# iptables -A
INPUT -p TCP -j ACCEPT
tcp 프로토콜로 들어 오는 모든 패킷은 허용된다.
# iptables -A
INPUT -p tcp --dport 80 -j DROP
tcp 프로토콜의 목적지 포트가 80포트 일 경우 버려진다.
** -p 옵션은 해당 프로토콜의 번호를 사용해도 된다.(ex 21)
** --dport, --sport는 해당 서비스이름을 사용해도 된다.(ex www)
** 또한 포트는 다중 포트를 지정해도 된다.(ex 1024:65535)
# iptables -A
INPUT -i eth0 -p tcp --dport 80 -j DROP
-i 옵션은 단지 인터페이스를 지정해줄 뿐이다.
# iptables -A INPUT -p udp -s 0/0 --sport 1024: -d 192.168.152.1 --dport 53 -j
ACCEPT
udp프로토콜을 사용하고 1024~65535 포트로 들어 오는
모든 패킷 중 수신지가 192.168.152.1 이고 포트가 53번
인 것만 수용한다.
포트 범위에 대한 지정
:1203(0~1023)
1024:(1024~65535)
1024:65535(1024~65536)
# iptables -A OUTPUT -p tcp -m multiport -d 0/0 --dport 23,25,80 -j ACCEPT
tcp 프로토콜을 사용하여 나가는 패킷 중 모든 수신지를 가지고 해당포트가 23,25,80번은
허용한다.
# iptables -A INPUT -m mac --mac-source 00:E0:91:FF:FF:F0 -j DROP
이더넷 헤더의 mac address 체크를 통한 rule
설정
# iptables -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
들어 오는 패킷이 상태가 ESTABLISHED나
RELATED인 경우 허용
# iptables -A INPUT -m state --state INVALID -j DROP
들어 오는 패킷이 상태가 INVALID라면 버림
상태
NEW : 새로운 접속을 만드는 패킷
ESTABLISHED : 존재하는 접속에 속하는 패킷(응답 패킷을 가졌던 것)
RELATED : 기존 접속 부분은 아니지만 연관성을 가진 패킷
INVALID : 어떤 이유로 확인 할 수 없는 패킷, 즉 알려진 접속과 부합하지 않는 icmp 에러와 "out of memory"등을
포함
# iptables -A INPUT -p -tcp -j LOG --log-level info --log-preifx "TCP DROP
INFO"
drop 되는 정책에 대해서 시스템 로그에 남긴다.
--log-level : 레벨숫자나 이름. 여기서 레벨은
syslog.conf의 우선순위와 동일
debug, info, notice, warn, err, crit, alert, emerg(=panic)
--log-prefix : 메시지로 뿌려질 때의 로그 이름을 지정하는 것.
# service iptables save
- iptables의 룰셋을 저장, /etc/sysconfig/iptables 파일이 생성
# service iptables
restart
- iptables의 재 시작
iptables의 룰셋 확인
# cat /etc/sysconfig/iptables
iptables의 환경설정
# vi /etc/sysconfig/iptables-config
# IPTABLES_SAVE_ON_RESTART="YES”
- reboot 후에도 설정된 룰셋을 그대로 유지된다.
Iptables와 Ipchains의
차이점
① 미리 만들어진 체인의 이름(input, output, forward)들이
소문자에서 대문자로 바뀌었는데, 이것은 입력과 출력
체인은 이것이 지역 네트워크로 향하고, 지역에서 생성된 패킷만을 적용하기 때문이다.
② DENY target은 DROP으로 바뀌어졌다.
③ 생성한 체인을 ‘0’으로 하면 정책 카운터도 지워진다.
④ -i 지시자는 들어오는 인터페이스만 의미하고, INPUT과 FORWARD chain에서만 작동한다. FORWARD나 OUTPUT chain은 -o로 사용한다.
⑤ TCP와 UDP 포트는 --source-port,
--sport(--destination-port, --dport)로 사용하게 된다. -p tcp 또는 -p udp 옵션과 함께 사용되어야 한다.
⑥ TCP -y 지시자는 --syn으로 바뀌었고, -p
tcp 다음에 써 주어야 한다.
⑦ 체인 이름은 16자까지 가능하다.
⑧ REJECT와 LOG는 확장된 target이다. 즉, 이것들은 독립된 커널 모듈이라는 것을 의미한다.
⑨ iptables는 netfilter 필터링 룰에 사용한다. 대부분 ipchains와 사용법이 거의 같으나, 가장 큰 차이점은 확장성에 있다. 정상적으로 커널 확장은 커널 모듈 하부 디렉터리(/lib/modules/커널버전/kernel/net)에 존재하는데, iptables는 요구에 의하여
적재된다. 그래서 이들 모듈을 직접 적재할 필요는 없다.
iptables의 확장들은 공유 라이브러리 형태로 보통 /usr/local/lib/iptables에
위치한다.
펌'd by yOUNGRAP님의 블로그