2. syslogによるログの設定
以下は、ロギング後にパケットを破棄するチェーンの例。
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の設定サンプル
以下、個人的に使っている設定スクリプトの雛形。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