Created
December 17, 2012 12:05
-
-
Save fujimogn/4317833 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
#---------------------------------------# | |
# 設定開始 # | |
#---------------------------------------# | |
# インタフェース名定義 | |
LAN=eth0 | |
#---------------------------------------# | |
# 設定終了 # | |
#---------------------------------------# | |
# 内部ネットワークのネットマスク取得 | |
LOCALNET_MASK=`ifconfig $LAN|sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d` | |
# 内部ネットワークアドレス取得 | |
LOCALNET_ADDR=`netstat -rn|grep $LAN|grep $LOCALNET_MASK|cut -f1 -d' '` | |
LOCALNET=$LOCALNET_ADDR/$LOCALNET_MASK | |
# ファイアウォール停止(すべてのルールをクリア) | |
/etc/rc.d/init.d/iptables stop | |
# デフォルトルール(以降のルールにマッチしなかった場合に適用するルール)設定 | |
iptables -P INPUT DROP # 受信はすべて破棄 | |
iptables -P OUTPUT ACCEPT # 送信はすべて許可 | |
iptables -P FORWARD DROP # 通過はすべて破棄 | |
# 自ホストからのアクセスをすべて許可 | |
iptables -A INPUT -i lo -j ACCEPT | |
# 内部からのアクセスをすべて許可 | |
iptables -A INPUT -s $LOCALNET -j ACCEPT | |
# 内部から行ったアクセスに対する外部からの返答アクセスを許可 | |
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT | |
# 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 -A INPUT -f -j LOG --log-prefix '[IPTABLES FRAGMENT] : ' | |
iptables -A INPUT -f -j DROP | |
# 外部とのNetBIOS関連のアクセスはログを記録せずに破棄 | |
# ※不要ログ記録防止 | |
iptables -A INPUT ! -s $LOCALNET -p tcp -m multiport --dports 135,137,138,139,445 -j DROP | |
iptables -A INPUT ! -s $LOCALNET -p udp -m multiport --dports 135,137,138,139,445 -j DROP | |
iptables -A OUTPUT ! -d $LOCALNET -p tcp -m multiport --sports 135,137,138,139,445 -j DROP | |
iptables -A OUTPUT ! -d $LOCALNET -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 INPUT -d 255.255.255.255 -j DROP | |
iptables -A INPUT -d 224.0.0.1 -j DROP | |
# 113番ポート(IDENT)へのアクセスには拒否応答 | |
# ※メールサーバ等のレスポンス低下防止 | |
iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset | |
# ACCEPT_COUNTRY_MAKE関数定義 | |
# 指定された国のIPアドレスからのアクセスを許可するユーザ定義チェイン作成 | |
ACCEPT_COUNTRY_MAKE(){ | |
for addr in `cat /tmp/cidr.txt|grep ^$1|awk '{print $2}'` | |
do | |
iptables -A ACCEPT_COUNTRY -s $addr -j ACCEPT | |
done | |
} | |
# DROP_COUNTRY_MAKE関数定義 | |
# 指定された国のIPアドレスからのアクセスを破棄するユーザ定義チェイン作成 | |
DROP_COUNTRY_MAKE(){ | |
for addr in `cat /tmp/cidr.txt|grep ^$1|awk '{print $2}'` | |
do | |
iptables -A DROP_COUNTRY -s $addr -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES DENY_COUNTRY] : ' | |
iptables -A DROP_COUNTRY -s $addr -j DROP | |
done | |
} | |
# IPアドレスリスト取得 | |
. /root/iptables_functions | |
IPLISTGET | |
# 日本からのアクセスを許可するユーザ定義チェインACCEPT_COUNTRY作成 | |
iptables -N ACCEPT_COUNTRY | |
ACCEPT_COUNTRY_MAKE JP | |
# 以降,日本からのみアクセスを許可したい場合はACCEPTのかわりにACCEPT_COUNTRYを指定する | |
# 中国・台湾・ロシア※からのアクセスをログを記録して破棄 | |
# ※全国警察施設への攻撃元上位3カ国(日本・アメリカを除く) | |
# http://www.cyberpolice.go.jp/detect/observation.htmlより | |
iptables -N DROP_COUNTRY | |
DROP_COUNTRY_MAKE CN | |
DROP_COUNTRY_MAKE TW | |
DROP_COUNTRY_MAKE RU | |
iptables -A INPUT -j DROP_COUNTRY | |
#----------------------------------------------------------# | |
# 各種サービスを公開する場合の設定(ここから) # | |
#----------------------------------------------------------# | |
# 外部からのTCP22番ポート(SSH)へのアクセスを日本からのみ許可 | |
# ※SSHサーバーを公開する場合のみ | |
#iptables -A INPUT -p tcp --dport 22 -j ACCEPT_COUNTRY | |
iptables -A INPUT -p tcp --dport ポート番号 -j ACCEPT_COUNTRY | |
# 外部からのTCP/UDP53番ポート(DNS)へのアクセスを許可 | |
# ※外部向けDNSサーバーを運用する場合のみ | |
#iptables -A INPUT -p tcp --dport 53 -j ACCEPT | |
#iptables -A INPUT -p udp --dport 53 -j ACCEPT | |
# 外部からのTCP80番ポート(HTTP)へのアクセスを許可 | |
# ※Webサーバーを公開する場合のみ | |
iptables -A INPUT -p tcp --dport 80 -j ACCEPT | |
# 外部からのTCP443番ポート(HTTPS)へのアクセスを許可 | |
# ※Webサーバーを公開する場合のみ | |
iptables -A INPUT -p tcp --dport 443 -j ACCEPT | |
# 外部からのTCP21番ポート(FTP)へのアクセスを日本からのみ許可 | |
# ※FTPサーバーを公開する場合のみ | |
#iptables -A INPUT -p tcp --dport 21 -j ACCEPT_COUNTRY | |
# 外部からのPASV用ポート(FTP-DATA)へのアクセスを日本からのみ許可 | |
# ※FTPサーバーを公開する場合のみ | |
# ※PASV用ポート60000:60030は当サイトの設定例 | |
#iptables -A INPUT -p tcp --dport 60000:60030 -j ACCEPT_COUNTRY | |
# 外部からのTCP25番ポート(SMTP)へのアクセスを許可 | |
# ※SMTPサーバーを公開する場合のみ | |
iptables -A INPUT -p tcp --dport 25 -j ACCEPT | |
# 外部からのTCP465番ポート(SMTPS)へのアクセスを日本からのみ許可 | |
# ※SMTPSサーバーを公開する場合のみ | |
iptables -A INPUT -p tcp --dport 465 -j ACCEPT_COUNTRY | |
# 外部からのTCP587番ポート(サブミッションポート)へのアクセスを日本からのみ許可 | |
# ※SMTP AUTHサーバーを公開する場合のみ | |
iptables -A INPUT -p tcp --dport 587 -j ACCEPT_COUNTRY | |
# 外部からのTCP110番ポート(POP3)へのアクセスを日本からのみ許可 | |
# ※POP3サーバーを公開する場合のみ | |
iptables -A INPUT -p tcp --dport 110 -j ACCEPT_COUNTRY | |
# 外部からのTCP995番ポート(POP3S)へのアクセスを日本からのみ許可 | |
# ※POP3Sサーバーを公開する場合のみ | |
iptables -A INPUT -p tcp --dport 995 -j ACCEPT_COUNTRY | |
# 外部からのTCP143番ポート(IMAP)へのアクセスを日本からのみ許可 | |
# ※IMAPサーバーを公開する場合のみ | |
iptables -A INPUT -p tcp --dport 143 -j ACCEPT_COUNTRY | |
# 外部からのTCP993番ポート(IMAPS)へのアクセスを日本からのみ許可 | |
# ※IMAPSサーバーを公開する場合のみ | |
iptables -A INPUT -p tcp --dport 993 -j ACCEPT_COUNTRY | |
# 外部からのUDP1194番ポート(OpenVPN)へのアクセスを日本からのみ許可 | |
# ※OpenVPNサーバーを公開する場合のみ | |
#iptables -A INPUT -p udp --dport 1194 -j ACCEPT_COUNTRY | |
# VPNインタフェース用ファイアウォール設定 | |
# ※OpenVPNサーバーを公開する場合のみ | |
#[ -f /etc/openvpn/openvpn-startup ] && /etc/openvpn/openvpn-startup | |
#----------------------------------------------------------# | |
# 各種サービスを公開する場合の設定(ここまで) # | |
#----------------------------------------------------------# | |
# 拒否IPアドレスからのアクセスはログを記録せずに破棄 | |
# ※拒否IPアドレスは/root/deny_ipに1行ごとに記述しておくこと | |
# (/root/deny_ipがなければなにもしない) | |
if [ -s /root/deny_ip ]; then | |
for ip in `cat /root/deny_ip` | |
do | |
iptables -I INPUT -s $ip -j DROP | |
done | |
fi | |
# 上記のルールにマッチしなかったアクセスはログを記録して破棄 | |
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 | |
# サーバー再起動時にも上記設定が有効となるようにルールを保存 | |
/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