高機能iptables設定スクリプト。
=======================
PACKET FLOW EXAMPLE
=======================
== config ==
ROLES=(SSH)
SSH=(BLOCK_COUNTRY "file{1,2}|TRACK_PROWLER|DROP" LOCAL_COUNTRY FIERWALL IPF "IPS|LOG...|DROP")
...
MAP=("${MAP[@]}" "INPUT -p tcp --dport 60022 -j SSH")
MAP=("${MAP[@]}" "INPUT -j TRAP_PORTSCAN")
MAP=("${MAP[@]}" "FORWARD -j TRAP_PORTSCAN")
== apply ==
INTERNET
______ V ______________________________________________________ _______
INPUT | | TCP UDP ICMP | | |
| TCP 60022 | TRAP_PORTSCAN ( --> TRACK_PROWLER ) --->| POLICY|
| | | | |
|====== | ======|===============================================| |_______|
|====== V ======|===============================================| _______
Layer1 | | | |
| BLOCK_COUNTRY --->| |
|______________________________ V ______________________________| | |
Layer2 | Rule1 | Rule101 | Rule201 | Rule202 | | |
| file1 --> file2 -->TRACK_PROWLER--> DROP --->| |
|______ V ______|______ V ______|______ V ______|_______________| | BLOCK |
Layer3 | | | |
| LOCAL_COUNTRY --->| |
|______________________________ V ______________________________| | |
Layer4 | | | |
| FIERWALL ( --> TRACK_ATTACKER ) --->| |
|______________________________ V ______________________________| | |
Layer5 | | | |
| IPF ( ANTI_PROWLER/ATTACKER ) --->| |
|______________________________ v ______________________________| | |
Layer6 | | | | | |
| IDS/IPS --> LOG --> DROP --->| |
| | | | | |
|============== | ==============================================| |_______|
|============== V ==============================================|
SERVICE| |
| === SSH SERVICE === |
|_______________________________________________________________|
- ロールベースコントロール
- マルチレイヤフィルタリング
- ファイアーウォール
- ポートスキャントラップ
- 国別IPフィルタリング
- プリプロセス/ポストプロセスコマンド実行
- 地域レジストリIP割り当ての自動取得/更新/適用
- 設定保存確認およびタイムアウトによるロールバック
$ mkdir /var/cache/iptables
$ touch /etc/cron.daily/iptables
$ chmod 700 /etc/cron.daily/iptables
$ vi /etc/cron.daily/iptables
> # Paste script.
$ vi /etc/rsyslog.conf
> kern.=debug /var/log/iptables.log
$ bash /etc/cron.daily/iptables
SSHなどのログインポートを設定。複数設定可。
許可した国以外のIPからのパケットを破棄する。
国の設定を即座に更新するには既存のLOCAL_COUNTRYチェーンを初期化して再構築させる必要がある。
拒否した国のIPからのパケットを破棄する。性能が1/2から1/10程度に劣化するため注意が必要。
国の設定を即座に更新するには既存のLOCAL_COUNTRYチェーンを初期化して再構築させる必要がある。
ファイルのデータ行を選択、整形する。
事前に実行するコマンドを設定する。
事後に実行するコマンドを設定する。
任意のロールを作成する。
# TESTロールを作成
ROLES=(TEST)
# TESTロールを適用
MAP=("${MAP[@]}" "INPUT -p tcp --dport 80 -j TEST")
既定のロールルール設定。ルールは左から順に適用される。
ファイル、ユーザー定義チェーン、ジャンプターゲットおよびこれらをあらかじめ結合するフォーマットを組み合わせてルールを構築する。
Compositeタイプによる複数のルールを結合した単一(単層)フィルタと、これを含む複数のルールを多段適用する積層構造の両方のフィルタ構築が可能。これにより多数のソースファイルとチェーンを組み合わせたフィルタを動的に構築可能。
最後のルールは通過させずパケットの処理を決定するべきであるため最後のルールにはジャンプターゲットを設定することが望ましい。
Type | Definition |
---|---|
Chain | 定義済みチェーンまたは大文字とアンダースコアの組み合わせによるチェーンの予約。 |
Target | ジャンプターゲット(ACCEPT/DROP/RETURN/REJECT/LOG/NFQUEUE)。 |
File | /etc/iptables/からの相対パスまたは絶対パス。WL_FILENAMEチェーンを生成。ファイル名を識別子とするためファイルは重複しない固有の名前でなければならない。 |
Composite | 他のタイプの組み合わせ。ROLENAME_ITEMNAMEチェーンを生成。先頭の要素名をロール内の識別子とするためこの名前がロール内で重複してはならない。 |
Name | Description |
---|---|
LOCAL_COUNTRY | LOCAL_COUNTRY_CODEで指定した国のIPのみ通過させる。 |
BLOCK_COUNTRY | BLOCK_COUNTRY_CODEで指定した国のIPを破棄する。 |
FIREWALL | FW_接頭辞によるFirewallモジュールを適用する。各モジュールは個別に利用可能。 |
IPF | 攻撃者および不審者のIPを遮断する。既知のポート(0-1023)は保護しない。 |
IPS/IDS | IPS/IDSが設定されている場合にパケットを転送する。設定がない場合はすべて通過する。 |
TRAP_PORTSCAN | INPUTおよびFORWARDチェーンの末尾に設定することでポートスキャンを補足しIPを追跡する。 |
TRACK_PROWLER | 不審者としてIPを追跡する。 |
TRACK_ATTACKER | 攻撃者としてIPを追跡する。 |
WL_FILENAME | ファイルタイプのルールにより生成されるホワイトリストフィルタ。遮断したIPは不審なIPとして登録される。 |
ROLENAME_ITEMNAME | 複合タイプのルールにより生成されるフィルタ。ファイルのみで構成した場合はホワイトリストフィルタとして動作する。 |
※ 動的に生成されるフィルタは名前の重複に注意。
Module | Target | Option | TRACK |
---|---|---|---|
FW_BROADCAST | ブロードキャストパケット。 | O | X |
FW_MULTICAST | マルチキャストパケット。 | O | X |
FW_FRAGMENT | 断片化されたパケット。 | X | O |
FW_INVALID | 不正なパケット。 | X | X |
FW_NETBIOS | ネットバイオス関連のパケット。 | X | O |
FW_STEALTHSCAN | フラグの不適切なパケット。 | O | O |
FW_SPOOFING | 内部パケットに偽装された外部パケット。 | X | O |
FW_BRUTEFORCE | パスワード解析。 | X | O |
FW_PINGDEATH | pingによるサービス妨害。 | X | O |
FW_SYNFLOOD | TCPプロトコルでのHTTPサービス妨害。 | X | X |
FW_SYNFLOOD_SSL | TCPプロトコルでのHTTPSサービス妨害。 | X | X |
FW_UDPFLOOD | UDPプロトコルでのサービス妨害。 | X | X |
FW_ICMPFLOOD | ICMPプロトコルでのサービス妨害。 | X | X |
# TESTロールにルールを設定
TEST=(whitelist/private LOCAL_COUNTRY FIREWALL IPF IPS ACCEPT)
# 1. whitelist/private
# ファイルに記述されたIPのみ通過させ、ほかは遮断する。
#
# 2. LOCAL_COUNTRY
# 許可した国のIPのみ通過させ、ほかは遮断する。
#
# 3. FIREWALL
# Firewallを適用し接続を検疫する。
#
# 4. IPF
# 攻撃行為または不審行為のあったIPを遮断する。
#
# 5. IPS
# 指定のパケットをIPSへ渡し処理を終える。
#
# 6. ACCEPT
# 渡されなかった残りのパケットをすべて許可し処理を終える。
#
ルールにファイルを指定した場合、ファイルに記述されたIPからホワイトリストフィルタを生成し適用する。 フィルタはファイル名で識別されるためファイル名を重複させない必要がある。
# whitelist/auth
# プロバイダなどで制限
# http://www.tcpiputils.com/
1.2.3.0/24
外部で作成されたチェーンを使用する場合はプリプロセスでチェーンを作成する必要がある。
TEST=(CUSTOM_FILTER)
...
......
PREPROCESS="sh /etc/iptables/script/preprocess.sh"
#!/bin/sh
# /etc/iptables/preprocess.sh
iptables -N CUSTOM_FILTER
設定後に実行するiptablesのコマンドを予約する。
MAP=("${MAP[@]}" "INPUT -p tcp --dport 80 -j PUBLIC")
地域レジストリから取得するIP割り当ての更新間隔。
IDSまたはIPSを使用する場合に設定する。
国別IPフィルタの構築中このフィルタを使用するアクセスをすべて破棄するか、およびロールに設定されたファイルが存在しない場合にエラーを発生させるかを設定する。
無効化せず放置した場合、IPv6のインターフェイスが攻撃し放題となる。
$ vi /etc/sysctl.conf
# ipv6 disable
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
$ vi /etc/modprobe.d/disable-ipv6.conf
options ipv6 disable=1
$ vi /etc/hosts
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
$ chkconfig ip6tables off
$ /sbin/sysctl -p
$ service network restart
$ reboot
$ ifconfig
$ netstat -an -A inet6
$ lsmod | grep ipv6 # モジュール自体はロードさせる
$ service rsyslog restart
$ vi /etc/logrotate.d/iptables
/var/log/iptables.log {
rotate 14
daily
compress
missing ok
notifempty
postrotate
service rsyslog restart
endscript
}
CentOS 6.6
MIT License
- SSHポート自動設定を修正
- NTPサーバー自動設定をCentOS7に対応
- コードフォーマットを修正
- FW_BROADCASTをFIREWALLから除外
- FW_MULTICASTをFIREWALLから除外
- IPFを攻撃者から照合するよう変更
- GLOBALロールを追加
- FW_INTRUDERをIPFに変更
- 設定保存確認および自動ロールバック機能を追加
- Compositeタイプのホワイトリスト動作を修正
- MAPパラメータを追加
- FORMATパラメータを追加
- Compositeタイプルールを追加
- 国別コードの設定パラメータを変更
- 国別フィルタ名を変更
- 拒否国の適用を手動に変更
- BLACKLIST/WHITELIST機能を削除
- ファイルから生成するフィルタのファイル名部分を大文字に変換するよう変更
- Firewallをリファクタリング
- 言語をshellからbashに変更
- リストファイルの相対パス指定に対応
- FW_STEALTHSCANをFIREWALLフィルタから除外
- IP追跡処理を改善
- IP追跡処理を改善
- Firewallをモジュールごとに利用できるよう改善
- ロールの設定を変更
- FW_BASICフィルタを追加
- FW_SPYをFW_INTRUDERに変更
- FW_INTRUDERをFIREWALLフィルタから除外
- ロールとルールの定義方法を配列に変更
- 仕様を刷新
- サービスへのフィルタ設定をロールベースに変更
- PREPROCESS機能を追加
- POSTPROCESS機能を追加
- Ingress攻撃対策を削除
- ログ記録の制限を緩和
- GRAYLISTの挙動を改善
- Firewallの適用を通信方向に基づいて最適化
- CentOS7のNIC名に対応
- CIDRへの変換時の繰り上がり対応を削除(不要な対応)
- CIDRへの変換時に繰り上がり処理がされない潜在的バグを修正
- チェーン再構築の要否判定が正常に動作しないバグを修正
- OUTPUTチェーンのポリシーをDROPに変更
- CIDRへの変換時にサブネットマスクが分割されないバグを修正(初期設定では影響なし)
- IPリストの適用を高速化
- グレーリスト機能を追加
- SECUREモードを追加
- STRICTモードを削除
- WHITELISTが正常に動作しないバグを修正
- テーブル名が適切に設定されていないバグを修正
- ブルートフォース攻撃対策でNG処理がされていないバグを修正
- ログ記録のバースト制限を緩和
- IPS自動設定が正常に動作しないバグを修正
- IPS自動設定が正常に動作しないバグを修正
- 誤作動回避のため不正パケット発信元の追跡を取り消し
- アンチステルススキャンがkeep-aliveで誤作動する場合があるバグを修正
- IPS自動設定機能を追加
- 厳格モード時に国別IP制限を行わないよう修正
- SSHポート自動設定機能が正常に動作しないバグを修正
- 公開