Linux でまともに公開サーバー運用していくなら避けて通れないのがファイアーウィールです。マネージドサービスとして WAF を導入している環境ならともかく、小規模なシングルインスタンスを直接公開しているような場合には、攻撃対策は自分で考える必要があります。
そこで役立つ、というか、もはや自分にとっては必須のツールと言っていいのが iptables です。以下のiptablesの使い方をざっくり整理しておきます。
iptables とは?
iptables は、Linux カーネルに組み込まれている netfilter 機能を操作するためのコマンドラインツールです。
ネットワークパケットに対して、
- ACCEPT(許可)
- DROP(破棄)
- REJECT(拒否応答付きで破棄)
- LOG(ログ出力)
といった処理ルールを定義できます。
例えば:
- 特定の IP からのアクセスを拒否する
- 特定のポート(22 / 80 / 443 等)のみ許可する
- SYN flood 対策を行う
- SSH brute force 対策を行う
.envや/wp-login.phpなどへのスキャン系アクセスを遮断する
といった制御を OS レベルで実施できます。
ipset とは?
iptables 単体でも IP アドレスによるフィルタリングは可能ですが、大量の IP を扱う用途にはあまり向いていません。
例えば、1万件の IP をブロックしたい場合、iptables のルールとして個別に定義すると:
- ルール数が増加する
- マッチング処理が線形探索になる
- CPU 負荷が増加する
- レイテンシが悪化する
といった問題が発生します。
ipset は、IP アドレスやネットワークの 集合(set) を管理するための仕組みであり、ハッシュテーブル等を用いた高速な検索により、大量の IP アドレスを効率的に扱うことができます。
iptables と ipset の関係
iptables は通信を許可/拒否する「ルールエンジン」、 ipset はそのルールが参照する「IP アドレスのリスト管理機構」として機能します。
iptables 側では、以下のように ipset を参照するルールを1行定義します:
iptables -A INPUT -m set --match-set blacklist src -j DROP
これにより、
「blacklist セットに含まれる送信元 IP からの通信はすべて DROP する」
というルールを定義できます。
以後、iptables のルールを変更することなく、
ipset add blacklist 203.0.113.10
のように ipset 側へ IP を追加するだけで、遮断対象を動的に更新できます。
fail2ban 等と組み合わせて、攻撃元 IP を自動的にセットへ追加する構成も一般的です。
iptables の使い方(主要オプション)
コマンド形式
iptables [-t table] command chain [match] [target]
テーブル指定
| オプション | 説明 |
|---|---|
-t filter | デフォルト。パケットフィルタリングを行う |
-t nat | NAT(アドレス変換)を行う |
-t mangle | パケットの書き換えを行う |
-t raw | コネクショントラッキング除外 |
-t security | SELinux 用 |
コマンド
| オプション | 説明 |
|---|---|
-A | ルールを追加(Append) |
-I | ルールを挿入(Insert) |
-D | ルールを削除(Delete) |
-L | ルール一覧表示(List) |
-F | ルール全削除(Flush) |
-P | デフォルトポリシー設定(Policy) |
-N | チェイン作成(New chain) |
-X | チェイン削除 |
マッチ条件
| オプション | 説明 |
|---|---|
-s | 送信元 IP アドレス |
-d | 宛先 IP アドレス |
-p | プロトコル(tcp, udp 等) |
--sport | 送信元ポート |
--dport | 宛先ポート |
-i | 入力インターフェース |
-o | 出力インターフェース |
-m state | 接続状態マッチ |
--state | NEW, ESTABLISHED 等 |
ターゲット
| オプション | 説明 |
|---|---|
-j ACCEPT | 許可 |
-j DROP | 破棄 |
-j REJECT | 拒否 |
-j LOG | ログ出力 |
ipset の使い方(主要コマンド)
セット作成
ipset create blacklist hash:ip
セット削除
ipset destroy blacklist
IP 追加
ipset add blacklist 203.0.113.1
IP 削除
ipset del blacklist 203.0.113.1
セット一覧表示
ipset list
セット内容確認
ipset list blacklist
主なセットタイプ
| タイプ | 説明 |
|---|---|
hash:ip | 単一 IP |
hash:net | ネットワーク |
hash:ip,port | IP + ポート |
list:set | セットの集合 |