iptables

iptablesの設定メモ
[最終更新日: 2008/01/23]

1. iptablesコマンドの使用法

| INDEX
現在のルールの確認
> iptables -L
ポリシーの設定
> iptables -P INPUT ACCEPT
> iptables -P FORWARD ACCEPT
> iptables -P OUTPUT ACCEPT
すべてのルールを破棄する
> iptables -F
現在のパケットカウンタをリセットする

すべてのチェーンのパケットカウンタをリセットする

> iptables -Z
ユーザ作成チェーンを作成する
> iptables -N USERCHAIN
ユーザ作成チェーンを削除する

INPUT, OUTPUT, FORWARDなどのビルトインのチェーン以外をすべて削除

> iptables -X

特定のユーザ作成チェーンを削除

> iptables -X USERCHAIN
ルールを追加する

HTTP(port:80)の受信を許可 (Interfaceは-iで指定)

> iptables -A INPUT -i eth0 -p tcp -dport 80 -j ACCEPT

HTTP(port:80)の発信を許可 (Interfaceは-oで指定)

> iptables -A OUTPUT -o eth0 -p tcp -dport 80 -j ACCEPT

2. syslogによるログの設定

| | INDEX

以下は、ロギング後にパケットを破棄するチェーンの例。

iptables -N deny

iptables -A deny -p tcp -j LOG --log-level debug --log-prefix '*DROP:TCP* '
iptables -A deny -p udp -j LOG --log-level debug --log-prefix '*DROP:UDP* '
iptables -A deny -p icmp -j LOG --log-level debug --log-prefix '*DROP:ICMP* '

iptables -A deny -j DROP

あわせて、/etc/syslog.confに以下のように設定してログの切り分けが可能。(同じdebugのログは混入する)

# /etc/syslog.conf
kern.=debug                           /var/log/fwlog

3. iptablesの設定サンプル

| INDEX

以下、個人的に使っている設定スクリプトの雛形。NATなしでの運用の場合。

拒否時に、ロギングを行うdenyチェーンと、静かにドロップするholeチェーンを定義している。後者は、おもにwindowsからのゴミパケット対策に使用している(べつに通しても問題はないのだろうけど・・・)

SSHの辞書攻撃対策を含む。

#!/bin/sh

SERVER='192.168.1.15'
LOCALNET='192.168.1.0/24'

LOCALHOST='127.0.0.1'
ANY='0.0.0.0/0'

IPTABLES='/sbin/iptables'

###############################################################################
# Chains and Rules
###############################################################################

# Init ----------------------------------- #

# Flush All Chain
$IPTABLES -F
$IPTABLES -t nat -F 
$IPTABLES -X
$IPTABLES -Z

# Default Filtering Chain
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

# "lo" Loopback  ------------------------- #

#$IPTABLES -A INPUT -i lo -j ACCEPT
#$IPTABLES -A OUTPUT -o lo -j ACCEPT

$IPTABLES -A INPUT -s $LOCALHOST -d $LOCALHOST -j ACCEPT
$IPTABLES -A OUTPUT -s $LOCALHOST -d $LOCALHOST -j ACCEPT

# New Chains  ---------------------------- #

$IPTABLES -N deny
$IPTABLES -N hole

$IPTABLES -N sshaccess
$IPTABLES -N sshdeny

# +-+- INPUT_RULES -+-+------------------------------ #

# Established_Packet ACCEPT
# $IPTABLES -A INPUT -p tcp ! --syn --dport 1024: -j ACCEPT #no_packet_inspection
$IPTABLES -A INPUT -p tcp  -s $ANY -d $SERVER --dport 1024: -m state --state ESTABLISHED -j ACCEPT

# HTTP tcp:80
$IPTABLES -A INPUT -p tcp -s $ANY -d $SERVER --dport 80 -j ACCEPT

# HTTPS tcp:443
# $IPTABLES -A INPUT -p tcp -s $LOCALNET -d $SERVER --dport 443 -j ACCEPT

# HTTP tcp:8080
# $IPTABLES -A INPUT -p tcp -s $LOCALNET -d $SERVER --dport 8080 -j ACCEPT

# SSH tcp:22
$IPTABLES -A INPUT -p tcp -s $ANY -d $SERVER --dport 22 -j sshaccess

# SMTP tcp:25
# $IPTABLES -A INPUT -p tcp -s $ANY -d $SERVER --dport 25 -j ACCEPT

# IMAP tcp:143
# $IPTABLES -A INPUT -p tcp -s $LOCALNET -d $SERVER --dport 143 -j ACCEPT

# Samba tcp:139,901/swat (udp:138,139)
$IPTABLES -A INPUT -p tcp -s $LOCALNET -d $SERVER --dport 139 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s $LOCALNET -d $SERVER --sport 139 -m state --state ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -p udp -s $LOCALNET --dport 138 -j hole
$IPTABLES -A INPUT -p udp -s $LOCALNET --sport 138 -j hole
$IPTABLES -A INPUT -p udp -s $LOCALNET --dport 137 -j hole
$IPTABLES -A INPUT -p udp -s $LOCALNET --sport 137 -j hole
$IPTABLES -A INPUT -p tcp -s $LOCALNET --dport 445 -j hole

# DNS SERVER udp:53
# $IPTABLES -A INPUT -p udp -s $LOCALNET --sport 1024: -d $SERVER --dport 53 -j ACCEPT
# $IPTABLES -A OUTPUT -p udp -s $SERVER --sport 53 -d $LOCALNET --dport 1024: -j ACCEPT

# DNS udp:53
$IPTABLES -A INPUT -p udp -s $ANY --sport 53 -d $SERVER --dport 1024: -j ACCEPT

# Ident ( Who are you? ) tcp:113
$IPTABLES -A INPUT -p tcp -s $ANY -d $SERVER --dport 113 -j REJECT

# NTP / SNTP udp:123
$IPTABLES -A INPUT -p udp -s $ANY --sport 123 -d $SERVER --dport 1024: -j ACCEPT
$IPTABLES -A INPUT -p udp -s $ANY --sport 123 -d $SERVER --dport 123 -j ACCEPT

# ICMP
$IPTABLES -A INPUT -p icmp -s $ANY --icmp-type echo-request -m limit --limit 1/s -d $SERVER -j ACCEPT

# SVN tcp:3690
# $IPTABLES -A INPUT -p tcp -s $LOCALNET -d $SERVER --dport 3690 -j ACCEPT

# PCHAT tcp:31415
$IPTABLES -A INPUT -p tcp -s $ANY -d $SERVER --dport 31415 -j ACCEPT

# +-+- OUTPUT_RULES -+-+------------------------------ #

# Established_Packet ACCEPT
# $IPTABLES -A OUTPUT -p tcp ! --syn --dport 1024: -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -s $SERVER -d $ANY --dport 1024: -m state --state ESTABLISHED -j ACCEPT

# HTTP tcp:80
$IPTABLES -A OUTPUT -p tcp -s $SERVER -d $ANY --dport 80 -j ACCEPT

# HTTPS tcp:443
$IPTABLES -A OUTPUT -p tcp -s $SERVER -d $ANY --dport 443 -j ACCEPT

# HTTP tcp:8080
$IPTABLES -A OUTPUT -p tcp -s $SERVER -d $ANY --dport 8080 -j ACCEPT

# SSH tcp:22
$IPTABLES -A OUTPUT -p tcp -s $SERVER -d $ANY --dport 22 -j ACCEPT

# SMTP tcp:25
#$IPTABLES -A OUTPUT -p tcp -s $SERVER -d $ANY --dport 25 -j ACCEPT

# Samba tcp:139,901/swat (udp:138,139)
$IPTABLES -A OUTPUT -p udp -s $SERVER -d $LOCALNET --dport 137 -j ACCEPT
$IPTABLES -A OUTPUT -p udp -s $SERVER -d $LOCALNET --dport 138 -j ACCEPT
$IPTABLES -A OUTPUT -p udp -s $SERVER --sport 138 -d $LOCALNET -j hole
$IPTABLES -A OUTPUT -p udp -s $SERVER --sport 137 -d $LOCALNET -j hole
$IPTABLES -A OUTPUT -p tcp -s $SERVER -d $LOCALNET --dport 445 -j hole

# DNS udp:53
$IPTABLES -A OUTPUT -p udp -s $SERVER -d $ANY --dport 53 -j ACCEPT

# Ident ( Who are you? ) tcp:113
$IPTABLES -A OUTPUT -p tcp -s $SERVER -d $ANY --dport 113 -j hole

# NTP udp:123
$IPTABLES -A OUTPUT -p udp -s $SERVER -d $ANY --dport 123 -j ACCEPT
$IPTABLES -A OUTPUT -p udp -s $SERVER -d $ANY --sport 123 -m state --state ESTABLISHED -j ACCEPT

# ICMP
$IPTABLES -A OUTPUT -p icmp -s $SERVER -d $ANY -j ACCEPT

# ----- FTP -----------

# FTP_SERVER_ tcp:21
#$IPTABLES -A INPUT -p tcp -s $ANY -d $SERVER --dport 21 -j ACCEPT
#$IPTABLES -A INPUT -p tcp -s $ANY -d $SERVER --dport 20 -j ACCEPT
#$IPTABLES -A OUTPUT -p tcp -s $ANY -d $SERVER --sport 20 -j ACCEPT

# FTP tcp:21
$IPTABLES -A INPUT -p tcp --dport 21 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 20 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 1024: -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 21 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --sport 20 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 20 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 1024: -j ACCEPT

# ----- /FTP ----------

# TO LOG_CHAIN... deny
$IPTABLES -A OUTPUT -j deny
$IPTABLES -A INPUT -j deny

# +-+- SSH ACCEPT POLICY -++--------------------------- #

$IPTABLES -A sshdeny -m recent --name sshauthdeny --set -j deny
$IPTABLES -A sshdeny -j DROP

$IPTABLES -A sshaccess -p tcp ! --syn -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A sshaccess -p tcp --syn -m recent --name sshahthdeny --rcheck --seconds 600 -j DROP
$IPTABLES -A sshaccess -p tcp --syn -m recent --name sshauth --rcheck --seconds 60 --hitcount 5 -j sshdeny
$IPTABLES -A sshaccess -p tcp --syn -m recent --name sshauth --set
$IPTABLES -A sshaccess -p tcp --syn -j ACCEPT

# +-+- GET_LOG_CHAIN -+-+------------------------------ #

$IPTABLES -A deny -p tcp -j LOG --log-level debug --log-prefix '*DROP:TCP* '
$IPTABLES -A deny -p udp -j LOG --log-level debug --log-prefix '*DROP:UDP* '
$IPTABLES -A deny -p icmp -j LOG --log-level debug --log-prefix '*DROP:ICMP* '

$IPTABLES -A deny -j DROP

# +-+- HOLE_CHAIN -+-+------------------------------ #

$IPTABLES -A hole -j DROP

.