58
iptables ip_table user level kernel level Rule parsing, read, write memory Rule Read & Write filter mangle nat rules iptables & netfilter 개개개

Netfilter란 무엇인가?pds52.cafe.daum.net/attach/5/cafe/2007/12/10/15/40... · PPT file · Web view2015-01-25 · iptables & netfilter 개념도 memory Rule parsing, read, write

Embed Size (px)

Citation preview

iptables

ip_table

user levelkernel level

Rule parsing, read, writememory

Rule Read &Write

filter mangle nat

rules

iptables & netfilter 개념도

Netfilter 란 무엇인가 ?-표준 Berkeley Socket Interface 의 외부에 존재하는 패킷 mangling 에 대한 프레임워크-프레임워크는 크게 4 부분으로 구성 , 각각의 프로토콜은 hooks 라는 것을 정의

- 각각의 프로토콜은 패킷과 Hook Number 를 이용하여 넷필터 프레임워크를 호출

-커널의 일부분은 각 프로토콜에 대하여 다른 hook 을 감시하도록 등록 : 패킷이 넷필터 프레임워크를 통과할 때 , 어떤 프로토콜과 훅을 등록했는지 확인 : 넷필터 훅이 호출되는 경우 , 각각의 모듈은 우선순위에 따라 호출 : 등록 확인 후 등록된 순서대로 패킷 검사 후 사용자 공간으로 보내기 위해 제어

( 비동기 처리 )

패킷 프로토콜 스택의 packet’s traversal 에 있는 잘 정의된 포인터

Routing, Forward, Local-IN, Local-OUT

AcceptDropStolenQueue

Netfilter 란 무엇인가 ?Netfilter/iptables - 리눅스 커널 2.4 이후 지원되는 F/W mechanism- IPFW ipfwadm ipchains 계보를 잇는 패킷 처리에 대한 실질적 기반 구조 Netfilter framework시스템에 들어오는 모든 패킷을 분석해서 사용자의 뜻대로 처리 ( 필터링 , 변조 ) 할 수 있고 기록할 수 있는 지능적 시스템

( 시스템으로유입되는 )패킷 분석

FilteringMangle

( 사용자 의도대로 처리 )

기록

Hooking( 단지 커널모듈 호출 )

Kernel module

Netfilter 패킷 경로도

-시스템에 패킷 진입 후부터 패킷의 진로에 대한 처분을 결정하는 사슬고리 구조-넷필터 훅들에 규칙을 추가 (iptables) 해서 패킷 흐름 제어- 패킷이 들어오면 해당 프로토콜에 의한 후킹이 발생해서 넷필터 프레임워크 ( 커널 모듈 ) 을 호출하여 패킷 진로 결정

[1]PRE

[2] IN [5] OUT

[4]POST[3]FOR~패킷 이상유무점검 라우팅 결정무결성 점검 Other Interface

소스 IPIP 옵션확인HOOK Name

[1]NF_IP_PRE_ROUTING [2]NF_IP_LOCAL_IN [3]NF_IP_FORWARD [4]NF_IP_POST_ROUTING [5]NF_IP_ LOCAL_OUT

[ROUTE]

[ROUTE]

[IN] [OUT]

[POST]

Netfilter 패킷 경로도와 Hooking[PRE] [FOR-

WARD]

(Local Processes)

Conntrack

Conntrack

ConntrackConntrack

DNAT

Mangle

Mangle SNAT

DNAT (Proxy)Filter Filter

Filter

Hooking Call 에 의한 모듈의 작동1.Packet Filtering filter table2. NAT : 네트워크 주소 변환 NAT table (IP Masquerade, Port Forward, Redirection)3. Packet Mangling : 패킷에 대한 변조 mangle table4. Connection Tracking : 연결 추적 conntrack table

[ROUTE]

[ROUTE]

Mangle

Mangle Mangle

Netfilter 패킷 경로도와 Hooking

Hook 에서 기본적인 처리 구조 ( 훅과 모듈간의 소통 관계 )

1.Netfilter 는 작은 구조 지향 훅 ( 커널 모듈 호출 기능만 존재 )

2. 패킷 도착 감지 및 통보만 담당 한 지점의 길목 역할

지정 커널 모듈 실질적 패킷 처리 결과통보

Hooking 에 의한 1 차적 패킷처분 - NF_ACCEPT: 평소처럼 진행 - NF_DROP : 패킷 폐기 - NF_STOLEN: 패킷 접수 - NF_QUEUE : 사용자 큐에 삽입 ( 사용자영역에서 처리 ) - NF_REPEAT: 같은 훅을 한 번 더 후킹

호출

Packet Filtering 의 개념- F/W = “Packet Filtering”

- F/W 의 정의 * 네트워크 사이에 접근 제어 정책을 집행할 수 있는 장치나 서비스 , P/G 통칭 * 원하는 것을 받고 , 원하지 않는 것을 받지 않는 기본적인 패킷 필터의 역할 * 이유 + 외부의 악의적인 접근을 제어 + end-user 에게서 잘 정의된 보안정책을 기대할 수 없기 때문에 네트워크 전체 차원에서 제어 및 감시 * 패킷 헤더 검사 규정된 규칙에 따라 패킷을 결정 (filter table)

* 패킷 필터링은 넷필터의 local_in, local_out, forward 훅에서 호출되어 수행 * 종류 + Static packet filtering F/W Network Layer(IP) 에서 패킷 단위의 필터링 결정 + Dynamic packet filtering F/W (status check) Transport Layer 에서 TCP Connection 이나 UDP Exchange 에 관련해서 작동

Packet Filtering 의 개념- Packet Filtering 의 이득 ( 위협 보호 ) * 불법적인 Port Scan 과 Network Mapping * Source Address Spoofing : 발신지 주소 속이기 * DOS : 몇몇 종류의 서비스 거부 공격 * Misconfiguration or Mistakes : 내부의 실수로 인한 보안 구멍

- Packet Filtering 을 위한 기본적인 보안정책 * 보안성 유리 정책 허가 패킷 제외 , 모두 거부 “ 허가받은 패킷을 제외한 보든 것을 거부하겠다 .”

* 사용자 유리 정책 거부 패킷 제외 , 모두 허가 “ 거부된 패킷을 제외한 모든 것을 허가하겠다 .”

Packet Filtering 의 개념- 패킷을 필터링하는 종류* Incoming Packet Filtering + Remote Src Address Filtering Port

+ Local Dest Address Filtering Port

* Outgoing Packet Filtering + Local Src Address Filtering Port

+ Remote Dest Address Filtering Port

* Incoming & Outgoing Packet Filtering + TCP Connection State Filtering

- 패킷 필터링을 위한 예 * TCP Port Scanning : TCP 연결을 생성하여 해당 포트가 열려있는지 검사 짧은 시간에 같은 소스에서 많은 포트로 TCP 연결 생성 포트 스캔으로 판단 접근 금지 * SYN Flooding : IP Spoofing 을 위한 과도한 SYN 신호 포착 차단 * 외부에서 내부 IP 로 접속 시도 차단 * Ping of Death : 패킷을 크게 만들어 처리를 느리게 함 차단 * Ping Flooding : 출발지 주소를 변조해 Echo Request 를 뿌려 공격 대상에게 과도한 Ping Echo Reply 를 받게 함 차단

Iptables 개요- 리눅스 넷필터 기반구조 위에서 방화벽을 구축하는 관리자 도구- ‘table’ 이라는 개념을 사용 서로 다른 종류의 패킷 처리를 기능적 분리 기능적 분리 단위를 모듈을 호출하는 방식으로 사용- 가장 중요한 Table 기본 테이블 , 삭제 안됨 * filter table : 패킷 필터링 * nat table : 네트워크 주소 변환 * mangle table : 패킷 변조

- 필요 시 table 추가 가능 , table 에서 table 을 호출 가능 ( 모듈간 상호협동성 )

+ 이 table 들을 기동하기 위한 모듈들은 table 이 사용될 때에 동적 로딩+ 모듈은 넷필터의 훅과 iptables 에 모두 등록

Iptables 개요- filter table 의 기능 * INPUT, OUT, FORWARD 세가지 기본 Chain 과 사용자 체인을 만들어 패킷에 대한 각종 명령 수행 가능 * 출발지 , 목적지 포트 지정 * 규칙에 해당하는 패킷에 대해 처분 (ACCEPT or DROP) 지시 * IP 헤더의 각종 부분 , 즉 protocol, source, destination, interface, fragmetation 에 대해 ‘ match’ 하여 rule 적용 * TCP, UDP, ICMP 등 다양한 프로토콜 지원 *** 이외 다양한 것들을 수행하기 위해 , iptables 내부에는 몇 가지 특수한 flag 들을 사용 ‘ target’ 과 ‘ match’ ( 이 flag 들은 내부적으로 확장형이라고 부르고 , 모듈로도 구성되어 있음 )

Iptables 개요- filter table 의 target 확장형의 기능 * 기존의 처분 (ACCEPT and DROP) 외에 REJECT 라는 새로운 처분 가능 (REJECT 는 에러 메세지를 발신지에 보냄 ) * target 확장형을 통해서 log 가능 방화벽의 필수 요소 * QUEUE 를 이용해서 사용자 공간으로 패킷을 보낼 수 있음 사용자 공간에 패킷을 위한 처리가 없다면 그냥 DROP * RETURN 으로 체인의 끝으로 점프시킬 수 있음

- filter table 의 match 확장형의 기능 *

Iptables 개요- nat table 의 기능 * nat table 은 3 개의 체인을 기본으로 가짐 + PREROUTING : 패킷이 들어오기 전에 수정하는 목적지 주소 변환을 수행해서 부하분산 및 프록시 등의 여러 가지 일을 행함 + POSTROUTING : 라우팅 후 , 패킷이 빠져나가기 전에 출발지 주소 변환 이나 masquerading 을 수행 + OUTPUT : 로컬 프로세스 / 네트워크에서 만들어져서 나가는 패킷이 라우팅 되기 전에 목적지 주소 변환이나 방향 재설정 , 포트 포워딩을 수행 * 사설 IP 만 사용하는 네트워크에서 IP 주소만을 변환하여 NAT 를 수행 * 모든 사설 호스트가 하나의 공인 주소를 통하여 연결되도록 NAT 를 수행할 수 있음 NAPT (Network Address Port Translation)

* 서로 다른 IP 체계를 사용하는 네트워크 사이에서 양방향 NAT 수행 가능 IPv4, IPv6 사이에서 양방향 NAT 를 사용하여 소통 * src 와 dest 주소의 네트워크가 충돌하는 경우 , 또는 필요 시 NAT 를 두 번 수행

Iptables 개요- nat table 의 확장형 * SNAT 확장형을 사용하여 출발지 NAT 를 수행 * DNAT 확장형을 사용하여 목적지 NAT 를 수행 * MASQUERADE 확장형을 사용하여 마스크레이딩 기능 제공 * REDIRECT 확장형을 사용하여 포트 포워딩 , 방향 재설정을 사용

- mangle table 의 기능 * 넷필터에서 관여하는 여러 부분들을 수정하거나 유지하는 일을 담당 * filter table 등에서 match 하는 부분과 연동되어 패킷의 진로에 지속적인 영향

* 두 가지 기본 체인 packet mangling 이 수행되는 지점 + PREROUTING 체인 : 넷필터에 도착한 패킷이 라우팅 되기 전에 그 내용을 바꾸어 패킷을 임의대로 처리하는 역할 + OUTPUT 체인 : 로컬 프로세스 / 네트워크에서 생성된 패킷을 수정하는 역할 + INPUT, FORWARD, POSTROUTING 추가 넷필터 구조의 모든 후킹 지점에서 조작 가능 * mangle table 의 확장형 + TOS 모듈 : IP 헤더의 TOS 부분을 수정 + MAKR 모듈 : 패킷의 mark 에 값을 지정해서 iptables 가 패킷을 관리하게 함

Iptables – 기본구조

1.1 시리즈( 제 1 세대 )

2.0 시리즈(1994 년 )

2.2 시리즈 (1998 년 )

2.4 시리즈 (1999 년 )

ipfw ipfwadm ipchains iptables

Filter Table 필터링을 담당NAT Table 네트워크의 주소를 변환할 때 사용

Mangle table 성능 향상을 위한 TOS 를 설정

- iptables 는 크게 3 개의 테이블로 구분

- Iptables 의 변천 과정

- 기본 필터링은 논리적인 3 개의 chains 으로 구성- 사용자가 정의하여 새로운 사슬도 생성 가능- 기본 사슬의 이름은 반드시 대문자

Iptables – Filter Table

리눅스를 향해 들어오는 패킷들이 거치는 체인리눅스를 거쳐 Postrouting체인을 향하는 체인

리눅스를 나가는 패킷들이 들어가는 체인각각의 chain 에 rule 을 추가하면아래에서부터 하나씩 추가됨

iptables [ table ] [ action ] [ chain ] [ pattern ] [ target ]

- 기본 문법Iptables – Filter Table

[table] : 크게 nat 와 filter 로 나누며 , 기본값일 filter 이므로 filter 인 경우에는 생략[action] : 전체 사슬에 대한 정책을 지정에 (-A, -L, -D, -F) 대문자 옵션 사용[chain ] : 일반적인 필터링에 속하는 INPUT, OUTPUT, FORWARD 가 있으며 , nat 테이블에는 POST ROUTING, PREROUTING, OUTPUT 이 있음[pattern]: 세부규칙을 지정하는 것으로 소문자 옵션 (-s, -p, -d) 사용[target] : 정책을 지정하는 것으로 DROP, ACCEPT, LOG 등이 해당

- iptables 의 정책 : 패킷을 어떻게 처리할 것인지를 결정- 패킷의 처리는 크게 Deny 할 것이냐 Accept 할 것이냐 두 가지- 세부적으로는 ACCEPT, DENY, DROP 으로 관리- 기본정책

ACCEPT 패킷을 허용하는 옵션DENY 패킷을 허용하지 않는다는 메시지를 보내면서 거부 사슬 전체정책설정 (-P) 에서는 사용할 수 없음DROP 패킷을 완전히 무시

QUEUE 패킷을 추가적으로 처리하기 위해 사용자 영역으로 전송하도록 설정

Iptables – Policy

Iptables – Chain 사용 - iptables 는 조작하는 방법은 크게 두 가지- 전체사슬에 대한 조작

- 사슬 내부의 규칙에 대한 조작

-N 새로운 체인을 만든다 .-X 비어있는 사슬을 제거 (3 개의 기본 사슬은 제거할 수 없음 )-P 체인의 정책을 설정한다 .-L 현재 사슬의 규칙을 나열한다 .-F 사슬으로부터 규칙을 제거한다 .-Z 사슬내의 모든 규칙들의 패킷과 바이트의 카운트를 0 으로 만듦 -E 체인의 이름을 변경

-A 사슬에 새로운 규칙을 추가 , 해당 맨 마지막 붙음-I 사슬에 규칙을 맨 첫 부분에 삽입 , 또는 특정 포지션-R 사슬의 규칙을 교환-D 사슬의 규칙을 제거

-s 발신지 ('-s', '--source', '--src') 를 가리킴-d 도착지 ('-d', '--destination', '--dst') 를 가리킴-j 특정한 정책 (ACCEPT, DROP, DENY, REDIRECT 등 ) 설정! 'not‘ 의 의미-p 프로토콜을 지시할 때 사용

-i

패킷이 들어오는 인터페이스를 지정하는데 사용 (INPUT 과 FORWARD 사슬에 사용 ) * -t 가 nat 이면 PREROUTING 에서만 지정가능 * interface 명 앞에 "!" 추가 : 그 장치는 제외한다는 의미 . * interface 명 뒤에 "+“( 기본 ) 추가 : 그 이름으로 시작하는 모든 장치 를 의미

-o패킷이 나가는 네트워크장치를 지정하는데 사용 (OUTPUT, FORWARD 사슬에 사용 ) * -t nat 이면 POSTROUTING 에서만 지정 가능 ("!" 과 "+" 은 -i 와 동일 )

-t table 선택 (filter(default), nat, mangle 중 선택 )-f 커서 패킷을 여러 개로 나누어서 분절해서 여러 개의 패킷으로 전달할 때 사용-c 명령을 사용하는 동안 INSERT(-I), APPEND(-A), REPLACE(-R)규칙의 패킷과 바이트의 카운터 초기화

Iptables – 세부옵션

Iptables – 확장옵션 - p 옵션들이 세부적인 사항들을 설정할 수 있도록 추가 옵션 제공 예 ) iptables -A INPUT --protocol tcp --tcp-flag ALL SYN, ACK -j DENY 모든 flag 들이 검사되지만 SYN 과 ACK 만 거부로 설정- TCP 는 두 시스템간의 접속을 위해서 3-way handshaking 행함 접속 시도 패킷만 불가능하게 만듦으로써 접속이나 요청 등을 거부 예 ) -p tcp -s 192.168.1.3 --syn 192.168.1.3 으로부터 오는 SYN 패킷

TCP 확장

--source-port 발신지에서의 하나 , 포트범위 지정( 포트이름 또는 숫자 , 범위를 표시 : '-' 사용 )

--sport --source-port 와 동일--destination-port 도착지 포트 지정--dport --destination-port 와 동일--tcp-flags

tcp 에서 발생하는 flag 를 지정하는 옵션(첫 번째 것 : 검사하고자 하는 지시자 리스트 , 두 번째 : 설정될 것 지정 )

--syn, --rst, --ack --tcp-flags SYN, RST, ACK 의 줄임 (! 선행 가능 )

--tcp-option 숫자 숫자와 tcp 옵션이 같은 경우의 패킷을 검사UDP 확장 -p udp(--protocol udp) --source-port(--sport), --destination-port(-dport)

ICMP 확장 -p icmp(--protocol icmp) --icmp-type 만 추가옵션으로 지원

Iptables – rule 최적화

Iptables – rule 확장

NAT 의 개념- 출발지나 목적지의 주소 변환- IP 개수의 부족을 메우기 위해 개발

- 투명성 , 편의성 , 보안성- Masquerading, Port Forwarding, Transparent Proxing

- 변환 방식 2 가지 * 단순히 주소만 바꾸는 것 공인 IP 를 몇 개 가지고 있고 , 사설 IP 와 공인 IP 주소가 1:1 로 Mapping

* 주소와 함께 포트도 바꾸는 것 공인 IP 를 하나 가지고 , 하나의 외부 연결이 하나의 사설 호스트와 연결

- 출발지 NAT : Masquerading- 목적지 NAT : Port Forwarding, Transparent Proxy

NAT 의 개념- NAT 의 장점 * 공인 IP 하나를 공유 사용함으로써 , IP 사용 증가의 고갈 해결 * 패킷이 네트워크 사이에서 투명하게 전송됨 * Client/Server 서비스들은 별다른 조작 없이 사용 가능 * 인터넷 사용시 사설 IP 와 공인 IP 를 수동으로 바꾸지 않아도 됨 * NAT 를 사용하는 내부 호스트는 외부에서 탐색할 수 없으므로 보안성 뛰어남- NAT 의 단점 및 한계점 * 네트워크 효율 저하 + NAT 장비에 처리 집중으로 인한 Overload + 패킷 수정 , Defragmentation 하는 과정에서 NAT 장비는 부담 * NAT 장비가 실패했을 경우 재시도 불가능 * APP. 에서 정의하는 방식에 따라 NAT 장치에서 따로 지원해야 함 ( 패킷이 수정되지 않고 목적지까지 도달한다는 기존 인터넷 상식을 깨었기 때문 )

* NAT 를 행할 수 있는 호스트 수가 한정

NAT Table

- ip - ip 주소를 바꾸는 테이블이며 기본으로 주소를 바꾸는 테이블이며 기본으로 33 가지의 체인 존재가지의 체인 존재

POSTROUTING routing 되어 밖으로 나가려는 packet

PREROUTING routing 하기 전에 방금 들어온 packet

OUTPUT 내부에서 밖으로 내보내는 packet

NAT 의 설정 시작점 NAT

(SNAT)- 첫 패킷의 시작 주소 변경- 들어오는 접속을 변경- 항상 라우팅 후 , 패킷이 밖으로 나가기 직전에 이루어짐

목적지 NAT(DNAT)

- 첫 패킷의 목적지 주소 변경- 접속이 어디를 향하는지 변경- 항상 라우팅 전 , 패킷이 안팎으로 전송 시 이루어짐

NAT 의 설정 - SNAT- '-j SNAT'- '-j SNAT' 를 사용함으로 지정를 사용함으로 지정- '--to-source' - '--to-source' 옵션으로 옵션으로 IP IP 주소주소 , IP , IP 주소의 범위주소의 범위 , , 포트포트 , , 포트의 범위 지정포트의 범위 지정- POSTROUTING- POSTROUTING 에서 나가는 에서 나가는 Source Address Source Address 변경변경ex)ex)## ## 시작점 주소를 시작점 주소를 211.253.39.1 211.253.39.1 로 바꾸기로 바꾸기# iptables # iptables -t nat-t nat -A -A POSTROUTINGPOSTROUTING -o eth0 -o eth0 -j SNAT-j SNAT --to 211.253.39.1 --to 211.253.39.1

## ## 시작점 주소를 시작점 주소를 211.253.39.1 211.253.39.1 에서 에서 211.253.39.125 211.253.39.125 로 바꾸기로 바꾸기# iptables # iptables -t nat-t nat -A -A POSTROUTINGPOSTROUTING -o eth0 -o eth0 -j SNAT-j SNAT --to 211.253.39.1-211.253.39.125--to 211.253.39.1-211.253.39.125

NAT 의 설정 - DNAT- - 패킷의 시작점패킷의 시작점 ('-s', '--source'), ('-s', '--source'), 목적지 목적지 ('-d', '--destination')('-d', '--destination') 을 지정을 지정- - 이 옵션 뒤에는 하나의 이 옵션 뒤에는 하나의 IP IP 주소나 도메인 이름 이나 네트워크 주소가 붙음주소나 도메인 이름 이나 네트워크 주소가 붙음ex) ex) 목적지 주소가 목적지 주소가 211.253.39.4211.253.39.4 의 의 8080 포트를 포트를 1.2.3.41.2.3.4 의 의 80808080 포트로 바꾸기포트로 바꾸기#iptables #iptables -t nat-t nat -A -A PREROUTINGPREROUTING -p tcp -d 211.253.39.4 --dport 80 -p tcp -d 211.253.39.4 --dport 80 -j -j DNATDNAT --to 1.2.3.4:8080 --to 1.2.3.4:8080

## ## 들어오는 들어오는 80 80 포트의 웹 정보를 포트의 웹 정보를 squid (squid ( 투명한투명한 ) ) 프록시로 보내기프록시로 보내기# iptables -t nat -A # iptables -t nat -A PREROUTINGPREROUTING -i eth1 -p tcp --dport 80 -i eth1 -p tcp --dport 80 -j -j REDIRECTREDIRECT --to-port 3128 --to-port 3128

MANGLE Table - - 성능 향샹을 위한 성능 향샹을 위한 TOSTOS 를 설정를 설정- - 매우 고급적이 내용이므로 확실하게 이해하지 않는경우 그대로 둠매우 고급적이 내용이므로 확실하게 이해하지 않는경우 그대로 둠- - 잘못 설정할 경우 네트워크에 심각한 상황 초래잘못 설정할 경우 네트워크에 심각한 상황 초래

- TOS- TOS 코드코드

이름 CODE [HEXCODE] 설명Minimize-Delay 16 [0x10] 최소지연Maximize-Throughput 8 [0x08] 최대 전송률Maximize-Reliability 4 [0x04] 최대 안정성Minimize-Cost 2 [0x02] 최소 경로Normal-service 0 [0x00] 일반서비스

MANGLE Table – 실질적인 예- INPUT - INPUT 체인체인

# iptables -t mangle -A # iptables -t mangle -A INPUTINPUT -p tcp --dport 22 -j -p tcp --dport 22 -j TOSTOS --set-tos 0x10 --set-tos 0x10 # ssh# ssh 를 최소지연를 최소지연

# iptables -t mangle -A # iptables -t mangle -A INPUTINPUT -p tcp --dport 23 -j -p tcp --dport 23 -j TOSTOS --set-tos 0x10 --set-tos 0x10 # telnet# telnet 을 최소지연을 최소지연

# iptables -t mangle -A # iptables -t mangle -A INPUTINPUT -p tcp --dport 21 -j -p tcp --dport 21 -j TOSTOS --set-tos 0x10 --set-tos 0x10 # ftp # ftp 커맨드 전송포트를 최소지연커맨드 전송포트를 최소지연

# iptables -t mangle -A # iptables -t mangle -A INPUTINPUT -p tcp --dport 20 -j -p tcp --dport 20 -j TOSTOS --set-tos 0x08 --set-tos 0x08 # ftp-data# ftp-data 전송포트를 최대 전송률 유지전송포트를 최대 전송률 유지

- OUTPUT - OUTPUT 체인체인

# iptables -t mangle -A # iptables -t mangle -A OUTPUTOUTPUT -p tcp --dport 22 -j -p tcp --dport 22 -j TOSTOS --set-tox 0x10 --set-tox 0x10 # ssh# ssh 를 최소지연를 최소지연

# iptables -t mangle -A # iptables -t mangle -A OUTPUTOUTPUT -p tcp --dport 23 -j -p tcp --dport 23 -j TOSTOS --set-tox 0x10 --set-tox 0x10 # telnet# telnet 을 최소지연을 최소지연

# iptables -t mangle -A # iptables -t mangle -A OUTPUTOUTPUT -p tcp --dport 21 -j -p tcp --dport 21 -j TOSTOS --set-tox 0x10 --set-tox 0x10 # ftp # ftp 커맨드 전송포트를 최소지연커맨드 전송포트를 최소지연

# iptables -t mangle -A # iptables -t mangle -A OUTPUTOUTPUT -p tcp --dport 20 -j -p tcp --dport 20 -j TOSTOS --set-tox 0x08 --set-tox 0x08 # ftp-data# ftp-data 전송포트를 최대 전송률을 유지전송포트를 최대 전송률을 유지

MANGLE Table – 실질적인 예

Iptables syntax- 개요- 실제 사용자가 iptables 를 사용하기 위한 방법- 기본 테이블에 기본 체인이 있음filter table 속에 * INPUT * OUTPUT * FORWARD

nat table 속에 * PREROUTING * OUTPUT * POSTROUTING

mangle table 속에 * PREROUTING * OUTPUT * INPUT * FORWARD * POSTROUTING

이 체인들이 어떤 위치에서 어떤 역할을 하는지 숙지하고 구문을 익히는 것이 실제로 적용하는 데 도움이 됨

Iptables syntax- 명령- -t, --table table_name * table 을 선택하는 명령이 iptables 에서 가장 먼저 나옴 * 항상 ‘ iptables -t filter [some other commands]’ 형태로 사용 * 기본 테이블은 filter, nat, mangle (-t 옵션을 사용하지 않으면 default 인 filter 테이블로 동작하게 됨 - 일반적 )

- iptables 의 1 차적 명령 * -N, --new-chain chain : 지정이름으로 새로운 체인 생성 * -X, --delete-chain [chain] : 지정한 이름의 체인 삭제 + 지정한 체인 내부에 규칙이 존재하면 삭제 안됨 . + 체인 이름이 생략되면 , 모든 사용자 정의 체인 삭제

* -L, --list [chain] : 지정한 이름의 체인에 속한 모든 규칙을 출력 + 체인 이름이 생략되면 , 모든 체인에 속한 규칙을 출력 + -L(-n, --numeric) : 모든 정보를 숫자로 출력 + -L(-v, --verbose) : 패킷이나 byte-counter 등의 자세한 정보를 출력 + -L(-x, --exact) : counter 를 반올림하지 않고 출력 + -L -line-number : 규칙 번호를 출력

* -E, --rename-chain old-chain new-chain : old 이름을 new 이름으로 변경 ( 체인안에 규칙 있어도 바뀜 , 체인의 구조와 상관없이 이름만 변경 ) * -F, --flush [chain] : 선택한 체인의 규칙을 모두 삭제 ( 체인 이름을 선택하지 않으면 모든 테이블의 모든 규칙을 삭제 ) * -Z, --zero [chain] : 패킷과 byte-counter 를 reset(reset 전의 정보를 미리 출력 ) * -P, --policy chain target : 기본 체인에만 적용할 수 있는 명령어로 , 체인의 기본 정책을 target 에 지정한 것으로 변경 ( 기본 정책 ACCEPT, DROP) * -h, --help : 간략한 도움말

Iptables syntax- 명령

Iptables syntax- 명령- 체인 내부의 규칙에 대한 명령어 * -A, --append chain rule-specification : 체인의 끝에 규칙을 추가하는 명령 * -D, --delete chain rule-specification : rule-specification 의 규칙 삭제 * -D, --delete chain rulenum : rulenum 의 번호 규칙 삭제 (1 번이 첫 번째 ) * -I, --insert chain [rulenum] rule-specification : rulenum 순서에 규칙 삽입 * -R, --replace chain rulenum rule-specification : rulenum 순서에 있는 것을 rule-specification 으로 교체

- rule-specification 을 구성하기 위한 Parameter * -p, --protocol [!] protocol : 체크할 패킷이나 규칙의 프로토콜을 지정 + protocol 종류 : icmp, tcp, udp, 및 all, 그리고 번호도 가능 1, 6, 17 * -s, --source [!] address[/mask] : 출발주소 지정 * -d, --destination [!] address[/mask] : 목적지주소 지정 * -j, --jump target : 지정한 target 으로 jump, 조건이 있다면 해당할 때 jump * -i, --in-interface [!] name : 외부에서 INPUT, FORWARD, PREROUTING 체인으로 들어오는 패킷의 인터페이스 지정 + 끝에 ‘ +’를 붙이면 wild-card 로 사용 예 ) eth+ * -o, --out-interface [!] name : 내부에서 FORWARD, OUTPUT, PREROUTING 체인으로 나갈 패킷의 인터페이스를 지정 + 끝에 ‘ +’를 붙이면 wild-card 로 사용 예 ) eth+ * [!] -f, --fragment : 여러 개로 분절된 패킷이 들어올 경우 프로토콜 적용 같은 것을 사용할 수 없어 -f 를 사용해 두 번째 이상의 패킷 분절만 적용할 수 있는 경우 제공 , !을 붙이면 첫번째 분절이나 분절이 아닌 곳에 적용 * -c, --set-counters PKTS BYTES : 이것은 관리자가 APPEND, INSERT, REPLACE 하는 동안 규칙의 패킷이나 byte counter 를 초기화 하는 것 가능 * --modprobe=<command> : 체인에 규칙을 추가할 때 이 옵션을 사용해 지정한 command 로 모듈을 로드 가능

Iptables syntax- 명령

iptables -t filter [some other commands]- iptables 의 1 차적 명령 * -N, --new-chain chain * -X, --delete-chain [chain] * -L, --list [chain] * -E, --rename-chain old-c new-c * -F, --flush [chain] * -Z, --zero [chain] * -P, --policy chain target * -h, --help

- 체인 내부의 규칙에 대한 명령어 * -A, --append chain rule-spec * -D, --delete chain rule-spec * -I, --insert chain [rulenum] rule-spec * -R, --replace chain rulenum rule-spec

- rule-specification 을 구성하기 위한 Parameter * -p, --protocol [!] protocol * -s, --source [!] address[/mask] * -d, --destination [!] address[/mask] * -j, --jump target * -i, --in-interface [!] name * -o, --out-interface [!] name * [!] -f, --fragment * -c, --set-counters PKTS BYTES * --modprobe=<command>

Iptables syntax- 정리

Iptables syntax- 명령- iptables 추가 기능 확장

* iptables 는 추가로 기능들을 사용할 수 있게하기 위해 확장성을 지님

* iptables 는 커널 모듈과의 연동을 통해 필요한 만큼 확장 가능 , 사용자가 필요하면 모듈을 제작해서 사용 가능

* 커널 확장 모듈 : /lib/modules, iptables 확장 모듈 : /lib/iptables

* 확장은 사용될 때 동적으로 loading됨

* iptables 에서 확장의 두가지 측면 : match, target

Iptables syntax- 명령- iptables 의 match 확장 * match 는 확장을 사용하기 위해 모듈을 로드하는 방법이 두가지가 있는데 , 프로토콜을 위한 ‘ -p’를 사용할 경우에 해당 프로토콜을 위한 확장이 묵시적 으로 loading * 확실하게 명시하기 위해서 -m, --match 를 사용해서 확장을 로드 가능

* -p tcp 이후에 쓰이는 확장 + --source-port [!] port[:port] : 출발지 포트 번호나 번호 범위를 지정 확장 ex) 1:10241024개 포트 지정 , ! 지정한 이외 선택 , --sport 는 동일 + --destination-port [!] port[:port] : 목적지 포트 번호나 범위를 지정 확장 ex) 1:10241024개 포트 지정 , ! 지정한 이외 선택 , --dport 는 동일 + --tcp-flags [!] mask comp : 특정한 tcp flag 검사 ^ mask 와 comp 에 들어갈 수 있는 flag : SYN ACK FIN RST URG PSH ^ 하나 또는 여러 개 (comma 로 구분 ) ALL or NONE 사용 가능 ^ mask 에 지정된 flag 들이 검사되지만 , comp 에 지정된 flag 만 설정 + [!] -syn: “--tcp-flags SYN,RST,ACK” 과 동일한 역할 SYN flag 가 첫 번째 요청에서 설정되어야 함을 나타냄 + --tcp-option [!] number : 제대로 된 크기의 패킷을 받기 위해 사용 , tcp option 의 번호와 number 의 번호가 같을 경우만 매치 , 그 외의 경우는 DROP. + --mss value[:value] : tcp SYN, SYN/ACK 패킷과 MSS 를 매치 최대 패킷 크기를 제어하는데 사용

* -p udp 이후에 쓰이는 확장 + --source-port [!] port[:port] : tcp 와 동일 + --destination-port [!] port[:port] : tcp 와 동일

* icmp 에 사용되는 확장 + --icmp-type [!] typename : 지정한 typename 의 icmp type 을 매치 (iptable –p icmp –h icmp typename 출력 ) ^ echo-reply(0) ^ destination-unreachable(3) network[,host, protocol, port]-unreachable, network[,host]-unkown … ^ sourcequench(4) ^ redirect(5) network[, host, TOS-network, TOS-host]-redirect ^ echo-request(8-ping) ^ time-exceeded(10) ttl-zero-during-transit, ttl-zero-during-reassembly ^ parameter-problem(11) ip-header-bad, required-option-missing

Iptables syntax- 명령

Iptables syntax- 명령- iptables match 확장 * (-m, --match) limit 에 사용되는 확장 옵션 + --limit rate : rate 에 지정된 시간당 패킷 수를 넘지 않는 패킷에 매치 + --limit-burst number : limit 된 시간동안 number 에서 정의된 개수만큼만 매치 ^ 기본 number 는 5이므로 처음 5개의 패킷을 다 매치시켰을 때 limit rate 가 기본값인 3/hour 이라면 20 분 후에 다시 패킷을 매치 시킬 수 있음 ^ 이것은 로그를 기록할 때 사용될 수 있는데 , 많은 패킷이 오더라도 모든 패킷을 로그하지는 않는 방식으로 로그 기록을 남길 수 있음

* -m state 에 사용되는 확장 옵션 + --state state : 이 확장을 이용해서 현재 패킷의 상태에 따라 처리 가능 ^ state 에 들어갈 수 있는 것은 NEW, EXSTABLISHED, RELATED, INVALID ^ NEW 패킷 : 패킷을 새로 연결을 생성하는 패킷 ^ EXSTABLISHED 패킷 : 기존의 연결에 속해 있는 패킷 (응답을 받은 패킷 ) ^ RELATED 패킷 : 기존의 연결에 속한 것은 아니지만 기존의 연결과 연관이 있는 ICMP 에러 메시지 같은 패킷을 말함 ^ INVALID 패킷 : 앞의 세 가지 상태로 인식할 수 없는 패킷

Iptables syntax- 명령* -m conntrack 에 사용되는 확장 옵션 (-m state 보다 향상된 성능 ) + --ctstate state : 기본적으로 – m state --state 와 같다고 보면 됨 ^ SNAT 와 DNAT flag 가 추가되어 있는데 , 원본 출발지 주소가 응답 목적지 주소와 다른 경우에 SNAT 상태로 보고 , 원본 목적지 주소가 응답 출발지 주소와 다를 때 DNAT 상태로 봄 + --proto proto : 프로토콜을 명시해 매칭 ( 이름 , 숫자 모두 가능 , -p 와 비슷 ) + --ctorigsrc [!] address[/mask] : 원본 출발지 주소로 매칭 . + --ctorigdst [!] address[/mask] : 원본 목적지 주소로 매칭

+ --ctreplsrc [!] address[/mask] : 응답 출발지 주소로 매칭 + --ctrepldst [!] address[/mask] : 응답 목적지 주소로 매칭

+ --ctstatus [NONE | EXPECTED | SEEN_REPLY | ASSURED][,…] : 내부의 연결 추적 상태에 따라서 매칭 + --ctexpire time[:time] : 남은 life-time 을 입력받은 시간 /범위와 비교해서 매칭 ( 시간 단위는 second)

mask 를 AND 하는 것은 기존과 같음

Iptables syntax- 명령* -m mac 에 사용되는 확장 옵션 + --mac-source [!] address : MAC 주소로 매치 ^ 주소의 형식은 ‘ XX:XX:XX:XX:XX:XX’ 같은 형식이여야함 ^ MAC 주소 매치인 만큼 당연히 PREROUTING, INPUT, FORWARDING 체인에서만 가능

* -m owner 에 사용되는 확장 옵션 + --uid-owner userid : 유효한 UID 의 프로세스가 생성한 패킷에 적용 + --gid-owner groupid : 유효한 GID 의 프로세스가 생성한 패킷에 적용 + --pid-owner processed : 지정한 PID 의 프로세스가 생성한 패킷에 적용 + --sid-owner sessionid : 주어진 session 그룹 내의 프로세스가 생성한 패킷에 적용 + --cmd-owner name : 지정된 이름의 command 로 생성된 프로세스가 생성한 패킷에 적용

* -m mark 에 사용되는 확장 옵션 + --mark value[/mask] : MARK target 에 의해 표시된 mark 값을 지정한 값과 매치 . mask 값을 지정했으면 mask 와 AND 한 값을 매치

Iptables syntax- 명령* -m multiport 에 사용되는 확장 옵션 (‘-p tcp’나 ‘ -p udp’와 꼭 함께 사용 ) + --source-ports port[,port[,port…]] : 최대 15개까지 출발지 포트를 나열 가능 ^ 주의할 점은 포트를 나열할 때 공백을 넣으면 안된다는 것과 , ‘-p tcp’나 ‘ -p udp’의 바로 뒤에 와야함 . ‘--dports’도 같은 역할함 ^ --ports port[,port[,port…]] : 만약 출발지와 목적지 포트가 같고 위에서 지정한 포트 중에 하나일 경우 적용

* -m tos 에 사용되는 확장 옵션 + --tos tos : IP 헤더에 있는 TOS 정보를 매치 Minimize-Delay(0x10), Maximize-Throughput(0x08), Maximize-Reliability(0x04), Minimize-Cost(0x02), Normal-Service(0x00)* -m unclean : 조작된 것 같거나 의심가는 패킷 매치 + 확장 옵션 없음

Iptables syntax- 명령- target 확장 * 기존으 ACCEPT 와 DROP 외에도 target 으로 활용할 수 있는 것은 많음

* 기본적으로 사용자가 만든 체인으로 jump 가능 + jump 는 어디로나 무한히 가능 , 하지만 jump 의 경로가 원형을 그리며 반복된다던지 하는 경우는 dead lock 이기 때문에 거부 + 여러 가지 기능들을 사용하기 위해 jump 의 확장 target 이 사용되기도 함

* 확장 target 에는 기본적으로 LOG 와 REJECT 가 있고 NAT 를 수행하는 것과 mangling 하는 것도 target 확장을 활용

* -j LOG 의 확장 옵션 + --log-level level : 로그 레벨을 지정 ^ /usr/include/sys/syslog.h 에 정의 ^ emerg(0), alert(1), crit(2), err(3), warn(4), notice(5), info(6), debug(7) + --log-prefix prefix : 로그 앞에 붙일 전치구를 지정 , 로그 구분에 도움 + --log-tcp-sequence : tcp 순서 번호를 로그로 남김 , 사용자들에게 보이게 되면 보안상의 문제점이 될 수 있으니 주의 + --log-tcp-options : TCP 패킷 헤더로부터의 옵션을 로그로 남김 + --log-ip-options : IP 패킷 헤더로부터의 옵션을 로그로 남김

Iptables syntax- 명령* -j REJECT 의 확장 옵션 REJECT 는 DROP 과 다르게 패킷을 폐기할 때 발신자에게 ICMP 에러 메시지 보냄 + --reject-with type : 사용할 응답 패킷을 변경 ^ type 에 들어갈 값으로는 icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable( 기본 값 ), icmp-proto-unreachable, icmp-net-prohibited, icmp-host-prohibited 등이 가능 , type 으로 tcp-reset 을 사용 (tcp 만 )

* -j TCPMSS 를 사용할 때의 확장 옵션 TCPMSS 는 연결에 대한 최대 크기를 체어할 수 있도록 , TCP SYN 패킷의 MSS 값을 변경하거나 검사하게 하는 기능 수행 + --set-mss value : 명시적으로 mss 옵션 값을 지정된 값으로 설정 + --clamp-mss-to-pmtu : MSS 값을 자동적으로 고정 (path_MTU - 40) 즉 , 자동으로 최대 크기에 대한 문제점에서 멀어지게 함

Iptables syntax- 명령*** -t nat 로 지정되는 nat 테이블에 사용되는 target 확장 ( 여기 뒤 부분에서는 꼭 -t nat 로 지정해 주어야만 nat 테이블 사용 )

* -j SNAT 에 사용되는 확장 옵션 + nat 테이블의 POSTROUTING 체인에서만 사용 가능 + --to-source ipaddr[-ipaddr][:port-port] ^ 지정한 IP 주소와 포트 범위에서 가능한 것 중 하나를 골라 출발지 주소로 매핑 ^ 하나 이상의 사용 가능한 주소와 포트를 지정하려면 tcp 나 udp 를 사용 ^ --to-source 를 여러 번 사용해서 여러 개으 주소를 지정 가능 ^ 간단한 라운드로빈 알고리즘 사용 ^ -to 라고만 써도 같은 작용* -j DNAT 에 사용되는 확장 옵션 + nat 테이블의 PREROUTING 과 OUTPUT 체인에서만 사용 가능 + --to-destination ipaddr[-ipaddr][:port-port] ^ 지정한 IP 주소와 포트 범위에서 가능한 것 중 하나를 골라 목적지 주소로 매핑 ^ 하나 이상의 사용 가능한 주소와 포트를 지정하려면 tcp 나 udp 를 사용 ^ 포트를 지정하지 않으면 포트는 변경되지 않음 ^ --to- destination 를 여러 번 사용해서 여러 개으 주소를 지정 가능 ^ 간단한 라운드로빈 알고리즘 사용하여 부하 분산 가능 ^ --to 라고만 써도 같은 작용

Iptables syntax- 명령* -j MASQUERADE 에 사용되는 확장 옵션 + nat 테이블의 POSTROUTING 체인에만 사용 + --to-ports port[-port] ^ 지정한 포트 , 포트 범위에서 출발지 포트를 선택해서 마스쿼레이딩을 함 ^ SNAT 와 다른 점은 IP 가 동적으로 할당된다는 것 . 각각의 새로운 연결마다 IP 주소가 다르게 지정 ^ POSTRUTING 체인에서 MASQUERADING 을 하기 위해 out-interface 를 지정 해 주어야하고 , 포트를 사용하기 때문에 tcp 나 udp 를 사용하여야함

* -j REDIRECT 에 사용되는 확장 옵션 + nat 테이블의 PREROUTING 과 OUTPUT 체인 , 또는 이 체인들에서 부른 사용자 정의 체인들에서 부른 사용자 정의 체인에만 사용 + --to-ports port[-port] ^ REDIRECTION 을 위한 포트나 포트 범위를 입력 받아서 포트 방향 재설정 ^ 이것은 특별한 형태으 DNAT 로 패킷은 로컬 호스트의 한 포트로 방향 재설정 ^ 들어오는 패킷은 들어오는 인터페이스의 INPUT 체인으로 방향 재설정되고 , 로컬에서 생성된 패킷은 로컬 호스트의 loopback 인터페이스의 포트로 방향 재설정 ^ PREROUTING 체인에서 방향 재설정을 하기 위해서 in-interface 를 지정해 주어야 하고 , OUTPUT 체인에서 방향 재설정을 하기 위해서 out-interface 를 지정해 주어야 함 .

Iptables syntax- 명령*** 이후 나오는 MARK 와 TOS 는 mangle 테이블의 체인에서 작동하는 target 이므로 – t mangle 을 꼭 해주어야 함* -j MARK 에 사용되는 target 확장 옵션 + --set-mark mark ^ 패킷에 Netfilter mark 값을 설정해중 ( 이것은 filter 테이블의 match 에서 활용 )

* -j TOS 에 사용되는 target 확장 옵션 + --set-tos tos ^ 패킷에 tos 값을 설정 가능 , 이것은 filter 테이블의 match 확장에서 활용되고 tos 값에 대한 것은 match 확장에서 언급됨

Iptables syntax- 정리- iptables 의 match 확장 * -p tcp 이후에 쓰이는 확장 + --source-port [!] port[:port] + --destination-port [!] port[:port] + --tcp-flags [!] mask comp + [!] -syn + --tcp-option [!] number + --mss value[:value] * -p udp 이후에 쓰이는 확장 + --source-port [!] port[:port] + --destination-port [!] port[:port] * icmp 에 사용되는 확장 + --icmp-type [!] typename

- iptables match 확장 * (-m, --match) limit 에 사용되는 확장 옵션 + --limit rate + --limit-burst number * -m state 에 사용되는 확장 옵션 + --state state

* -m conntrack 에 사용되는 확장 옵션 + --ctstate state + --proto proto + --ctorigsrc [!] address[/mask] + --ctorigdst [!] address[/mask] + --ctreplsrc [!] address[/mask] + --ctrepldst [!] address[/mask] + --ctstatus [NONE | EXPECTED + --ctexpire time[:time]* -m mac 에 사용되는 확장 옵션 + --mac-source [!] address * -m owner 에 사용되는 확장 옵션 + --uid-owner userid + --gid-owner groupid + --pid-owner processed + --sid-owner sessionid + --cmd-owner name* -m mark 에 사용되는 확장 옵션 + --mark value[/mask]

* -m multiport 에 사용되는 확장 옵션 + --source-ports port[,port[,port…]] * -m tos 에 사용되는 확장 옵션 + --tos tos * -m unclean

- target 확장* -j LOG 의 확장 옵션 + --log-level level + --log-prefix prefix + --log-tcp-sequence + --log-tcp-options + --log-ip-options

* -j REJECT 의 확장 옵션 + --reject-with type* -j TCPMSS 를 사용할 때의 확장 옵션 + --set-mss value + --clamp-mss-to-pmtu

* -j SNAT 에 사용되는 확장 옵션 + --to-source ipaddr[-ipaddr][:port-port] * -j DNAT 에 사용되는 확장 옵션 + --to-destination ipaddr[-ipaddr][:port-port]

* -j MASQUERADE 에 사용되는 확장 옵션 + --to-ports port[-port] * -j REDIRECT 에 사용되는 확장 옵션 + --to-ports port[-port]

* -j MARK 에 사용되는 target 확장 옵션 + --set-mark mark * -j TOS 에 사용되는 target 확장 옵션 + --set-tos tos

Iptables syntax- 정리

Iptables 활용- iptables 를 사용해서 실제로 보안 설정 일반적으로 참고할 수 있는 기본적인 방화벽 설정을 통해 사용- 여기 예제는 기본적으로 DROP- 주의 : 명령어를 리모트에서 하나씩 실행하는 것은 연결을 잃을 수 있으므로 반드시 콘솔에서 테스트하거나 스크립트를 만들어 사용- 체인의 규칙은 위에서부터 순서대로 적용하기 때문에 순서에 신경을 써야함

# iptables –A INPUT –s 192.168.1.0/24 –j DROP# iptables –A INPUT –s 192.168.1.32 –j ACCEPT

# iptables –A INPUT –s 192.168.1.32 –j ACCEPT# iptables –A INPUT –s 192.168.1.0/24 –j DROP

- 두 경우는 매우 큰 차이가 있음- 첫 번째 박스의 두 번째 줄의 target 을 ACCEPT준 명령이 아무런 소용이 없음- ACCEPT 줄이 두 번째 박스처럼 적용이 되게 할려면 DROP 앞에 선행되어야 함

script file 에 대해…- 나중에…