Download presentation
Presentation is loading. Please wait.
1
iptables & netfilter 개념도
memory iptables Rule parsing, read, write user level kernel level Rule Read & Write ip_table filter mangle nat rules
2
Netfilter란 무엇인가? 커널의 일부분은 각 프로토콜에 대하여 다른 hook을 감시하도록 등록 패킷 프로토콜 스택의
표준 Berkeley Socket Interface의 외부에 존재하는 패킷 mangling에 대한 프레임워크 프레임워크는 크게 4부분으로 구성, 각각의 프로토콜은 hooks라는 것을 정의 - 각각의 프로토콜은 패킷과 Hook Number를 이용하여 넷필터 프레임워크를 호출 커널의 일부분은 각 프로토콜에 대하여 다른 hook을 감시하도록 등록 : 패킷이 넷필터 프레임워크를 통과할 때, 어떤 프로토콜과 훅을 등록했는지 확인 : 넷필터 훅이 호출되는 경우, 각각의 모듈은 우선순위에 따라 호출 : 등록 확인 후 등록된 순서대로 패킷 검사 후 패킷 프로토콜 스택의 packet’s traversal에 있는 잘 정의된 포인터 Routing, Forward, Local-IN, Local-OUT Accept Drop Stolen Queue 사용자 공간으로 보내기 위해 제어 (비동기 처리)
3
Netfilter란 무엇인가? Netfilter framework Netfilter/iptables 패킷
- 리눅스 커널 2.4이후 지원되는 F/W mechanism - IPFW ipfwadm ipchains계보를 잇는 패킷 처리에 대한 실질적 기반 구조 Netfilter framework 시스템에 들어오는 모든 패킷을 분석해서 사용자의 뜻대로 처리(필터링, 변조)할 수 있고 기록할 수 있는 지능적 시스템 Kernel module Filtering Mangle (사용자 의도 대로 처리) Hooking (단지 커널모듈 호출) (시스템으로 유입되는) 패킷 분석 기록
4
Netfilter 패킷 경로도 HOOK Name 무결성 점검 [1]PRE [ROUTE] [3]FOR~ [4]POST 패킷 이상
Other Interface 무결성 점검 [1]PRE [ROUTE] [3]FOR~ [4]POST 패킷 이상 유무점검 라우팅 결정 소스 IP IP 옵션 확인 [ROUTE] 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 [2] IN [5] OUT 시스템에 패킷 진입 후부터 패킷의 진로에 대한 처분을 결정하는 사슬고리 구조 넷필터 훅들에 규칙을 추가(iptables)해서 패킷 흐름 제어 - 패킷이 들어오면 해당 프로토콜에 의한 후킹이 발생해서 넷필터 프레임워크(커널 모듈)을 호출하여 패킷 진로 결정
5
Netfilter 패킷 경로도와 Hooking
[PRE] [FOR- WARD] [POST] [ROUTE] Conntrack Mangle Mangle Mangle SNAT Filter DNAT Conntrack [ROUTE] Conntrack [IN] [OUT] Conntrack Mangle Mangle DNAT (Proxy) Filter Filter (Local Processes) Hooking Call에 의한 모듈의 작동 1.Packet Filtering filter table 2. NAT : 네트워크 주소 변환 NAT table (IP Masquerade, Port Forward, Redirection) 3. Packet Mangling : 패킷에 대한 변조 mangle table 4. Connection Tracking : 연결 추적 conntrack table
6
Netfilter 패킷 경로도와 Hooking
2. 패킷 도착 감지 및 통보만 담당 한 지점의 길목 역할 지정 커널 모듈 실질적 패킷 처리 호출 결과통보 Hooking에 의한 1차적 패킷처분 - NF_ACCEPT: 평소처럼 진행 - NF_DROP : 패킷 폐기 - NF_STOLEN: 패킷 접수 - NF_QUEUE : 사용자 큐에 삽입(사용자영역에서 처리) - NF_REPEAT: 같은 훅을 한 번 더 후킹
7
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에 관련해서 작동
8
Packet Filtering의 개념 - Packet Filtering의 이득(위협 보호)
* 불법적인 Port Scan과 Network Mapping * Source Address Spoofing : 발신지 주소 속이기 * DOS : 몇몇 종류의 서비스 거부 공격 * Misconfiguration or Mistakes : 내부의 실수로 인한 보안 구멍 - Packet Filtering을 위한 기본적인 보안정책 * 보안성 유리 정책 허가 패킷 제외, 모두 거부 “허가받은 패킷을 제외한 보든 것을 거부하겠다.” * 사용자 유리 정책 거부 패킷 제외, 모두 허가 “거부된 패킷을 제외한 모든 것을 허가하겠다.”
9
Packet Filtering의 개념 - 패킷을 필터링하는 종류 * Incoming Packet Filtering
+ Remote Src Address Filtering Port + Local Dest Address Filtering * Outgoing Packet Filtering + Local Src Address Filtering Port + Remote Dest Address Filtering * 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를 받게 함 차단
11
Iptables 개요 - 리눅스 넷필터 기반구조 위에서 방화벽을 구축하는 관리자 도구
기능적 분리 단위를 모듈을 호출하는 방식으로 사용 - 가장 중요한 Table 기본 테이블, 삭제 안됨 * filter table : 패킷 필터링 * nat table : 네트워크 주소 변환 * mangle table : 패킷 변조 - 필요 시 table 추가 가능, table에서 table을 호출 가능(모듈간 상호협동성) + 이 table들을 기동하기 위한 모듈들은 table이 사용될 때에 동적 로딩 + 모듈은 넷필터의 훅과 iptables에 모두 등록
12
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들은 내부적으로 확장형이라고 부르고, 모듈로도 구성되어 있음)
13
Iptables 개요 - filter table의 target 확장형의 기능
* 기존의 처분(ACCEPT and DROP) 외에 REJECT라는 새로운 처분 가능 (REJECT는 에러 메세지를 발신지에 보냄) * target 확장형을 통해서 log 가능 방화벽의 필수 요소 * QUEUE를 이용해서 사용자 공간으로 패킷을 보낼 수 있음 사용자 공간에 패킷을 위한 처리가 없다면 그냥 DROP * RETURN으로 체인의 끝으로 점프시킬 수 있음 - filter table의 match 확장형의 기능 *
14
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를 두 번 수행
15
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가 패킷을 관리하게 함
16
Iptables – 기본구조 - Iptables의 변천 과정 1.1시리즈 (제 1세대) 2.0 시리즈 (1994년)
2.2 시리즈 (1998년) 2.4 시리즈 (1999년) ipfw ipfwadm ipchains iptables - iptables는 크게 3개의 테이블로 구분 Filter Table 필터링을 담당 NAT Table 네트워크의 주소를 변환할 때 사용 Mangle table 성능 향상을 위한 TOS를 설정
17
Iptables – Filter Table
- 기본 필터링은 논리적인 3개의 chains으로 구성 - 사용자가 정의하여 새로운 사슬도 생성 가능 - 기본 사슬의 이름은 반드시 대문자 리눅스를 향해 들어오는 패킷들이 거치는 체인 리눅스를 거쳐 Postrouting 체인을 향하는 체인 리눅스를 나가는 패킷들이 들어가는 체인 각각의 chain에 rule을 추가하면 아래에서부터 하나씩 추가됨
18
Iptables – Filter Table
- 기본 문법 iptables [ table ] [ action ] [ chain ] [ pattern ] [ target ] [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 등이 해당
19
Iptables – Policy - iptables의 정책 : 패킷을 어떻게 처리할 것인지를 결정
- 패킷의 처리는 크게 Deny할 것이냐 Accept할 것이냐 두 가지 - 세부적으로는 ACCEPT, DENY, DROP으로 관리 - 기본정책 ACCEPT 패킷을 허용하는 옵션 DENY 패킷을 허용하지 않는다는 메시지를 보내면서 거부 사슬 전체정책설정(-P)에서는 사용할 수 없음 DROP 패킷을 완전히 무시 QUEUE 패킷을 추가적으로 처리하기 위해 사용자 영역으로 전송하도록 설정
20
Iptables – Chain 사용 - iptables는 조작하는 방법은 크게 두 가지 - 전체사슬에 대한 조작 -N
새로운 체인을 만든다. -X 비어있는 사슬을 제거(3개의 기본 사슬은 제거할 수 없음) -P 체인의 정책을 설정한다. -L 현재 사슬의 규칙을 나열한다. -F 사슬으로부터 규칙을 제거한다. -Z 사슬내의 모든 규칙들의 패킷과 바이트의 카운트를 0으로 만듦 -E 체인의 이름을 변경 iptables -N test iptables -X test iptables -F forward iptables -P INPUT DROP; iptables -P OUTPUT ACCEPT; iptables -P FORWARD DROP iptables –L; iptables –L –n –v; iptables –L –n –vv iptables –Z INPUT iptables –E test scpark Iptables –I INPUT –s –p tcp –sport 51 –j ACCEPT Iptables –I INPUT 2 –s –p tcp –sport 51 –j ACCEPT Iptables –R FORWARD 2 –s –p tcp –sport 51 –j ACCEPT - 사슬 내부의 규칙에 대한 조작 -A 사슬에 새로운 규칙을 추가, 해당 맨 마지막 붙음 -I 사슬에 규칙을 맨 첫 부분에 삽입, 또는 특정 포지션 -R 사슬의 규칙을 교환 -D 사슬의 규칙을 제거
21
Iptables – 세부옵션 * interface명 앞에 "!" 추가 : 그 장치는 제외한다는 의미.
발신지('-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 –A INPUT –s –j DROP 에서 오는 모든 packet을 차단한다. # iptables –A INPUT –d –j DROP # iptables –A INPUT –p tcp –destination-port telnet –i ppp0 –j DROP
22
Iptables – 확장옵션 - p 옵션들이 세부적인 사항들을 설정할 수 있도록 추가 옵션 제공
예) iptables -A INPUT --protocol tcp --tcp-flag ALL SYN, ACK -j DENY 모든 flag들이 검사되지만 SYN과 ACK만 거부로 설정 - TCP는 두 시스템간의 접속을 위해서 3-way handshaking 행함 접속 시도 패킷만 불가능하게 만듦으로써 접속이나 요청 등을 거부 예) -p tcp -s syn 으로부터 오는 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 -A INPUT --protocol tcp --tcp-flag ALL SYN, ACK -j DENY 모든 flag들이 검사되지만 (여기서 ALL은 SYN, ACK, FIN, RST, URG, PSH와 같다.) SYN과 ACK만 거부로 설정된다 # iptables -A FORWARD -p tcp -s –syn –j DROP 특정한 곳으로부터 오는 접속 시도를 패킷만 불가능하게 만듦으로써 접속이나 요청 등을 거부
23
Iptables – rule 최적화
24
Iptables – rule 확장
26
NAT의 개념 - 출발지나 목적지의 주소 변환 - IP 개수의 부족을 메우기 위해 개발 - 투명성, 편의성, 보안성
- Masquerading, Port Forwarding, Transparent Proxing - 변환 방식 2가지 * 단순히 주소만 바꾸는 것 공인 IP를 몇 개 가지고 있고, 사설 IP와 공인 IP 주소가 1:1로 Mapping * 주소와 함께 포트도 바꾸는 것 공인IP를 하나 가지고, 하나의 외부 연결이 하나의 사설 호스트와 연결 - 출발지 NAT : Masquerading - 목적지 NAT : Port Forwarding, Transparent Proxy
27
NAT의 개념 - NAT의 장점 * 공인 IP 하나를 공유 사용함으로써, IP 사용 증가의 고갈 해결
* 패킷이 네트워크 사이에서 투명하게 전송됨 * Client/Server 서비스들은 별다른 조작 없이 사용 가능 * 인터넷 사용시 사설 IP와 공인 IP를 수동으로 바꾸지 않아도 됨 * NAT를 사용하는 내부 호스트는 외부에서 탐색할 수 없으므로 보안성 뛰어남 - NAT의 단점 및 한계점 * 네트워크 효율 저하 + NAT 장비에 처리 집중으로 인한 Overload + 패킷 수정, Defragmentation하는 과정에서 NAT 장비는 부담 * NAT 장비가 실패했을 경우 재시도 불가능 * APP.에서 정의하는 방식에 따라 NAT 장치에서 따로 지원해야 함 (패킷이 수정되지 않고 목적지까지 도달한다는 기존 인터넷 상식을 깨었기 때문) * NAT를 행할 수 있는 호스트 수가 한정
28
NAT Table - ip 주소를 바꾸는 테이블이며 기본으로 3가지의 체인 존재 POSTROUTING
routing 되어 밖으로 나가려는 packet PREROUTING routing 하기 전에 방금 들어온 packet OUTPUT 내부에서 밖으로 내보내는 packet
29
NAT의 설정 - 첫 패킷의 시작 주소 변경 시작점 NAT - 들어오는 접속을 변경 (SNAT)
- 항상 라우팅 후, 패킷이 밖으로 나가기 직전에 이루어짐 목적지 NAT (DNAT) - 첫 패킷의 목적지 주소 변경 - 접속이 어디를 향하는지 변경 - 항상 라우팅 전, 패킷이 안팎으로 전송 시 이루어짐
30
NAT의 설정 - SNAT - '-j SNAT'를 사용함으로 지정
- '--to-source' 옵션으로 IP 주소, IP 주소의 범위, 포트, 포트의 범위 지정 - POSTROUTING에서 나가는 Source Address 변경 ex) ## 시작점 주소를 로 바꾸기 # iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to ## 시작점 주소를 에서 로 바꾸기 # iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to
31
NAT의 설정 - DNAT - 패킷의 시작점('-s', '--source'), 목적지 ('-d', '--destination')을 지정 - 이 옵션 뒤에는 하나의 IP 주소나 도메인 이름 이나 네트워크 주소가 붙음 ex) 목적지 주소가 의 80포트를 의 8080포트로 바꾸기 #iptables -t nat -A PREROUTING -p tcp -d dport 80 -j DNAT --to :8080 ## 들어오는 80 포트의 웹 정보를 squid (투명한) 프록시로 보내기 # iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128
33
MANGLE Table - 성능 향샹을 위한 TOS를 설정 - 매우 고급적이 내용이므로 확실하게 이해하지 않는경우 그대로 둠
- 잘못 설정할 경우 네트워크에 심각한 상황 초래 - TOS코드 이름 CODE [HEXCODE] 설명 Minimize-Delay 16 [0x10] 최소지연 Maximize-Throughput 8 [0x08] 최대 전송률 Maximize-Reliability 4 [0x04] 최대 안정성 Minimize-Cost 2 [0x02] 최소 경로 Normal-service [0x00] 일반서비스
34
MANGLE Table – 실질적인 예 - INPUT 체인
# iptables -t mangle -A INPUT -p tcp --dport 22 -j TOS --set-tos 0x10 # ssh를 최소지연 # iptables -t mangle -A INPUT -p tcp --dport 23 -j TOS --set-tos 0x10 # telnet을 최소지연 # iptables -t mangle -A INPUT -p tcp --dport 21 -j TOS --set-tos 0x10 # ftp 커맨드 전송포트를 최소지연 # iptables -t mangle -A INPUT -p tcp --dport 20 -j TOS --set-tos 0x08 # ftp-data전송포트를 최대 전송률 유지
35
MANGLE Table – 실질적인 예 - OUTPUT 체인
# iptables -t mangle -A OUTPUT -p tcp --dport 22 -j TOS --set-tox 0x10 # ssh를 최소지연 # iptables -t mangle -A OUTPUT -p tcp --dport 23 -j TOS --set-tox 0x10 # telnet을 최소지연 # iptables -t mangle -A OUTPUT -p tcp --dport 21 -j TOS --set-tox 0x10 # ftp 커맨드 전송포트를 최소지연 # iptables -t mangle -A OUTPUT -p tcp --dport 20 -j TOS --set-tox 0x08 # ftp-data전송포트를 최대 전송률을 유지
37
Iptables syntax-개요 - 실제 사용자가 iptables를 사용하기 위한 방법 - 기본 테이블에 기본 체인이 있음
filter table 속에 * INPUT * OUTPUT * FORWARD nat table 속에 * PREROUTING * OUTPUT * POSTROUTING mangle table 속에 * PREROUTING * OUTPUT * INPUT * FORWARD * POSTROUTING 이 체인들이 어떤 위치에서 어떤 역할을 하는지 숙지하고 구문을 익히는 것이 실제로 적용하는 데 도움이 됨
38
Iptables syntax-명령 - -t, --table table_name
* table을 선택하는 명령이 iptables에서 가장 먼저 나옴 * 항상 ‘iptables -t filter [some other commands]’ 형태로 사용 * 기본 테이블은 filter, nat, mangle (-t 옵션을 사용하지 않으면 default인 filter 테이블로 동작하게 됨 - 일반적)
39
Iptables syntax-명령 - 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 : 간략한 도움말
40
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으로 교체
41
Iptables syntax-명령 - 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 체인으로 나갈 패킷의 인터페이스를 지정 * [!] -f, --fragment : 여러 개로 분절된 패킷이 들어올 경우 프로토콜 적용 같은 것을 사용할 수 없어 -f를 사용해 두 번째 이상의 패킷 분절만 적용할 수 있는 경우 제공, !을 붙이면 첫번째 분절이나 분절이 아닌 곳에 적용 * -c, --set-counters PKTS BYTES : 이것은 관리자가 APPEND, INSERT, REPLACE하는 동안 규칙의 패킷이나 byte counter를 초기화 하는 것 가능 * --modprobe=<command> : 체인에 규칙을 추가할 때 이 옵션을 사용해 지정한 command로 모듈을 로드 가능
42
Iptables syntax-정리 iptables -t filter [some other commands]
* -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>
43
Iptables syntax-명령 - iptables 추가 기능 확장
사용자가 필요하면 모듈을 제작해서 사용 가능 * 커널 확장 모듈 : /lib/modules, iptables 확장 모듈 : /lib/iptables * 확장은 사용될 때 동적으로 loading됨 * iptables에서 확장의 두가지 측면: match, target
44
Iptables syntax-명령 - iptables의 match 확장
으로 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를 매치 최대 패킷 크기를 제어하는데 사용
45
Iptables syntax-명령 * -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
46
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 패킷 : 앞의 세 가지 상태로 인식할 수 없는 패킷
47
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하는 것은 기존과 같음
48
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한 값을 매치
49
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 : 조작된 것 같거나 의심가는 패킷 매치 + 확장 옵션 없음
50
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 패킷 헤더로부터의 옵션을 로그로 남김
51
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) 즉, 자동으로 최대 크기에 대한 문제점에서 멀어지게 함
52
Iptables syntax-명령 *** -t nat로 지정되는 nat 테이블에 사용되는 target 확장
* -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 주소와 포트 범위에서 가능한 것 중 하나를 골라 목적지 주소로 매핑 ^ 포트를 지정하지 않으면 포트는 변경되지 않음 ^ --to- destination를 여러 번 사용해서 여러 개으 주소를 지정 가능 ^ 간단한 라운드로빈 알고리즘 사용하여 부하 분산 가능 ^ --to라고만 써도 같은 작용
53
Iptables syntax-명령 * -j MASQUERADE에 사용되는 확장 옵션
+ nat 테이블의 POSTROUTING 체인에만 사용 + --to-ports port[-port] ^ 지정한 포트, 포트 범위에서 출발지 포트를 선택해서 마스쿼레이딩을 함 ^ SNAT와 다른 점은 IP가 동적으로 할당된다는 것. 각각의 새로운 연결마다 IP주소가 다르게 지정 ^ POSTRUTING체인에서 MASQUERADING을 하기 위해 out-interface를 지정 해 주어야하고, 포트를 사용하기 때문에 tcp나 udp를 사용하여야함 * -j REDIRECT에 사용되는 확장 옵션 + nat테이블의 PREROUTING과 OUTPUT 체인, 또는 이 체인들에서 부른 사용자 정의 체인들에서 부른 사용자 정의 체인에만 사용 ^ REDIRECTION을 위한 포트나 포트 범위를 입력 받아서 포트 방향 재설정 ^ 이것은 특별한 형태으 DNAT로 패킷은 로컬 호스트의 한 포트로 방향 재설정 ^ 들어오는 패킷은 들어오는 인터페이스의 INPUT 체인으로 방향 재설정되고, 로컬에서 생성된 패킷은 로컬 호스트의 loopback 인터페이스의 포트로 방향 재설정 ^ PREROUTING 체인에서 방향 재설정을 하기 위해서 in-interface를 지정해 주어야 하고, OUTPUT 체인에서 방향 재설정을 하기 위해서 out-interface를 지정해 주어야 함.
54
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 확장에서 언급됨
55
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] * -m conntrack에 사용되는 확장 옵션 + --ctstate state + --proto proto + --ctorigsrc [!] address[/mask] + --ctorigdst [!] address[/mask] + --ctreplsrc [!] address[/mask] + --ctrepldst [!] address[/mask] + --ctstatus [NONE | EXPECTED + --ctexpire time[:time] * -p udp 이후에 쓰이는 확장 + --source-port [!] port[:port] + --destination-port [!] port[:port] * icmp에 사용되는 확장 + --icmp-type [!] typename * -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] - iptables match 확장 * (-m, --match) limit에 사용되는 확장 옵션 + --limit rate + --limit-burst number * -m state에 사용되는 확장 옵션 + --state state * -m multiport에 사용되는 확장 옵션 + --source-ports port[,port[,port…]] * -m tos에 사용되는 확장 옵션 + --tos tos * -m unclean
56
Iptables syntax-정리 - 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 MARK에 사용되는 target 확장 옵션 + --set-mark mark * -j TOS에 사용되는 target확장 옵션 set-tos tos * -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]
57
Iptables 활용 - iptables를 사용해서 실제로 보안 설정
일반적으로 참고할 수 있는 기본적인 방화벽 설정을 통해 사용 - 여기 예제는 기본적으로 DROP - 주의 : 명령어를 리모트에서 하나씩 실행하는 것은 연결을 잃을 수 있으므로 반드시 콘솔에서 테스트하거나 스크립트를 만들어 사용 - 체인의 규칙은 위에서부터 순서대로 적용하기 때문에 순서에 신경을 써야함 # iptables –A INPUT –s /24 –j DROP # iptables –A INPUT –s –j ACCEPT # iptables –A INPUT –s –j ACCEPT # iptables –A INPUT –s /24 –j DROP - 두 경우는 매우 큰 차이가 있음 - 첫 번째 박스의 두 번째 줄의 target을 ACCEPT준 명령이 아무런 소용이 없음 - ACCEPT 줄이 두 번째 박스처럼 적용이 되게 할려면 DROP 앞에 선행되어야 함
58
script file에 대해… - 나중에…
Similar presentations