レンタルサーバー、サーバー構築の情報サイト|08-07.ファイアウォール構築(iptables)

サーバーを運用する際に自前にした場合、業者委託、レンタルした場合の必要な知識、実務に関しての情報を掲載しております
トップに戻ります

00-本サイトについて
 00-01.サイト運用者

 00-02.当サイトの運用環境



●08-07.ファイアウォール構築(iptables)

 iptablesを使ってサービスで開放しているPORT以外をブロックします。
 レンタルサーバーの場合はどこまでセキュリティがかかっているか確認して下さい。

 この設定を誤ると本来閉じておくべきPORTが開放されていたり、WEBのように開放すべきPORTが閉じてアクセスできない状況が出ますので設定後のテストは必ず必要です。

・設定

[root@fedora ~]# vi iptables.sh ファイアウォール設定スクリプト作成
#!/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 ip in `cat $1 | grep "$2|$3|ipv4|"`
do
FILTER_ADDR=`echo $ip |cut -d "|" -f 4`
TEMP_CIDR=`echo $ip |cut -d "|" -f 5`
FILTER_CIDR=32
while [ $TEMP_CIDR -ne 1 ];
do
TEMP_CIDR=$((TEMP_CIDR/2))
FILTER_CIDR=$((FILTER_CIDR-1))
done
iptables -A ACCEPT_COUNTRY -s $FILTER_ADDR/$FILTER_CIDR -j ACCEPT
done
}

# DROP_COUNTRY_MAKE関数定義
# 指定された国のIPアドレスからのアクセスを破棄するユーザ定義チェイン作成

DROP_COUNTRY_MAKE(){
for ip in `cat $1 | grep "$2|$3|ipv4|"`
do
FILTER_ADDR=`echo $ip |cut -d "|" -f 4`
TEMP_CIDR=`echo $ip |cut -d "|" -f 5`
FILTER_CIDR=32
while [ $TEMP_CIDR -ne 1 ];
do
TEMP_CIDR=$((TEMP_CIDR/2))
FILTER_CIDR=$((FILTER_CIDR-1))
done
iptables -A DROP_COUNTRY -s $FILTER_ADDR/$FILTER_CIDR -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES DENY_COUNTRY] : '
iptables -A DROP_COUNTRY -s $FILTER_ADDR/$FILTER_CIDR -j DROP
done
}

# IPアドレスリスト取得
wget -q http://ftp.apnic.net/stats/apnic/delegated-apnic-latest # APNIC
wget -q ftp://ftp.arin.net/pub/stats/arin/delegated-arin-latest # ARIN

# 日本からのアクセスを許可するユーザ定義チェインACCEPT_COUNTRY作成
iptables -N ACCEPT_COUNTRY
ACCEPT_COUNTRY_MAKE delegated-apnic-latest apnic JP # APNIC
ACCEPT_COUNTRY_MAKE delegated-arin-latest arin JP # ARIN
# 以降,日本からのみアクセスを許可したい場合はACCEPTのかわりにACCEPT_COUNTRYを指定する

# 中国・韓国・台湾からのアクセスを破棄するユーザ定義チェインDROP_COUNTRY作成
iptables -N DROP_COUNTRY
DROP_COUNTRY_MAKE delegated-apnic-latest apnic CN # APNIC
DROP_COUNTRY_MAKE delegated-arin-latest arin CN # ARIN
DROP_COUNTRY_MAKE delegated-apnic-latest apnic KR # APNIC
DROP_COUNTRY_MAKE delegated-arin-latest arin KR # ARIN
DROP_COUNTRY_MAKE delegated-apnic-latest apnic TW # APNIC
DROP_COUNTRY_MAKE delegated-arin-latest arin TW # ARIN
# 以降,中国・韓国・台湾からのアクセスを破棄したい場合はDROPのかわりにDROP_COUNTRYを指定する

# IPアドレスリスト削除
rm -f delegated-apnic-latest # APNIC
rm -f delegated-arin-latest # ARIN

# 中国・韓国・台湾※からのアクセスをログを記録して破棄
# ※全国警察施設への攻撃元上位3カ国(日本・アメリカを除く)
# http://www.cyberpolice.go.jp/detect/observation.htmlより

iptables -A INPUT -j DROP_COUNTRY

#----------------------------------------------------------#
# 各種サービスを公開する場合の設定(ここから) #
#----------------------------------------------------------#

# 外部からのTCP22番ポート(SSH)へのアクセスを日本からのみ許可
# ※SSHサーバーを公開する場合のみ

iptables -A INPUT -p tcp --dport 22 -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

# 外部からの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
iptables -N DENY_HOST
for ip in `cat /root/deny_ip`
do
iptables -A DENY_HOST -s $ip -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES DENY_HOST] : '
iptables -A DENY_HOST -s $ip -j DROP
iptables -I INPUT -j DENY_HOST
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

[root@fedora ~]# chmod 700 iptables.sh
ファイアウォール設定スクリプトへ実行権限付加

・IPアドレスリスト更新チェック

[root@fedora ~]# vi /etc/cron.daily/iplist_check.sh
IPアドレスリストチェックスクリプト作成

#!/bin/bash

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# チェック国コード
COUNTRY_CODE='JP CN KR TW'

# iptables設定スクリプトパス
IPTABLES=/root/iptables.sh

# IPアドレスリスト最新化
cd /tmp
rm -f IPLIST.new
# APNIC
wget -q -O delegated-apnic-latest http://ftp.apnic.net/stats/apnic/delegated-apnic-latest
for country in $COUNTRY_CODE
do
grep "apnic|$country|ipv4|" delegated-apnic-latest >> IPLIST.new
done
rm -f delegated-apnic-latest
# ARIN
wget -q -O delegated-arin-latest ftp://ftp.arin.net/pub/stats/arin/delegated-arin-latest
for country in $COUNTRY_CODE
do
grep "arin|$country|ipv4|" delegated-arin-latest >> IPLIST.new
done
rm -f delegated-arin-latest

# IPアドレスリスト更新チェック
diff -q IPLIST IPLIST.new > /dev/null 2>&1
if [ $? -ne 0 ]; then
/bin/mv IPLIST.new IPLIST
$IPTABLES > /dev/null
else
rm -f IPLIST.new
fi

[root@fedora ~]# chmod +x /etc/cron.daily/iplist_check.sh
IPアドレスリストチェックスクリプトに実行権限付加

・起動

[root@fedora ~]# ./iptables.sh

[root@fedora ~]# chkconfig iptables on
iptables自動起動設定


戻る

−− 弊社メインサイト −−
ホームページ製作、システム開発はMSweb - 大阪
ホームページ製作・作成、システム開発、サーバー構築・保守にはMSwebをご利用下さい

携帯サイト


−− 弊社姉妹サイト −−
ホームページ製作 発注企業に理解して欲しい内容
ホームページ発注企業、製作会社向けの内容です。

−− 弊社姉妹サイト −−
WEBシステム開発|PHPとPostgreSQLの開発例
入門者用のPHPとPostgreSQLを使ったWEBシステムの開発演習です。

−− 弊社姉妹サイト −−
ホームページ製作 大阪 | 製作手順の紹介−MSweb
ホームページ製作の手順をご紹介しています、デザイン、HTML、スタイルシートなどについて記載しています。

オープンソース・サンプル
MSweb OpenPNE 大阪
オープンソースのSNSです。ご興味があり使用されたい方は、 ID「msweb@msweb.biz」、パスワード「gua8hkj3」で管理ページにログインできます。
管理ページ

オープンソース・サンプル
MSweb ブログ
オープンソースのブログです。ご興味があり使用されたい方は、 ID「admin」、パスワード「bd0e86」で管理ページにログインできます。
管理ページ

オープンソース・サンプル
XOOPS
代表的なCMSのXOOPSです。ご興味があり使用されたい方は、 ユーザ名「msweb」、パスワード「as4g3mz」で管理者でログインできます。

オープンソース・サンプル
EC|CUBE(メイン・ページ)
EC|CUBE(管理ページ)
オープンソースの通販システムです。ご興味があり使用されたい方は、 ID「msweb」、パスワード「fd4upd2」で管理ページにログインできます。

オープンソース・サンプル
Joomla(メイン・ページ)
Joomla(管理ページ)
オープンソースのCMSです。ご興味があり使用されたい方は、 ID「admin」、パスワード「A2gT6B7F」で管理ページにログインできます。

オープンソース・サンプル
SquirrelMail
オープンソースのWEBメールのシステムです、OP25Bの影響を受けません。

オープンソース・サンプル
Mailman
Mailman(管理ページ)
オープンソースの電子メールでの討論やメルマガの配送リストを管理するためのシステムです。 サンプルのため投稿はできません。

Copyright (c) 2007 MSweb All Rights Reserved 腕時計 販売サイト my-watch.biz