自分のプロバイダ以外のSSHアクセスを全てブロック

自分のプロバイダ以外からのsshアクセス(ポート22番)を制限する方法です。今回はiptablesコマンドを使います。

目次

まずは自分のプロバイダのIPアドレス範囲を知る

例えば、自分のプロバイダからのみSSHアクセスを許可したい場合、自分の使っているプロバイダに割り振られたIPアドレスの範囲を知る必要があります。プロバイダ毎のIPアドレスの割り振りはJPNIC WHOIS Gatewayで検索することができます。なお検索には自分のグローバルIPアドレスが必要です。自分のグローバルIPアドレスを知る方法は色々ありますが、もし自分のマシンが直接インターネットに繋がっているなら$ ifconfigを見るのが一番簡単ですが、もしルーターの背後に居るなら$ curl https://ipinfo.io/ipで取得するといいかもしれません。

TIP: プロバイダによってはたくさんのIPアドレス範囲を持っています。固定IPを使っていない方は普段から自分のIPアドレス範囲をある程度収集しておくと良いでしょう。

iptablesで設定

特定のIPアドレスを許可

IPアドレス aaa.bbb.ccc.ddd22番ポートへのアクセスを許可:

$ iptables -A INPUT -p tcp --dport 22 -j ACCEPT -s aaa.bbb.ccc.ddd

範囲指定で許可(-sオプション)

IPアドレス範囲 xxx.yyy.0.0/1622番ポートへのアクセスを許可:

$ iptables -A INPUT -p tcp --dport 22 -j ACCEPT -s xxx.yyy.0.0/16

範囲指定で許可(--src-rangeオプション)

IPアドレス範囲 xxx.xxx.yyy.zzz から xxx.xxx.zzz.zzz までの22番ポートへのアクセスを許可:

$ iptables -A INPUT -p tcp --dport 22 -j ACCEPT -m iprange --src-range xxx.xxx.yyy.zzz-xxx.xxx.zzz.zzz

全部拒否

全てのIPアドレスの22番ポートへのアクセスを拒否:

$ iptables -A INPUT -p tcp --dport 22 -j DROP

iptablesルールの設定をシェル化

自分のiptables設定を適用するシェルを作っておくと何かと便利です。先ほどの設定を上から順番に適用するシェルを作ってみましょう。

シェルファイルの作成:

$ nano ./iptables-setup.sh

iptables-setup.shの中身:

#!/bin/bash

# 以下は *aaa.bbb.ccc.ddd*, *xxx.xxx.xxx.xxx-xxx.xxx.yyy.zzz*, *xxx.yyy.0.0/16* 以外のSSHアクセスを全て拒否します:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT -s aaa.bbb.ccc.ddd
iptables -A INPUT -p tcp --dport 22 -j ACCEPT -m iprange --src-range xxx.xxx.xxx.xxx-xxx.xxx.yyy.zzz
iptables -A INPUT -p tcp --dport 22 -j ACCEPT -s xxx.yyy.0.0/16
iptables -A INPUT -p tcp --dport 22 -j DROP

# 現在の設定を出力:
echo "Current iptables settings:"
iptables -L

実行権限付与:

$ chmod +x ./iptables-setup.sh

シェル実行:

$ ./iptables-setup.sh

iptablesルールの初期化

上記のiptables -A INPUT ... のコマンドはルールを追加していきます。ルールを一旦初期化したいときは以下のコマンドを使います:

$ iptables -F

システム再起動とiptablesルール初期化

システムを再起動した時にiptablesのルール設定は全て初期化されてしまいます。それらを永続化&再設定したい場合は、iptables-saveiptables-restoreを使うと良いでしょう。

しかし、もしご自分が固定IPアドレスを使っていない場合は、iptablesルールの自動的な適用は少し危険です。iptablesルールを変更する前にうっかり利用プロバイダを変更してしまった場合、たとえシステムを再起動しようとも二度とsshアクセスできなくなるおそれがあるからです。何らかの事情でプロバイダを頻繁に変更する方は、なるべく自動適用は避け、少し面倒かもしれませんがシステム再起動時に手動で先ほどのシェルを実行するのが安全かもしれません。

以上

田中ソフトウェアラボ @TanakaSoftwareLab
田中ソフトウェアラボ公式アカウント。当アカウントでは、「芽萌丸」の運用情報や田中ソフトウェアラボからのお知らせを発信いたします。仕事のご相談は Chatwork ID: akirattii まで。