2016. 10. 21. 21:37
리눅스 iptables 방화벽 구성 스크립트 공유 합니다.

여기 스크립트 보고 신선한(?) 충격에 기존 방화벽 소스 대거 고치게 되었습니다.

베이스만 가져와서 대폭 수정하였습니다.


크게 아래 5가지 항목으로 잡았습니다.

1. INPUT PORT TCP
들어오는 TCP 포트 연결

2. INPUT PORT UDP
들어오는 UDP 포트 연결

3. OUTPUT ADDR
나가는 주소

4. OUTPUT PORT TCP
나가는 TCP 연결

5. OUTPUT PORT UDP
나가는 UDP 연결


OUTPUT 기본정책을 DROP 로 만들면 예기치 못한 상황을 겪을 수 있습니다. 처음에 ALLOW 로 설정하고 LOG 로 빠지는 놈이 있나 없나 체크 한 후에 마지막에 DROP 로 설정 합시다.

sudo iptables -L -n -v --line-numbers

이 명령어 한줄이면 아래 처럼 테이블이 나타납니다

빨간 네모 부분 LOG에 패킷, 바이트가 0 이 아니면 이쪽으로 향하는 길 잃은 영혼(패킷-_-)이 존재 한다는 겁니다.


dmesg 명령어로 LOG를 확인하고 출발지, 목적이 IP, PORT, prot 등을 확인하여 규칙을 추가하여 줍시다.


위 내역에서 숫자가 발생한 부분은 각각 패킷, 데이터가 얼마나 흘렀는지를 알 수 있는 부분이며, 0 은 아직 한번도 이 쪽 규칙을 타지 않았음을 나타냅니다. (한참 지켜보고 필요없다 싶으면 제거할 수도 있겠죠? ㅎㅎ)




현재 설정에 apt 패키지 업데이트 호스트도 추가해야 되는데 빠졌네요.
apt-get 하면 업데이트 서버에 접근 못합니다. OUTPUT도 막았으니까요.
이 부분은 OUTPUT ADDR에 업데이트 서버의 주소나 IP 추가해 주면 됩니다.

나가는 주소에 허용된 유일한 내역은 현재 서브넷 대역 (제 경우 172.17.10.0/24)을 설정하였는데 이 부분은 내부 네트워크의 주소에는 접근이 가능하게 하고자 함입니다.

그리고... NAT 부분은 VPN 때문에 설정하였습니다.
FORWARD 를 DROP 하면 NAT의 MASQUERADE 가 동작하지 않습니다. (패킷 전달을 막으면 안되는게 당연하겠죠?)
고로 여기서는 NAT 때문에 FORWARD를 막지 않습니다만, 필요없으면 DROP 이 보안상 좋겠네요.

#!/bin/bash

# Haebi's iptables script 
# http://haebi.kr, http://haebi.net

# based on
# https://gist.github.com/thomasfr/9712418

# Check iptables status
# sudo iptables -L -n -v --line-numbers

IPT="/sbin/iptables"

# Your DNS servers you use: cat /etc/resolv.conf
DNS_SERVER="
	8.8.4.4
	8.8.8.8
"

# Service List (TCP)
# -----------------------
# 22		SSH
# 80		Web
# 443		Web (HTTPS)
# 1194		OpenVPN #1
# 1196		OpenVPN #2
# 3306		MySQL
# 21		FTP (Command)
# 50000:51000	FTP (Data)
# 137:139	SAMBA
# 445		SAMBA

ALLOW_INPUT_PORT_TCP="
	22
	80
	443
	1194
	1196
	3306
	21
	50000:51000
	137:139
	445
"

# Service List (UDP)
# -----------------------
# 53		DNS
# 137:139	SAMBA
# 8649		ganglia

ALLOW_INPUT_PORT_UDP="
	53
	137:139
	8649
"

# Allow outgoing access
ALLOW_OUTPUT_ADDR="
	172.17.10.0/24
"

# Allow outgoing TCP
# 22		ssh connect other server

ALLOW_OUTPUT_PORT_TCP="
	22
"

# Allow outgoing UDP
# 123		ntp syncs

ALLOW_OUTPUT_PORT_UDP="
	123
"

$IPT -P INPUT ACCEPT
$IPT -F

# Allowing DNS lookups (tcp, udp port 53) to server
for ip in $DNS_SERVER
do
	$IPT -A OUTPUT -p udp -d $ip --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
	$IPT -A INPUT  -p udp -s $ip --sport 53 -m state --state ESTABLISHED     -j ACCEPT
	$IPT -A OUTPUT -p tcp -d $ip --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
	$IPT -A INPUT  -p tcp -s $ip --sport 53 -m state --state ESTABLISHED     -j ACCEPT
done

# Allow any connection from this host.
$IPT -A INPUT  -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

# Allow all broadcast traffic.
iptables -A INPUT -m pkttype --pkt-type broadcast -j ACCEPT

# Open Incoming TCP Ports
for PORT in $ALLOW_INPUT_PORT_TCP
do
	$IPT -A INPUT  -p tcp --dport $PORT -m state --state NEW,ESTABLISHED -j ACCEPT
	$IPT -A OUTPUT -p tcp --sport $PORT -m state --state ESTABLISHED     -j ACCEPT
done

# Open Incoming UDP Ports
for PORT in $ALLOW_INPUT_PORT_UDP
do
	$IPT -A INPUT  -p udp --dport $PORT -m state --state NEW,ESTABLISHED -j ACCEPT
	$IPT -A OUTPUT -p udp --sport $PORT -m state --state ESTABLISHED     -j ACCEPT
done

# Allow out going access
for ip in $ALLOW_OUTPUT_ADDR
do
	$IPT -A OUTPUT -d $ip -m state --state NEW,ESTABLISHED -j ACCEPT
	$IPT -A INPUT  -s $ip -m state --state ESTABLISHED     -j ACCEPT
done

# Allow out going TCP access
for port in $ALLOW_OUTPUT_PORT_TCP
do
	$IPT -A OUTPUT -p tcp --dport $port -m state --state NEW,ESTABLISHED -j ACCEPT
	$IPT -A INPUT  -p tcp --sport $port -m state --state ESTABLISHED     -j ACCEPT
done

# Allow out going UDP access
for port in $ALLOW_OUTPUT_PORT_UDP
do
	$IPT -A OUTPUT -p udp --dport $port -m state --state NEW,ESTABLISHED -j ACCEPT
	$IPT -A INPUT  -p udp --sport $port -m state --state ESTABLISHED     -j ACCEPT
done

#######################################################################################################
## Global iptable rules. Not IP specific

# Allow outgoing icmp connections (pings,...)"
$IPT -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT  -p icmp -m state --state ESTABLISHED,RELATED     -j ACCEPT

# Simple Service Discovery Protocol
$IPT -A INPUT -p udp --dport 1900 -d 239.255.255.250 --state NEW -j ACCEPT

# Multicast address
# 224.0.0.1 The All Hosts multicast group addresses all hosts on the same network segment.
$IPT -A INPUT -d 224.0.0.1 -j ACCEPT

# 224.0.0.22 Internet Group Management Protocol
$IPT -A OUTPUT -d 224.0.0.22 -j ACCEPT

# Device discovery
$IPT -A INPUT  -d 239.255.255.250 -j ACCEPT
$IPT -A OUTPUT -d 239.255.255.250 -j ACCEPT

# Default -----------------------------------------------------------------
iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Log before dropping
$IPT -A INPUT  -j LOG  -m limit --limit 5/min --log-level 7 --log-prefix 'IP INPUT drop: '
$IPT -A OUTPUT -j LOG  -m limit --limit 5/min --log-level 7 --log-prefix 'IP OUTPUT drop: '

# If forward drop then NAT Masquerade will not work.
$IPT -P INPUT DROP
#$IPT -P FORWARD DROP
$IPT -P OUTPUT DROP
$IPT -nL

# NAT ---------------------------------------------------------------------
$IPT -t nat -F
$IPT -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
$IPT -t nat -A POSTROUTING -s 10.8.2.0/24 -d 172.17.10.0/24 -o eth0 -j MASQUERADE
$IPT -t nat -nL










Posted by 해비