참고로 리눅스 커널버전 2.6.32 이다 2.6 아래 리눅스 커널이랑은 서로 약간 다르다.
iptables
-Netfilter Project에서 개발되었으며 2001년 리눅스 2.4커널부터 적용되었으며 주요기능으론 상태 추적, 패킷 애플리케이션 계층 검사 , 속도제한 등이있다
이식성과 특징
-리눅스 커널내부에서 동작하기 때문에 강력한 제어기능이 가능하고 NAT도 가능하다
iptables architecture
iptables 에는 테이블이 존재하고 테이블에는 체인이 존재한다. 그리고 체인에는 적용할 룰이존재한다 즉 iptables > 테이블 > 체인 > 룰(정책) 이며 iptables 는 룰(규칙)집합 이라고할수있다
각각의 룰이 체인을 이루고 그체인들이 테이블에 속해있는것이다
테이블(table)
filter table
-필터링을 적용하는 테이블로서 특정 rule(규칙)에 따라 패킷을 차단하거나 허용 하는역할을 하며 filter table은 디본적으로 INPUT, OUPUT, FORWARD 3개의 chain이 존재한다
nat table
-필터링기능은 없지만 nat(주소변환)용으로 사용하며 외부에서 내부로 오는 패킷 포워딩, 내부에서 외부로 나갈때 다른 ip주소로 나가게 하는게 가능하다
mangle table
-TTL이나 TOS(type of service)같은 특수규칙을 적용하기 위해 사용된다 즉 패킷안에 데이터를 변환 또는 조작을 위한 테이블이다
raw table
-필터 테이블의 Connection Tracking(연결추적) 기능을 좀더 자세히 다룰때 사용된다 특정 네트워크는 연결 추적에서 제외하는등의 추가 설정이 가능하며 conntrack 모듈보다 우선순위를 가진다
체인(chain)
- 패킷이 이동하는 경로이다
- 각각의 table은 각각의 다른 chain을 가지고있고 사용자 정의 chain생성 가능하다
- iptables 정책 한개 라고 이해하면 된다
- flter table은 기본적으로 INPUT(수신), OUTPUT(송신), FORWARD(경유) 체인이 존재한다
- NAT table은 PREROUTING(라우팅전)과POSTROUTING(라우팅후) 체인이 추가로 존재한다
match(매치)
-쉽게 말하면 규칙을 적용할 대상이 되는 요소들과 옵션이다 예로는 아래의 목록이있다
매치 | 설명 |
--source (-s) | 출발지 IP주소 또는ip/subnet 즉 네트워크 |
--destination (-d) | 목적지 IP 주소 또는 네트워크 |
--protocol (-p) | 특정 프로토콜 |
--in--interface (-i) | 입력 인터페이스(패킷을 받는 장치) |
--out-interface (-o) | 출력 인터페이스(패킷을 보내는 장치) |
--state | 연결 상태 |
--string | 어플리케이션 계층 데이터 바이트 순서 |
--comment | 커널 메모리의 규칙이 저용되는 최대 256바이트 주석 |
--syn (-y) | SYN 패킷 |
--fragment (-f) | 두번쨰 이후 단편화 조각 |
--table(-t) | 처리될 테이블 |
--jump (-j) | 규칙에 맞는 패킷에 대한 행동 |
--match (-m) | 특정 모듈 사용 |
target(타겟)
-매치를 통해 규칙을 적용할 대상을 선별했으니 행동이 필요하다 바로 타겟이다
타겟 | 설명 |
ACCEPT | 패킷을 허용 |
DROP | 패킷을 버린다(무시)->못받은걸로 처리 |
LOG | 패킷을 syslog에 기록 |
REJECT | 패킷을 버리고 버렸다고 응답해준다 즉 거절임(TCP는 Reset, UDP는 ICMP port Unreachabe 를 보낸다) |
RETURN | 체인내에서 패킷처리를 계속함 즉 재귀 |
설치
-리눅스 커널에 포함이니 아마 거의 이미 설치되어있을 것이지만 root로 아래의 명령어를 실행해주자
yum update iptables 없다면 yum install iptables
명령어 형식(command format)
명령어 [command] [체인] [인터페이스] [출발지/목적지] [프로토콜] [포트] [상태] [타겟]
command | 설명 |
-A(--append) | 규칙을 순서대로 아래에 추가한다. |
-N(--new-chain) | 새로운 체인 생성 |
-X(--delete-chain) | 체인 제거 인자가 없으면 전체 |
-P(--policy) | 체인 기본정책 변경 |
-L(--list) 또는 -S | 체인의 규칙상태 보기 |
-F(--flush) | 체인내의 모든 규칙 제거(방화벽 초기화) |
-Z(--zero) | 체인내의 모든 규칙의 패킷과 바이트의 카운트를 0으로 초기화 |
-D(--delete) | 규칙을 삭제 |
-R(--replace) | 새로운 규칙으로 대체 |
-I(--insert) | 체인의 가장 처음에 규칙을 추가한다. |
-E(--rename-chain) | 체인의 이름을 변경한다. |
주요파일 위치 및 정책 저장, 불러오기
파일 위치 및 명령어 | 설명 |
service iptables save | 현재 정책을 기본으로 설정으로 재부팅시 자동시작되도록 한다 |
iptables-save > [/path/filename] | 현재 정책을 지정 경로에 파일명으로 저장한다 |
/etc/rc.d/init.d/iptables | service 등록된 스크립트 이다 |
/etc/sysconfig/iptables | 자동으로 iptables 시작시 적용되는 기본 정책이다 |
정책이 정의된 쉘스크립트 파일 .sh | 755 권한을 chmod로 주고 실행하면 자동으로 정책이 적용 |
/etc/sysconfig/iptables-config | 모듈 관리및 설정 파일 |
/etc/sysctl.conf | ip포워딩같은 설정을 영구적용 가능하며 호스트전용 가용 포트번호 범위등도 여기에 설정된다 |
/proc/sys/net/netfilter/ | 현재 세션수, 최대 연결추적 갯수 설정등 각종 설정파일이 존재한다 |
iptables 켜기 , 끄기 service 명령어
service iptables {start | stop | reload | restart | condrestart | status | panic | save}
현재 정책 상황 보기 및 출력
iptables -L "모든 테이블에 대해 모든 정책 출력"
iptables -nL "최근 정책 부터출력"
iptables -L --line-numbers "정책 순서 번호도 같이 출력"
iptables -V "버전 출력"
iptables -L "체인명 해당 체인만 출력한다"
iptables -L 체인명 -t 테이블명 "해당 테이블의 해당 체인 만 출력"
iptables -L -t 테이블명 "해당 테이블만 출력"
iptables -L -n "포트번호 및 IP출력"
iptables -L -v "필터링된 패킷 바이트 출력"
정책 만들기전에 수행할것
iptables -F "모든 정책 초기화"
iptables -X "사용자 정의체인 전부 삭제"
iptables -P INPUT DROP "기본 수신 패킷 전부 차단"
iptables -P OUTPUT DROP "기본 솔신 패킷 전부 차단"
iptables -P FORWARD DROP "기본 경유 패킷 전부 차단"
iptables 주요파일 및 모듈 설명
m 옵션을 통해 모듈을 사용하기전에 먼저 모듈이 로드 되어잇어야한다
/sbin/modprobe [모듈명] 을 입력하면 모듈이 추가되고 정책을 설정할떄 m 으로 모듈을 사용할수있다
그중 conntrack 모듈은 연결추적에 필요한 모듈인데 네트워크 연결 정보를 시스템이 기억하는것이다 이를통해 상태기반 방화벽이라던가 NAT, IP포워딩을 사용할수있다
conntrack 모듈의 테이블을 구성하는 값은 2가지다.
- CONNTRACK_MAX : 커널 메모리 상에서 netfilter가 동시에 처리하는 세션의 수
- HASHSIZE : CONTRACK 엔트리의 리스트를 저장할 해쉬 테이블의 사이즈
kernel: ip_conntrack version 2.4 (8192 buckets, 65536 max) - 228 bytes per conntrack
netfilter의 conntrack 하나당 228 byte가 필요하며ㅡ 최대 65536개 만큼 처리가 가능하다는 뜻임
forward 모듈은 forward 테이블의 정책이나 ip포워딩 같은 NAT이용시 사용된다
/proc/sys/net 디렉토리 하위에 각종 파일들이 존재하는데 연결추적 최대량이라던가 IP포워딩같은 옵션을 여기서 지정할수있다 또한 로그도 볼수있다
※방화벽 정책 설정 가이드
1.방향 -패킷이 들어오는건지 나가는건지 경유하는건지
2.객체(IP/PORT) -식별할 대상(매치,match)
3.액션 - 할 행동(target)
4.순서 - rule들의 순서 예를들어 특정 ip 2개를 제외하고 전부 허용하려할때 전부 허용하는걸 맨 먼저 적용하면 아래 2개 정책이 무효된다오 그래서 순서가 중요하오
정책 설정
#eth0장치로 icmp 패킷 수신 허용
iptables -A INPUT -i eth0 -p icmp -j ACCEPT
#수신을 해주었으니 발신(응답)도 해주어야한다
iptables -A OUTPUT -o eth0 -p icmp -j ACCEPT
아래는 설정 영상이다
참고로 iptables -nL --line-numbers 를 사용하면 지우기 쉽게 정책 왼쪽에 숫자가 나온다
상태기반(stateful) 과 연결추적(Connection Tracking)
conntrack 모듈을 사용하고 옵션으로 -m state --state 버전이올라가면서-m conntrack --ctstate로사용한다
또한 비연결지향성인 UDP도 상태기반을 지원한다
상태는 4가지 종류가 있다
- NEW -새로운접속을만드는패킷
- ESTABLISHED -존재하는접속에속하는패킷(즉, 응답패킷을가졌던것)
- RELATED -기존의접속의부분은아니지만연관성을가진패킷으로. ICMP 에러나(FTP 모듈이삽입되어있으면) ftp 데이터접속을형성하는패킷.
- INVALID -어떤이유로확인할수없는패킷: 알려진접속과부합하지않는ICMP 에러와'out of memory' 등을포함한다. 보통이런패킷은DROP 된다.
아래는 리눅스 기본 iptables 정책인데 정책 순서에 유의하면서 보자
#기존연결에 추가 연결이나 연관된 연결 허용
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#icmp 프로토콜 수신 허용
-A INPUT -p icmp -j ACCEPT
#로컬 장치 패킷 수신 허용
-A INPUT -i lo -j ACCEPT
#tcp 22포트 패킷 허용 ssh이다 putty, winscp 용
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
# 이외에 것들은 모든 패킷 수신 차단
-A INPUT -j REJECT --reject-with icmp-host-prohibited
#이외에 것들은 모든 패킷 경유 차단
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
--reject-with icmp-host-prohibited 는 패킷 거부이유를 icmp 프로토콜 host-prohibited 메시지를 통해 알려주라는 것이다 1
또한 OUTPUT체인이 없는데 이는 상태기반이기떄문에 알아서 응답도 해주기 때문에 OUTPUT 체인은 따로 정책을 명시해주지 않아도 되는것이다
로깅 logging
허용이나 차단 규칙위에 존재해야한다
로그 옵션은 아래와같다
--log-prefix "로그이름" : 로그에이름지정(grep등으로필터하여보기편하도록)
--log-ip-options : IP 패킷내용중 Options의내용을 로그에 포함하도록지정
--log-tcp-options : TCP 패킷내용중 Options의내용을 로그에 포함하도록지정
- --log-tcp-sequence : TCP 패킷내용중 순서Number/승인Number를 로그에 포함하도록지정
- --log-level debug : 로그레벨 지정
바로위 상태기반 정책에 로그를 추가해보자
#로그는 항상 패킷 허용 차단 위에 존재해야한다 따라서 I 를 통해 맨위로 삽입한다
#icmp 패킷에 대해 log_icmp로 로그남기기
iptables -I INPUT -p icmp -j LOG --log-prefix "log_icmp"
# tail -f /var/log/messages | grep log_icmp 를통해 실시간 보기가능하다
iptables -L --line-numbers
tail -f /var/log/messages | grep log_icmp
영상을 통해 실시간 확인해보자
정책 사전(작성중) NAT는 다음에...
로컬 네트워크 장치 |
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
DNS |
iptables -A INPUT -p udp -m udp --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
ICMP (핑) |
iptables -A OUTPUT -o eth0 -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -i eth0 -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A OUTPUT -o eth0 -p icmp --icmp-type echo-reply -j ACCEPT
SSH (Winscp, Putty) |
iptables -A INPUT -p tcp -m tcp --sport 22 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT
HTTP, HTTPS |
iptables -A INPUT -m state --state NEW -m tcp -p tcp -m multiport --dports 80,443 -j ACCEPT
FTP |
iptables -A INPUT -p tcp -m tcp --sport 21 --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --sport 1024:65535 --dport 21 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -j ACCEPT
YUM |
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Reference
close
http://www.netfilter.org/documentation/ :Link
http://www.iptables.info/en/structure-of-iptables.html :Link
http://blog.daum.net/hypermax/6 :Link
http://webdir.tistory.com/170 :Link
학교 pdf 교제
close
- icmp-net-unreachable icmp-host-unreachable icmp-port-unreachable icmp-proto-unreachable icmp-net-prohibited icmp-host-prohibited or icmp-admin-prohibited (*) 등도 존재 [본문으로]
'UNIX > Redhat' 카테고리의 다른 글
레드햇 네트웍 설정 (ifcfg, route) (0) | 2018.01.26 |
---|---|
[스크랩] 리눅스에 xrdp 설치하기 (0) | 2016.01.11 |
리눅스 WWN 보는..... 확실히 체크하는 방법 (0) | 2014.04.22 |
[스크랩] 리눅스 날짜 기준으로 파일 삭제하기 (0) | 2014.03.28 |
[스크랩] 커널 파라미터 값 변경 (0) | 2014.02.12 |