2026年10月13日

2026年10月13日

iptables で特定の IP・ポートをブロックする手順:順序・IPv6・永続化の注意点

iptables で特定の IP アドレスやポートをブロックするには、iptables -I INPUT -s 対象 -j DROP のように許可ルールより前に遮断ルールを入れ、IPv6 は ip6tables で別に設定し、最後にルールを保存して再起動後も残るようにします。この記事では、攻撃元 IP の緊急ブロックから、範囲・ポート単位の遮断、大量のアドレスを扱う ipset、ログの取り方、保存方法までを順に説明します。WordPress サイトで不審なアクセスを止めたい場面を想定していますが、CDN を使っている場合は iptables でのブロックが向かないケースもあるので、その点もあわせて解説します。

作業前に確認すること

iptables の種類と、ほかの管理ツール

sudo iptables -V
systemctl status ufw firewalld

iptables -V の結果に (nf_tables) と表示されれば、中身は nftables で動く互換版、(legacy) なら従来版です。どちらでもコマンドの書き方は同じですが、混在させると管理が分かりにくくなります。

ufw や firewalld が有効なサーバーでは、iptables を直接触るより ufw deny from 203.0.113.50 や firewalld のゾーン設定を使うほうが、設定の再読み込みで消えるといったトラブルを避けられます。この記事は、iptables を直接管理しているサーバーを前提にしています。

自分を締め出さない準備

遠隔で作業する場合、自分の接続元 IP を誤ってブロックしないことが最優先です。作業前に次を済ませてください。

  • 自分の接続元 IP を確認しておく(echo $SSH_CLIENT の先頭がそれにあたる)
  • 現在のルールを保存する:sudo iptables-save > /root/iptables-before.rules
  • VPS のコンソール機能など、SSH 以外の入り口が使えることを確認する

現在のルールを確認する

sudo iptables -L INPUT -n -v --line-numbers
sudo iptables -S INPUT

iptables はルールを上から順に評価し、最初に一致したルールの動作(ACCEPT や DROP)で決まります。たとえば先頭に「HTTP を許可」があり、その後ろに「この IP を遮断」を追加しても、その IP からの HTTP は先に許可されてしまいます。遮断ルールは -A(末尾に追加)ではなく -I(先頭や指定位置に挿入)で入れるのが基本です。

基本のブロック方法

特定の IP アドレスを遮断する

sudo iptables -I INPUT -s 203.0.113.50 -j DROP

先頭に入れたので、既存の接続(ESTABLISHED)も含めて、この IP からの通信はすべて落ちます。

アドレスの範囲を遮断する

sudo iptables -I INPUT -s 198.51.100.0/24 -j DROP

範囲を広げすぎると、同じ回線事業者を使う正規の利用者まで止めてしまいます。ログで攻撃元の広がりを確認してから範囲を決めてください。

特定のポートを遮断し、一部だけ許可する

データベースのポートを外部から閉じ、アプリケーションサーバーだけ許可する例です。許可ルールを先に置くのがポイントです。

sudo iptables -I INPUT 1 -p tcp -s 10.0.0.5 --dport 3306 -j ACCEPT
sudo iptables -I INPUT 2 -p tcp --dport 3306 -j DROP

DROP と REJECT の違い

DROP は黙って捨て、相手はタイムアウトするまで待たされます。REJECT は拒否したことを返すため、相手はすぐに失敗を知ります。

sudo iptables -I INPUT -p tcp --dport 8080 -j REJECT --reject-with tcp-reset

攻撃元に対しては DROP、社内の利用者が間違えて接続してくるようなポートには REJECT、という使い分けが一般的です。

IPv6 は ip6tables で別に設定する

iptables のルールは IPv4 にしか効きません。サーバーが IPv6 アドレスを持っている場合、IPv6 での通信は素通りになります。

sudo ip6tables -I INPUT -s 2001:db8::/32 -j DROP
sudo ip6tables -L INPUT -n -v --line-numbers

ポートを閉じる設定は、IPv4 と IPv6 の両方に入れてください。ip -6 addr でグローバルな IPv6 アドレスがあるか確認できます。

多数の IP をまとめてブロックする(ipset)

ブロック対象が数十、数百と増えると、1件ずつルールにすると評価が遅くなり、管理もしにくくなります。ipset を使うと、アドレスの集合を1つのルールで扱えます。

sudo ipset create blocklist hash:net
sudo ipset add blocklist 203.0.113.0/24
sudo ipset add blocklist 198.51.100.50
sudo iptables -I INPUT -m set --match-set blocklist src -j DROP

以後は ipset add と ipset del だけで対象を増減でき、iptables のルールは変えずに済みます。IPv6 用には family inet6 を指定した別の集合を作り、ip6tables から参照します。ipset の内容も再起動で消えるため、保存方法はディストリビューションのパッケージ(Debian 系の ipset-persistent など)で確認してください。

ブロックした通信をログに残す

遮断の効果を確かめたり、誤って正規の利用者を止めていないか確認したりするには、DROP の直前に LOG を入れます。ログが大量に出てディスクを圧迫しないよう、件数を制限します。

sudo iptables -I INPUT -s 203.0.113.50 -j DROP
sudo iptables -I INPUT -s 203.0.113.50 -m limit --limit 5/min -j LOG --log-prefix "IPT-BLOCK: "

後から入れた LOG が先頭になり、LOG → DROP の順になります。ログはカーネルログに出るため、journalctl -k | grep IPT-BLOCK などで確認できます。

ブロックを解除する

# 番号で削除(番号は --line-numbers で確認)
sudo iptables -D INPUT 3

# 追加したときと同じ条件で削除
sudo iptables -D INPUT -s 203.0.113.50 -j DROP

再起動後も残るように保存する

iptables のルールはメモリ上にあるだけで、保存しないと再起動で消えます。

  • Debian / Ubuntu:iptables-persistent(netfilter-persistent)パッケージを入れ、sudo netfilter-persistent save で /etc/iptables/rules.v4 と rules.v6 に保存する
  • RHEL 系:iptables-services パッケージを使う場合、/etc/sysconfig/iptables に保存する(2026年10月現在、RHEL 系の標準は firewalld なので、まずそちらを使うかを検討する)

保存ファイルを直接編集して反映する場合、Debian 系では iptables-apply を使うと、確認の応答がなければ一定時間で元に戻せます。

WordPress サイトで iptables が向かないケース

CDN やリバースプロキシの後ろにある場合

Cloudflare などの CDN を経由している場合、サーバーに届く通信の送信元は CDN のアドレスです。iptables で攻撃者の IP を指定しても一致せず、逆に CDN のアドレスを遮断するとサイト全体が見えなくなります。この構成では、CDN 側の WAF やアクセスルール、またはアプリケーション側(Web サーバーの設定やセキュリティプラグイン)で、転送された実際のクライアント IP を使って遮断します。

URL 単位で止めたい場合

xmlrpc.php やログイン画面への攻撃のように、特定の URL だけ止めたいなら、iptables ではなく Web サーバー(Nginx や Apache)の設定で扱います。iptables は IP とポートの層で動くため、HTTPS の中身は見えません。

Docker を使っている場合

Docker で公開したポートへの通信は INPUT チェーンを通らないことがあります。コンテナ宛ての通信を遮断するには、Docker が用意している DOCKER-USER チェーンにルールを入れます。

sudo iptables -I DOCKER-USER -s 203.0.113.50 -j DROP

手作業のブロックを自動化する

ログイン試行の繰り返しなど、パターンが決まっている攻撃は、fail2ban でログを監視して自動的に一定時間ブロックするほうが運用は楽です。手作業のブロックは、緊急対応や恒久的に遮断したいアドレスに絞ると、ルールが増えすぎずに済みます。

まとめ

  • 遮断ルールは -I で許可ルールより前に入れる。iptables は上から順に評価する
  • IPv6 は ip6tables で別に設定しないと素通りになる
  • 対象が多いときは ipset でまとめ、ルールは1本にする
  • LOG は件数を制限し、DROP の直前に入れる
  • 保存しないと再起動で消える。Debian 系は netfilter-persistent で保存する
  • CDN の後ろでは iptables での IP 遮断は効かない。CDN 側やアプリケーション側で止める
  • 作業前に自分の接続元 IP の確認、ルールのバックアップ、コンソール経路の確保を行う

お気軽にご相談ください

お見積りへ お問い合わせへ
▲