Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
CentOS用のiptables設定 さくらのVPSでの利用を想定。
#!/bin/bash
#---------------------------------------#
# 設定開始 #
#---------------------------------------#
# WANインタフェース名定義
WAN=eth0
# VPNネットワークの範囲
#VPN=tap_utvpn
#VPN_NET=192.168.10.0/24
# iptablesのパス
IPTABLES=/sbin/iptables
#---------------------------------------#
# 設定終了 #
#---------------------------------------#
# WANネットマスク取得
WAN_BCAST=`ifconfig $WAN |sed -e 's/^.*Bcast:\([^ ]*\).*$/\1/p' -e d`
# パケット転送停止
# ※ルール設定中のパケット通過防止
sysctl -w net.ipv4.ip_forward=0 > /dev/null
# 初期化
$IPTABLES -F
# パスMTU問題対処
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
# デフォルトルール(以降のルールにマッチしなかった場合に適用するルール)設定
$IPTABLES -P INPUT DROP # 受信はすべて破棄
$IPTABLES -P OUTPUT ACCEPT # 送信はすべて許可
$IPTABLES -P FORWARD DROP # 通過はすべて破棄
###### 各種攻撃対策
# SYN Cookiesを有効にする
# ※TCP SYN Flood攻撃対策
sysctl -w net.ipv4.tcp_syncookies=1 > /dev/null
sed -i '/net.ipv4.tcp_syncookies/d' /etc/sysctl.conf
echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf
# ブロードキャストアドレス宛pingには応答しない
# ※Smurf攻撃対策
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1 > /dev/null
sed -i '/net.ipv4.icmp_echo_ignore_broadcasts/d' /etc/sysctl.conf
echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf
# ICMP Redirectパケットは拒否
sed -i '/net.ipv4.conf.*.accept_redirects/d' /etc/sysctl.conf
for dev in `ls /proc/sys/net/ipv4/conf/`
do
sysctl -w net.ipv4.conf.$dev.accept_redirects=0 > /dev/null
echo "net.ipv4.conf.$dev.accept_redirects=0" >> /etc/sysctl.conf
done
# Source Routedパケットは拒否
sed -i '/net.ipv4.conf.*.accept_source_route/d' /etc/sysctl.conf
for dev in `ls /proc/sys/net/ipv4/conf/`
do
sysctl -w net.ipv4.conf.$dev.accept_source_route=0 > /dev/null
echo "net.ipv4.conf.$dev.accept_source_route=0" >> /etc/sysctl.conf
done
# フラグメント化されたパケットはログを記録して破棄
$IPTABLES -N LOG_FRAGMENT
$IPTABLES -A LOG_FRAGMENT -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES FRAGMENT] : '
$IPTABLES -A LOG_FRAGMENT -j DROP
$IPTABLES -A INPUT -f -j LOG_FRAGMENT
$IPTABLES -A FORWARD -f -j LOG_FRAGMENT
# WANからの送信元がプライベートIPアドレスのパケットはログを記録して破棄
# ※IP spoofing攻撃対策
$IPTABLES -N LOG_SPOOFING
$IPTABLES -A LOG_SPOOFING -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES SPOOFING] : '
$IPTABLES -A LOG_SPOOFING -j DROP
$IPTABLES -A INPUT -i $WAN -s 127.0.0.0/8 -j LOG_SPOOFING
$IPTABLES -A INPUT -i $WAN -s 10.0.0.0/8 -j LOG_SPOOFING
$IPTABLES -A INPUT -i $WAN -s 172.16.0.0/12 -j LOG_SPOOFING
$IPTABLES -A INPUT -i $WAN -s 192.168.0.0/16 -j LOG_SPOOFING
$IPTABLES -A FORWARD -i $WAN -s 127.0.0.0/8 -j LOG_SPOOFING
$IPTABLES -A FORWARD -i $WAN -s 10.0.0.0/8 -j LOG_SPOOFING
$IPTABLES -A FORWARD -i $WAN -s 172.16.0.0/12 -j LOG_SPOOFING
$IPTABLES -A FORWARD -i $WAN -s 192.168.0.0/16 -j LOG_SPOOFING
# WANとのWindowsファイル共有関連のアクセスはログを記録せずに破棄
$IPTABLES -A INPUT -i $WAN -p tcp -m multiport --dports 135,137,138,139,445 -j DROP
$IPTABLES -A INPUT -i $WAN -p udp -m multiport --dports 135,137,138,139,445 -j DROP
$IPTABLES -A OUTPUT -o $WAN -p tcp -m multiport --sports 135,137,138,139,445 -j DROP
$IPTABLES -A OUTPUT -o $WAN -p udp -m multiport --sports 135,137,138,139,445 -j DROP
$IPTABLES -A FORWARD -i $WAN -p tcp -m multiport --dports 135,137,138,139,445 -j DROP
$IPTABLES -A FORWARD -i $WAN -p udp -m multiport --dports 135,137,138,139,445 -j DROP
$IPTABLES -A FORWARD -o $WAN -p tcp -m multiport --sports 135,137,138,139,445 -j DROP
$IPTABLES -A FORWARD -o $WAN -p udp -m multiport --sports 135,137,138,139,445 -j DROP
# 1秒間に4回を超えるpingはログを記録して破棄
# ※Ping of Death攻撃対策
$IPTABLES -N LOG_PINGDEATH
$IPTABLES -A LOG_PINGDEATH -m limit --limit 1/s --limit-burst 4 -j ACCEPT
$IPTABLES -A LOG_PINGDEATH -j LOG --log-prefix '[IPTABLES PINGDEATH] : '
$IPTABLES -A LOG_PINGDEATH -j DROP
$IPTABLES -A INPUT -p icmp --icmp-type echo-request -j LOG_PINGDEATH
$IPTABLES -A FORWARD ! -o $WAN -p icmp --icmp-type echo-request -j LOG_PINGDEATH
# 送信元IPアドレスがVPNネットワーク範囲外のアクセスはログを記録して破棄
# ※Ingress対策
#iptables -N LOG_INGRESS
#iptables -A LOG_INGRESS -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES INGRESS] : '
#iptables -A LOG_INGRESS -j DROP
#iptables -A FORWARD -i $VPN ! -s $VPN_NET -j LOG_INGRESS
###### 許可設定
# 自ホストからのアクセスをすべて許可
$IPTABLES -A INPUT -i lo -j ACCEPT
# VPNネットワーク内からのアクセスをすべて許可
#$IPTABLES -A INPUT -s $VPN_NET -j ACCEPT
#$IPTABLES -A FORWARD -s $VPN_NET -j ACCEPT
# 自ホストから行ったアクセスに対する外部からの返答アクセスを許可
$IPTABLES -A INPUT -i $WAN -m state --state ESTABLISHED,RELATED -j ACCEPT
# WANからの必須ICMPパケットを許可
$IPTABLES -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type source-quench -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT
$IPTABLES -A FORWARD -p icmp --icmp-type destination-unreachable -j ACCEPT
$IPTABLES -A FORWARD -p icmp --icmp-type source-quench -j ACCEPT
$IPTABLES -A FORWARD -p icmp --icmp-type time-exceeded -j ACCEPT
$IPTABLES -A FORWARD -p icmp --icmp-type parameter-problem -j ACCEPT
###### 拒否設定
# 113番ポート(IDENT)へのアクセスには拒否応答
# ※メールサーバ等のレスポンス低下防止
$IPTABLES -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset
$IPTABLES -A FORWARD -p tcp --dport 113 -j REJECT --reject-with tcp-reset
# 全ホスト(ブロードキャストアドレス、マルチキャストアドレス)宛パケットはログを記録せずに破棄
# ※不要ログ記録防止
$IPTABLES -A INPUT -d 255.255.255.255 -j DROP
$IPTABLES -A INPUT -d 224.0.0.1 -j DROP
# Dropboxのブロードキャストを破棄
# WAN側からのブロードキャストを破棄
$IPTABLES -A INPUT -p udp --dport 17500 -d $WAN_BCAST -j DROP
# 自ホストからWAN側へのブロードキャストを破棄
$IPTABLES -A OUTPUT -p udp --dport 17500 -d $WAN_BCAST -j DROP
# SSHへの自動攻撃対策
# 180秒以内に20回以上のssh接続を試みたIPアドレスをシャットアウトする
$IPTABLES -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name ssh_attack
$IPTABLES -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 180 --hitcount 20 --rttl --name ssh_attack -j LOG --log-prefix '[SSH attack]'
$IPTABLES -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 180 --hitcount 20 --rttl --name ssh_attack -j DROP
############ ポート開放設定 ここから ########################
# ※使わないポートはコメントアウトしてある
### SSH ###
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
## Webサーバ関連
### HTTP ###
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
### HTTPS ###
#iptables -A INPUT -p tcp --dport 443 -j ACCEPT
### DNS ###
#iptables -A INPUT -p tcp --dport 53 -j ACCEPT
#iptables -A INPUT -p udp --dport 53 -j ACCEPT
## メールサーバ関連
### SMTP ###
#iptables -A INPUT -p tcp --dport 25 -j ACCEPT
### SMTPS ###
#iptables -A INPUT -p tcp --dport 465 -j ACCEPT
### POP3 ###
#iptables -A INPUT -p tcp --dport 110 -j ACCEPT
### POP3S ###
#iptables -A INPUT -p tcp --dport 995 -j ACCEPT
### IMAP ###
#iptables -A INPUT -p tcp --dport 143 -j ACCEPT
### IMAPS ###
#iptables -A INPUT -p tcp --dport 993 -j ACCEPT
############ ポート開放設定終わり ########################
# VPNの設定 ここから -------------------------------------
# PPTP VPN
#$IPTABLES -A INPUT -p tcp --dport 1723 -j ACCEPT
#$IPTABLES -A INPUT -p gre -j ACCEPT
# UT-VPN
#$IPTABLES -A INPUT -p tcp --dport 443 -j ACCEPT
#$IPTABLES -A INPUT -p tcp --dport 992 -j ACCEPT
#$IPTABLES -A INPUT -p tcp --dport 5555 -j ACCEPT
# UT-VPN 速度測定ポート
#$IPTABLES -A INPUT -p tcp --dport 9821 -j ACCEPT
# NAPT for VPN Start
# NAPT変換
#$IPTABLES -t nat -A POSTROUTING -s $VPN_NET -j MASQUERADE
# 外部からの返答を許可(NAT)
#$IPTABLES -A FORWARD -i $WAN -d $VPN_NET -m state --state ESTABLISHED,RELATED -j ACCEPT
# NAPT for VPN End
# VPNネットワークからこのマシンへのアクセスを許可
#$IPTABLES -A INPUT -s $VPN_NET -j ACCEPT
# VPNの設定 ここまで -------------------------------------
#上記のルールにマッチしなかったアクセスは破棄
$IPTABLES -A INPUT -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES INPUT] : '
$IPTABLES -A INPUT -j DROP
$IPTABLES -A FORWARD -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES FORWARD] : '
$IPTABLES -A FORWARD -j DROP
# パケット転送開始
# VPNを動作させるときにはコメントを外すこと
#sysctl -w net.ipv4.ip_forward=1 > /dev/null
#sed -i '/net.ipv4.ip_forward/d' /etc/sysctl.conf
#echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
# ルールを保存してiptablesを起動
/etc/rc.d/init.d/iptables save
/etc/rc.d/init.d/iptables start
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment