[Linux Network] 07. iptables - 2
카테고리: LINUX_NETWORK
태그: linux linux_network
01. 네트워크 구성도
02. iptables 실습 내용
■ 기본 규칙
-
보안 정책은 상태 추적을 이용하여 구성
-
서비스 별 사용자 정의 체인 사용
■ Trusted Site 정책
-
Trusted Site 전체 외부 통신 가능하도록 설정
-
Host Network 정책
-
내부 사용자 WEB 서비스 허용 → 허용된 트래픽에 대해 LOG 남기기(10회 저장 후 분당 10번씩 저장)
-
내부 사용자 SSH 서비스 허용 → 허용된 트래픽에 대해 LOG 남기기(20회 저장 후 초당 7번씩 저장)
-
www.facebook.com 과 inven.co.kr 접속 차단 → 차단된 트래픽에 대해 LOG 남기기(3회 저장 후 분당 10번씩 저장)
-
■ Untrusted Site 정책
-
DMZ의 WEB서버 접근을 제외한 모든 통신 차단
-
Untrusted에서 관리 목적으로 접근하는 관리자의 SSH접속 허용
-
Port Scanning 차단(DMZ에서 서비스 중인 포트 제외)
-
정상적인 패킷은 접속량으로 차단
-
비정상적인 패킷은 탐지하여 차단
-
-
DoS 공격 차단(SYN Flooding, Smurf, UDP Flooding, …)
-
Icmp Redirect 차단
-
방화벽 정책 backup
■ 관리 정책
- 방화벽 정책 backup
03. 정책 적용
# Trusted Site 전체 외부 통신 가능하도록 설정
iptables -t nat -A POSTROUTING -s 172.20.15.0/24 -o ens160 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.1.2.0/24 -o ens160 -j MASQUERADE
# 내부 웹 서버 공인 IP 설정 (DNAT)
ifconfig ens160:0 192.168.219.200 netmask 255.255.255.0
iptables -t nat -A PREROUTING -d 192.168.219.200 -j DNAT --to 10.1.2.202
# 목록을 제외한 모든 패킷을 차단
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# 내부 사용자가 특정 사이트 접근 차단
iptables -N DROP_SITE
iptables -A DROP_SITE -p tcp -m multiport --dport 80,443 -s 172.20.15.0/24 -m limit --limit 10/m --limit-burst 3 -j LOG --log-prefix "[DROP_SITE]"
iptables -A DROP_SITE -p tcp -m multiport --dport 80,443 -s 172.20.15.0/24 -m string --algo kmp --string "facebook" -j DROP
iptables -A DROP_SITE -p tcp -m multiport --dport 80,443 -s 172.20.15.0/24 -m string --algo kmp --string "inven.co.kr" -j DROP
iptables -A FORWARD -j DROP_SITE
# DNS 서비스 허용
iptables -N INT_DNS
iptables -A INT_DNS -p udp --dport 53 -s 172.20.15.0/24 -m state --state NEW, ESTABLISHED -j ACCEPT
iptables -A INT_DNS -p udp --sport 53 -d 172.20.15.0/24 -m state --state NEW, ESTABLISHED -j ACCEPT
iptables -A INT_DNS -p udp --dport 53 -s 10.1.2.0/24 -m state --state NEW, ESTABLISHED -j ACCEPT
iptables -A INT_DNS -p udp --sport 53 -d 10.1.2.0/24 -m state --state NEW, ESTABLISHED -j ACCEPT
iptables -A FORWARD -j INT_DNS
# Ping 허용
iptables -N ICMP
iptables -A ICMP -p icmp --icmp-type 8 -j ACCEPT
iptables -A ICMP -p icmp --icmp-type 0 -j ACCEPT
iptables -A INPUT -j ICMP
iptables -A OUTPUT -j ICMP
iptables -A FORWARD -j ICMP
# 내부 사용자가 WEB 서비스 허용
iptables -N INT_WEB
iptables -A INT_WEB -p tcp -m multiport --dport 80,443 -s 172.20.15.0/24 -m limit --limit 10/m --limit-burst 10 -j LOG --log-prefix "[INT_WEB_ACCEPT]"
iptables -A INT_WEB -p tcp -m multiport --dport 80,443 -s 172.20.15.0/24 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INT_WEB -p tcp -m multiport --sport 80,443 -d 172.20.15.0/24 -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -j INT_WEB
# 내부 사용자가 SSH 서비스 허용
iptables -N INT_SSH
iptables -A INT_SSH -p tcp --dport 22 -s 172.20.15.0/24 -m limit --limit 7/s --limit-burst 20 -j LOG --log-prefix "[INT_SSH_ACCEPT]"
iptables -A INT_SSH -p tcp --dport 22 -s 172.20.15.0/24 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INT_SSH -p tcp --sport 22 -d 172.20.15.0/24 -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -j INT_SSH
# DMZ의 WEB 서버 접근을 제외한 모든 총신 차단
iptables -N DMZ_WEB
iptables -A DMZ_WEB -p tcp -m multiport --dport 80,443 -d 10.1.2.202 -j LOG --log-prefix "[DMZ_WEB_ACCEPT]"
iptables -A DMZ_WEB -p tcp -m multiport --dport 80,443 -d 10.1.2.202 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A DMZ_WEB -p tcp -m multiport --sport 80,443 -s 10.1.2.202 -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -j DMZ_WEB
# 관리자의 SSH 접속 허용
iptables -N DMZ_SSH
iptables -A DMZ_SSH -p tcp --dport 22 -s 192.168.219.11 -d 10.1.2.202 -j LOG --log-prefix "[DMZ_WEB_ACCEPT]"
iptables -A DMZ_SSH -p tcp --dport 22 -s 192.168.219.11 -d 10.1.2.202 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A DMZ_SSH -p tcp --sport 22 -d 192.168.219.11 -s 10.1.2.202 -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -j DMZ_SSH
# Port Scanning 차단
iptables -N PORT_SCAN
# 정상적인 패킷은 접속량으로 차단
iptables -A PORT_SCAN -m limit --limit 100/s -j DROP
# 비정상적인 패킷은 탐지하여 차단
iptables -A PORT_SCAN -m state --state INVALID -j DROP
# FIN SCAN
iptables -A PORT_SCAN -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN -m state --state NEW -j DROP
# X-mas Scan
iptables -A PORT_SCAN -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
# NULL SCAN
iptables -A PORT_SCAN -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
iptables -I FORWARD -j PORT_SCAN
# DoS 공격 차단(SYN Flooding, Smurf, UDP Flooding, …)
# SYN Flooding 차단 (TCP Full Connection Scan, Half Open Scan)
iptables -N DOS
iptables -A DOS -p tcp --syn -i ens160 -m limit --limit 100/s -j DROP
# Smurf 차단
iptables -A DOS -i ens160 -d 172.20.15.255 -j DROP
iptables -A DOS -i ens160 -d 10.1.2.255 -j DROP
# ICMP Redirect 차단
iptables -A DOS -p icmp -m icmp --icmp-type 5 -j DROP
iptables -I FORWARD -j DOS
# or
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
# IP spoofing 차단
iptables -N IP_SPOOF
iptables -A IP_SPOOF -i ens160 -s 10.0.0.0/8 -j DROP
iptables -A IP_SPOOF -i ens160 -s 172.16.0.0/12 -j DROP
iptables -A IP_SPOOF -i ens160 -s 127.0.0.0/8 -j DROP
iptables -A IP_SPOOF -i ens160 -s 224.0.0.0/8 -j DROP
iptables -A IP_SPOOF -i ens160 -s 240.0.0.0/8 -j DROP
iptables -A FORWARD -i ens160 -j IP_SPOOF
# iptables 규칙 저장
service iptables save
# 다른 파일로 BACKUPPermalink
iptables-save > back_iptables_set.bak
# 지정한 파일로 RESTORE
cat back_iptables_set.bak | iptables-restore
댓글 남기기