iptables を用いたファイヤーウォールの構築 – Ubuntu –

Ubuntu のファイヤーウォールの構築についてです。

今回は iptables を用いたファイヤーウォールの構築についてまとめました。下記のサイトを参考にさせて頂いています。内容は自分なりに加筆,修正しています。あくまで,参考程度にするようにしてください。

CentOSで自宅サーバー構築

Debian Wiki

Ubuntu には iptables がデフォルトでインストールされていますが,サービスとして自動起動するようには設定されていないので,自身で設定する必要があります。それというのも,ufw という iptables を簡単に構築するためのコマンドラインツールが推奨されているからです。Ubuntu でファイヤーウォールを構築するなら基本はこの ufw を用いますが,今回は他の OS でも活かせるように直に iptables を設定したいと思います。

1. iptables 設定用シェルスクリプトの作成

下記をコピーしたファイルを Build_firewall.sh として任意のディレクトリに保存。

#!/bin/bash

# インタフェース名定義
# ifconfig を使って,メインで使っているアダプタ名(eth0 や eth1)を定義してください。
# 基本的には eth0 が多いかと思います。
Ethernet=eth0

#---------------------------------------#
# 設定終了 #
#---------------------------------------#

# 内部ネットワークのネットマスク取得
LOCALNET_MASK=`LANG=C ifconfig $Ethernet|sed -e 's/^.*Mask:([^ ]*)$/1/p' -e d`

# 内部ネットワークアドレス取得
LOCALNET_ADDR=`LANG=C netstat -rn|grep $Ethernet|grep $LOCALNET_MASK|cut -f1 -d' '`
LOCALNET=$LOCALNET_ADDR/$LOCALNET_MASK
# ファイアウォール停止(すべてのルールをクリア)
/etc/init.d/ufw 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
#----------------------------------------------------------#
# 各種サービスを公開する場合の設定(ここから) #
#----------------------------------------------------------#

# 外部からのTCP22番ポート(SSH)へのアクセスを許可
# ※SSHサーバーを公開する場合のみ
iptables -A INPUT -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

# 外部からのPASV用ポート(FTP-DATA)へのアクセスを許可
# ※FTPサーバーを公開する場合のみ
# ※PASV用ポート60000:60030は当サイトの設定例
iptables -A INPUT -p tcp --dport 60000:60030 -j ACCEPT

# 外部からのTCP25番ポート(SMTP)へのアクセスを許可
# ※SMTPサーバーを公開する場合のみ
iptables -A INPUT -p tcp --dport 25 -j ACCEPT

# 外部からのTCP465番ポート(SMTPS)へのアクセスを許可
# ※SMTPSサーバーを公開する場合のみ
iptables -A INPUT -p tcp --dport 465 -j ACCEPT

# 外部からのTCP110番ポート(POP3)へのアクセスを許可
# ※POP3サーバーを公開する場合のみ
iptables -A INPUT -p tcp --dport 110 -j ACCEPT

# 外部からのTCP995番ポート(POP3S)へのアクセスを許可
# ※POP3Sサーバーを公開する場合のみ
iptables -A INPUT -p tcp --dport 995 -j ACCEPT

# 外部からのTCP143番ポート(IMAP)へのアクセスを許可
# ※IMAPサーバーを公開する場合のみ
iptables -A INPUT -p tcp --dport 143 -j ACCEPT

# 外部からのTCP993番ポート(IMAPS)へのアクセスを許可
# ※IMAPSサーバーを公開する場合のみ
iptables -A INPUT -p tcp --dport 993 -j ACCEPT

# 外部からのUDP1194番ポート(OpenVPN)へのアクセスを許可
# ※OpenVPNサーバーを公開する場合のみ
#iptables -A INPUT -p udp --dport 1194 -j ACCEPT

# 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

2. シェルスクリプトの編集

シェルスクリプトを自身の環境に合わせて,編集してください。特に,最初のインターフェイス名の定義の行を,使用しているインターフェイスに置き換えてください。(eth0 や eth1 …など)また,サーバとして公開するサービスに合わせて,公開しないサービスのポートを開放する行のコメントアウトを行なってください。デフォルトでは主要なサービスのポートは開けています。

3. シェルスクリプトの実行

sudo で先ほど編集した Build_firewall.sh を実行してください。

#cd でシェルスクリプトを保存したディレクトリに移動後

sudo bash Build_firewall.sh

4. iptables-persistent のインストール

Ubuntu はデフォルトでは起動直後に以前の iptables の設定を読み込んではくれませんので,今回設定した iptables の設定値が起動後に自動的に有効になるように iptables-persistent というツールを用います。インストール時に現在設定されている iptables の設定値を OS 再起動時に設定するかどうか聞かれるので,設定するを選んでください。

#パッケージリストの更新
sudo apt-get update

#iptables-persistant のインストール。
sudo apt-get install iptables-persistent

#現在設定されている内容を設定してください。

もし,iptables-persistent のインストール後に iptables の設定を変更した場合は,下記コマンドを実行して,設定値の自動起動を有効にしてください。

#現在のルールをファイルに出力。
iptables-save > /etc/iptables/rules.v4
#iptables-persistent の再起動
service iptables-persistent restart

以上でファイヤーウォールの構築ができました。iptablse の設定に関しては,自身の環境に合うように適宜,設定を行なってください。今回は国別のアクセスフィルタなどは行なっておらず,本当に簡単な設定になっています。iptables は本当に奥が深いです。私もまだまだ勉強しなければなりません。

One thought on “iptables を用いたファイヤーウォールの構築 – Ubuntu –

  1. Pingback: Ubuntu をインストールしたらやっておきたいこと | はずまないブログ

コメントを残す

メールアドレスが公開されることはありません。