自分のプロバイダ以外の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.dddの22番ポートへのアクセスを許可:
$ iptables -A INPUT -p tcp --dport 22 -j ACCEPT -s aaa.bbb.ccc.ddd
-s
オプション)
範囲指定で許可(IPアドレス範囲xxx.yyy.0.0/16の22番ポートへのアクセスを許可:
$ 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-save
とiptables-restore
を使うと良いでしょう。
しかし、もしご自分が固定IPアドレスを使っていない場合は、iptablesルールの自動的な適用は少し危険です。iptablesルールを変更する前にうっかり利用プロバイダを変更してしまった場合、たとえシステムを再起動しようとも二度とsshアクセスできなくなるおそれがあるからです。何らかの事情でプロバイダを頻繁に変更する方は、なるべく自動適用は避け、少し面倒かもしれませんがシステム再起動時に手動で先ほどのシェルを実行するのが安全かもしれません。
以上