スポンサードリンク

スポンサードリンク

キーワードに合ったホームページを自動的に作っちゃおうツール

キーワードに合ったホームページを自動的に作っちゃおうツール

最新版のダウンロードはこちら↓
EXCEL版
BlogHPEditTool.exe

※実行ファイル版を作成中の為、
 今後、修正やバージョンアップはありません。m(__)m

EXCEL版の最新版の説明はこちら

最新情報 (RSS)

ご意見・ご感想などはこちらにコメントくださいm(__)m

キーワードに合ったホームページを自動的に作っちゃおうツール

CentOS 5.1 iptablesでファイアーウォール

さて前回は、ntpで時間を合わせました

今回はiptablesでファイアーウォールを設定します


前回「CentOS 5.1 ntpで時間を合わせる


とりあえず、コマンドなどの紹介


■テーブル
テーブル 説明
filter: -t オプションが指定されない場合のデフォルトのテーブル
nat: 新しい接続を開くようなパケットに対して参照される
Linuxをルータとして利用する場合には重要
mangle: 特別なパケット変換に使われる


■チェイン
チェイン 説明
INPUT 入力されるパケット
OUTPUT 出力されるパケット
FORWARD 転送するパケット


■ルール時に使用する主なパラメータ
ターゲット 説明
ACCEPT 許可
DROP 廃棄
REJECT 拒否(接続元に通知)


■オプション
コマンド 説明
-A チェインの最後にルールを追加する
-D チェインのルールを削除する
-I ルール番号を指定してチェインにルールを挿入する
ルール番号が省略された場合、先頭に挿入する
-R チェインのルールを置換する
-L チェインのルールを表示する
-F チェインのルールを全て削除する
-Z すべてのチェインのパケットカウンタとバイトカウンタをゼロにする
-N ユーザ定義チェインを作成する
-X ユーザ定義チェインを削除する
-P チェインのポリシーを設定する
-E ユーザ定義チェインの名前を変更する


■パケットマッチングモジュール
パラメータ 説明
--limit 単位時間あたりの平均マッチ回数の最大値
/second、/minute、/hour、/day が利用出来る
デフォルトは 3/hour
--limit-burst パケットがマッチする回数の最大初期値
デフォルトは5





で、どうするかと言うと



# iptables -P INPUT DROP # 受信は全て破棄




# iptables -P OUTPUT ACCEPT # 送信はすべて許可




# iptables -P FORWARD DROP # 通過はすべて破棄



とか、
するわけです

感の良い人はわかったかな?


そう!
全てのルールに対してコマンドを打ち続けなくてはなりません


しかも!

PCが再起動するとルールが消えるらしい。。。



で、
iptables ではコマンド入力で設定するより
シェルスクリプトで行う方が一般的なので
スクリプトを作成します。



シェルスクリプト?

えーと
一連のコマンドなどを組み合わせて作ったプログラム

で、いいのかな?


とりあえず作ります

# vi /root/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 addr in `cat 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 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
}

# iptables設定スクリプト外部関数取り込み
. /root/iptables_functions

# IPアドレスリスト取得
IPLISTGET

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

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

# IPアドレスリスト削除
rm -f cidr.txt

# 中国・韓国・台湾※からのアクセスをログを記録して破棄
# ※全国警察施設への攻撃元上位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


# LAN内からのみSSH(22番ポート)に接続を許可
iptables -A INPUT -s $LOCALNET -p tcp --dport 22 -j ACCEPT

# 外部からの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

# ※PASV設定を使わない場合
#iptables -A INPUT -p tcp --dport 20 -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

# LAN内からのみwebmin(デフォルト10000番ポート)に接続を許可
iptables -A INPUT -s $LOCALNET -p tcp --dport 10000 -j ACCEPT

# LAN内からのみVMware server(デフォルト902番ポート)に接続を許可
iptables -A INPUT -s $LOCALNET -p tcp --dport 902 -j ACCEPT


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


# 拒否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 restart


※公開サービスの所は自分の環境に合わせてください




ダウンロードURL
https://afexcel.up.seesaa.net/CentOS/iptables.sh





# wget https://afexcel.up.seesaa.net/CentOS/iptables.sh


とすれば、取得できます

ダウンロードされる場所は
現在のディレクトリです

現在のディレクトリがわからない人は
ダウンロードして欲しいディレクトリに移動して
ダウンロードしてください

このファイルは root 権限で実行され
独自に作ったファイルなので
一般的には /root に置く。。。のかな?


# cd /root
# wget https://afexcel.up.seesaa.net/CentOS/iptables.sh
--18:00:15-- https://afexcel.up.seesaa.net/CentOS/iptables.sh
=> `iptables.sh'
afexcel.up.seesaa.net をDNSに問い合わせています... 59.106.28.138, 59.106.28.143, 59.106.28.132. ...
afexcel.up.seesaa.net|59.106.28.138|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 8,294 (8.1K) [application/x-sh]

100%[========================================================>] 8,294 --.--K/s

18:00:17 (297.76 KB/s) - `iptables.sh' を保存しました [8294/8294]


これで /root にファイルが保存されました


現在のディレクトリ内のファイルやフォルダを表示

# ls




ダウンロードしたファイルはありましたか?


ファイアウォール設定スクリプトへ実行権限付加

# chmod 700 iptables.sh


これをしないとこのスクリプトを実行できません





このシェルスクリプトは http://nami.jp/ipv4bycc/ から、
「世界の国別 IPv4 アドレス割り当てリスト」をダウンロードして
その中の「中国[CN]・韓国[KR]・台湾[TW]」に該当するIPアドレスからの接続を拒否するように設定されます
(北朝鮮[KP]も含めた方が良いのかな?)

今ダウンロードしたファイルでは
リストのダウンロードはしません

ですのでダウンロードする為のファイルを作ります


# vi /root/iptables_functions




# IPアドレスリスト取得関数定義
IPLISTGET(){
# http://nami.jp/ipv4bycc/から最新版IPアドレスリストを取得する
wget -q http://nami.jp/ipv4bycc/cidr.txt
# 最新版IPアドレスリストが取得できなかった場合
if [ ! -f cidr.txt ]; then
if [ -f /tmp/cidr.txt ]; then
# バックアップがある場合はバックアップを読み込み、root宛にメール通知して処理を継続する
cp /tmp/cidr.txt cidr.txt
echo cidr.txt was read from the backup! | mail -s $0 root
else
# バックアップがない場合は、root宛にメール通知して処理を打ち切る
echo cidr.txt not found!|mail -s $0 root
exit 1
fi
fi
# 最新版IPアドレスリストを /tmpへバックアップする
/bin/cp cidr.txt /tmp/cidr.txt
}



ダウンロードURL
https://afexcel.up.seesaa.net/rpm/iptables_functions




このIPアドレスリストは1日1回程度で更新されているようなので
更新があればファイアウォール設定を更新するスクリプトを作成します


# vi /etc/cron.daily/iplist_check.sh


作成するファイルのディレクトリが今までと違います

/etc/cron.daily ディレクトリは
cron デーモンが毎日実行するスクリプトが入っています

つまり、ここにスクリプトを作成し置いておけば
毎日実行されるわけです



ファイルの中身

#!/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

# iptables設定スクリプト外部関数取り込み
. /root/iptables_functions

# IPアドレスリスト最新化
rm -f IPLIST.new
IPLISTGET
for country in $COUNTRY_CODE
do
if [ -f cidr.txt ]; then
grep ^$country cidr.txt >> IPLIST.new
else
grep ^$country /tmp/IPLIST >> IPLIST.new
fi
done
rm -f cidr.txt

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



ダウンロードURL
https://afexcel.up.seesaa.net/rpm/iplist_check.sh



で、実行するってことは実行権限をつけなくちゃ

# chmod +x /etc/cron.daily/iplist_check.sh





実際に実行

# /root/iptables.sh


エラー出ませんでした?



正常に終了したなら

# /root/iptables.sh
Resetting built-in chains to the default ACCEPT policy:ip_tables: (C) 2000-2006 Netfilter Core Team
Netfilter messages via NETLINK v0.30.
ip_conntrack version 2.4 (4096 buckets, 32768 max) - 232 bytes per conntrack
[ OK ]
Saving current rules to /etc/sysconfig/iptables: [ OK ]
Flushing all current rules and user defined chains: [ OK ]
Clearing all current rules and user defined chains: [ OK ]
Applying iptables firewall rules: [ OK ]
[ OK ]


こんな感じに表示されると思います

# /root/iptables.sh
Resetting built-in chains to the default ACCEPT policy: [ OK ]
Saving current rules to /etc/sysconfig/iptables: [ OK ]
Flushing all current rules and user defined chains: [ OK ]
Clearing all current rules and user defined chains: [ OK ]
Applying iptables firewall rules: [ OK ]
[ OK ]


それともこんな感じ?





サーバPC起動時に起動するように。。。と

# chkconfig iptables on




設定を確認

# chkconfig --list iptables
iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off


ランレベル 2,3,4,5 が on になってるので OK





まぁこんなところで
iptables でのファイアウォールは終了ですなぁ


この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック

キーワードに合ったホームページを自動的に作っちゃおうツール

キーワードに合ったホームページを自動的に作っちゃおうツール

最新版のダウンロードはこちら↓
EXCEL版
BlogHPEditTool.exe

※実行ファイル版を作成中の為、
 今後、修正やバージョンアップはありません。m(__)m

EXCEL版の最新版の説明はこちら

最新情報 (RSS)

ご意見・ご感想などはこちらにコメントくださいm(__)m

キーワードに合ったホームページを自動的に作っちゃおうツール