田舎のパパが日常で感じた気になる話を発信するブログです。

気になるボックス

VPS

VPS における iptables の設定

投稿日:

iptables とは、Linux に実装されたパケットフィルタリング型のファイアウォール機能です。今後のメンテナンスを考えてシェルスクリプトを利用して適用する手順を採用します。その手順を残します。

スポンサーリンク

シェルスクリプトの作成

ファイルの作成

スクリプトを記述するためのファイルを作成します。作成したファイルは所有者のみ全ての権限を与えます。

$ sudo touch iptables.sh
$ sudo chmod 700 iptables.sh
$ sudo vi iptables.sh

スクリプトの記述

パケットフィルタリングルールを適用するスクリプトをファイルに記述します。適用する内容について下記のとおりです。

  • 受信、転送はすべて拒否、送信はすべて許可
  • 内部から行ったアクセスに対する外部からの返答アクセスを許可
  • TCP SYN Flood攻撃対策
  • Smurf攻撃対策
  • ICMP Redirectパケットは拒否
  • Source Routedパケットは拒否
  • フラグメント化されたパケットはログを記録して破棄
  • NetBIOS関連のアクセスはログを記録せずに破棄
  • Ping of Death攻撃対策
  • 全ホスト宛パケットはログを記録せずに破棄
  • 113番ポートへのアクセスには拒否応答
  • 各種サービスの公開
  • 必要最低限のポート(SSH、HTTP関連)のみ許可しています。別のポートが必要になったら、その都度追加します。
    ※SSHのポート(85行目)は、「/etc/ssh/sshd_config」ファイルに設定した値にします。
    ※ServersMan@VPS の場合は、ServersMan サービスを利用する場合は 8080ポートも必要。

  • IPアドレス指定拒否

各項目の詳細は、「iptables 設定シェルスクリプトの付箋メモ」が参考になると思います。
実際のスクリプトは以下のとおりです。SSHポート(85行目)に気をつければ、そのまま利用することも可能だと思います。

#!/bin/bash

# ファイアウォール停止(すべてのルールをクリア)
/etc/rc.d/init.d/iptables stop

# デフォルトルール
# ※以降のルールにマッチしなかった場合に適用するルール
/sbin/iptables -P INPUT   DROP   # 受信はすべて破棄
/sbin/iptables -P OUTPUT  ACCEPT # 送信はすべて許可
/sbin/iptables -P FORWARD DROP   # 通過はすべて破棄

# 自ホストからのアクセスをすべて許可
/sbin/iptables -A INPUT -i lo -j ACCEPT

# 内部から行ったアクセスに対する外部からの返答アクセスを許可
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SYN Cookiesを有効にする ※TCP SYN Flood攻撃対策
/sbin/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攻撃対策
/sbin/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
    /sbin/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
    /sbin/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

# フラグメント化されたパケットはログを記録して破棄
/sbin/iptables -N FRAGMENT
/sbin/iptables -A FRAGMENT -j LOG --log-prefix '[IPTABLES FRAGMENT] : '
/sbin/iptables -A FRAGMENT -j DROP
/sbin/iptables -A INPUT -f -j FRAGMENT

# NetBIOS関連のアクセスはログを記録せずに破棄
# ※不要ログ記録防止
/sbin/iptables -N NET_BIOS
/sbin/iptables -A NET_BIOS -j DROP
/sbin/iptables -A INPUT -p tcp -m multiport --dports 135,137,138,139,445 -j NET_BIOS
/sbin/iptables -A INPUT -p udp -m multiport --dports 135,137,138,139,445 -j NET_BIOS
/sbin/iptables -A OUTPUT -p tcp -m multiport --sports 135,137,138,139,445 -j NET_BIOS
/sbin/iptables -A OUTPUT -p udp -m multiport --sports 135,137,138,139,445 -j NET_BIOS

# 1秒間に4回を超えるpingはログを記録して破棄
# ※Ping of Death攻撃対策
/sbin/iptables -N PING_DEATH
/sbin/iptables -A PING_DEATH -m limit --limit 1/s --limit-burst 4 -j ACCEPT
/sbin/iptables -A PING_DEATH -j LOG --log-prefix '[IPTABLES PINGDEATH] : '
/sbin/iptables -A PING_DEATH -j DROP
/sbin/iptables -A INPUT -p icmp --icmp-type echo-request -j PING_DEATH

# 全ホスト(ブロードキャストアドレス、マルチキャストアドレス)宛パケットはログを記録せずに破棄
# ※不要ログ記録防止
/sbin/iptables -N BROADCAST
/sbin/iptables -A BROADCAST -j DROP
/sbin/iptables -A INPUT -d 255.255.255.255 -j BROADCAST
/sbin/iptables -A INPUT -d 224.0.0.1 -j BROADCAST

# 113番ポート(IDENT)へのアクセスには拒否応答
# ※メールサーバ等のレスポンス低下防止
/sbin/iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset

#----------------------------------------
# 各種サービスを公開する場合の設定 START
#----------------------------------------
/sbin/iptables -N SERVICE
/sbin/iptables -A SERVICE -j ACCEPT

# 外部からのTCP22番ポート(SSH)へのアクセスを許可
/sbin/iptables -A INPUT -p tcp --dport 22 -j SERVICE

# 外部からのTCP/UDP53番ポート(DNS)へのアクセスを許可
/sbin/iptables -A INPUT -p udp --dport 53 -j SERVICE

# 外部からのTCP80番ポート(HTTP)へのアクセスを許可
/sbin/iptables -A INPUT -p tcp --dport 80 -j SERVICE

# 外部からのTCP443番ポート(HTTPS)へのアクセスを許可
/sbin/iptables -A INPUT -p tcp --dport 443 -j SERVICE

#----------------------------------------
# 各種サービスを公開する場合の設定  END
#----------------------------------------

# 拒否IPアドレスからのアクセスはログを記録せずに破棄
# ※拒否IPアドレスは/root/deny_ipに1行ごとに記述しておくこと
# (/root/deny_ipがなければなにもしない)
if [ -s /root/iptables/deny_ip ]; then
     /sbin/iptables -N DENY_HOST
     for ip in `cat /root/deny_ip`
     do
         /sbin/iptables -A DENY_HOST -s $ip -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES DENY_HOST] : '
         /sbin/iptables -A DENY_HOST -s $ip -j DROP
         /sbin/iptables -I INPUT -j DENY_HOST
     done
fi

# 上記のルールにマッチしなかったアクセスはログを記録して破棄
/sbin/iptables -A INPUT -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES INPUT] : '
/sbin/iptables -A INPUT -j DROP
/sbin/iptables -A FORWARD -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES FORWARD] : '
/sbin/iptables -A FORWARD -j DROP

# サーバー再起動時にも上記設定が有効となるようにルールを保存
/etc/rc.d/init.d/iptables save

# ファイアウォール起動
/etc/rc.d/init.d/iptables restart

シェルスクリプトの実行

シェルスクリプトを実行して記述したパケットフィルタリングルールを適用します。
※スクリプト実行後、現在サーバに接続しているターミナルとは別にターミナルを起動してログインできるか確認します。もし接続できない場合は、接続しているターミアナルを利用してシェルスクリプトを修正して再実行してください。

$ sudo ./iptables.sh
ファイアウォールルールを適用中:                            [  OK  ]
チェインポリシーを ACCEPT に設定中mangle filter nat        [  OK  ]
iptables モジュールを取り外し中                            [  OK  ]
ファイアウォールのルールを /etc/sysconfig/iptables に保存中[  OK  ]
ファイアウォールルールを適用中:                            [  OK  ]
チェインポリシーを ACCEPT に設定中mangle filter nat        [  OK  ]
iptables モジュールを取り外し中                            [  OK  ]
iptables ファイアウォールルールを適用中:                   [  OK  ]

接続できなくなったら・・・

接続しているターミナルも落としてしまい、接続不可になった場合の対処方法

VPS 対処方法
さくらVPS コントロールパネルのリモートコンソールからiptablesをクリアする
ServersMan@VPS My DTI の 「iptablesの初期化」ボタンにてクリアする

-VPS
-,

Copyright© 気になるボックス , 2016 AllRights Reserved Powered by AFFINGER4.