iptables netfilter memory iptables Rule parsing read write
iptables & netfilter 개념도 memory iptables Rule parsing, read, write user level kernel level Rule ip_table Read & Write filter mangle nat rules
Netfilter 패킷 경로도와 Hooking [PRE] [ROUTE] Conntrack Mangle DNAT Conntrack Mangle [FORWARD] [POST] Mangle Filter [ROUTE] [IN] [OUT] Filter Mangle SNAT Conntrack Mangle DNAT (Proxy) 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
Packet Filtering의 개념 - 패킷을 필터링하는 종류 * Incoming Packet Filtering + Remote Src Address Filtering Port + Local Dest * 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 – rule 최적화
Iptables – rule 확장
NAT의 설정 - SNAT - '-j SNAT'를 사용함으로 지정 - '--to-source' 옵션으로 IP 주소, IP 주소의 범위, 포트의 범위 지정 - POSTROUTING에서 나가는 Source Address 변경 ex) ## 시작점 주소를 211. 253. 39. 1 로 바꾸기 # iptables -t nat -A POSTROUTING -o eth 0 -j SNAT --to 211. 253. 39. 1 ## 시작점 주소를 211. 253. 39. 1 에서 211. 253. 39. 125 로 바꾸기 # iptables -t nat -A POSTROUTING -o eth 0 -j SNAT --to 211. 253. 39. 1 -211. 253. 39. 125
MANGLE Table – 실질적인 예 - INPUT 체인 # iptables -t mangle -A INPUT -p tcp --dport 22 -j TOS --set-tos 0 x 10 # ssh를 최소지연 # iptables -t mangle -A INPUT -p tcp --dport 23 -j TOS --set-tos 0 x 10 # telnet을 최소지연 # iptables -t mangle -A INPUT -p tcp --dport 21 -j TOS --set-tos 0 x 10 # ftp 커맨드 전송포트를 최소지연 # iptables -t mangle -A INPUT -p tcp --dport 20 -j TOS --set-tos 0 x 08 # ftp-data전송포트를 최대 전송률 유지
MANGLE Table – 실질적인 예 - OUTPUT 체인 # iptables -t mangle -A OUTPUT -p tcp --dport 22 -j TOS --set-tox 0 x 10 # ssh를 최소지연 # iptables -t mangle -A OUTPUT -p tcp --dport 23 -j TOS --set-tox 0 x 10 # telnet을 최소지연 # iptables -t mangle -A OUTPUT -p tcp --dport 21 -j TOS --set-tox 0 x 10 # ftp 커맨드 전송포트를 최소지연 # iptables -t mangle -A OUTPUT -p tcp --dport 20 -j TOS --set-tox 0 x 08 # ftp-data전송포트를 최대 전송률을 유지
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으로 교체
Iptables syntax-정리 iptables -t filter [some other commands] - iptables의 1차적 명령 * -N, --new-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-명령 * -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의 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 * -m conntrack에 사용되는 확장 옵션 + --ctstate + --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 - iptables match 확장 + --gid-owner groupid * (-m, --match) limit에 사용되는 확장 옵션 + --pid-owner processed + --limit rate + --sid-owner sessionid + --limit-burst number + --cmd-owner name * -m state에 사용되는 확장 옵션 * -m mark에 사용되는 확장 옵션 + --state + --mark value[/mask] * -m multiport에 사용되는 확장 옵션 + --source-ports port[, port…]] * -m tos에 사용되는 확장 옵션 + --tos * -m unclean
Iptables syntax-정리 - target 확장 * -j LOG의 확장 옵션 + --log-level + --log-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 * -j TOS에 사용되는 target확장 옵션 + --set-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]
- Slides: 58