[Ubuntu 18.04] ufw で細かい指定条件でファイアウォールを設定する方法
まえがき
Ubuntu 18.04 のデスクトップ版 (だと思う) でファイアウォールの設定をする必要が出てきたのでやってみた。
意外に参考になる情報を見つけるのに時間がかかった。Linux を触っている人の多くはサーバ系の知識はあるがネットワーク、特にファイアウォール設定になるとチンプンカンプンなのだろうか。
グーグル検索で各種ブログや Qiita などのサイトがヒットしたが、そのように思わざるをえないほど日本語の情報は薄い物が多く、僕が欲しい情報は英語サイトで探しながら、且つコマンドが入るかどうかを確認していくことでやりたいことが実現できた。
僕がやりたかったことは、
- 送信元 IP アドレス (またはセグメント)
- 宛先 IP アドレス (またはセグメント)
- TCP か UDP か
- 宛先 TCP/UDP ポート番号
等の条件を組み合わせてファイアウォールのルールを作成することでした。
本投稿は、ufw でおそらく同様の設定をしたいであろう人たちに向けた内容である。
参考
ufw をいろんな Linux (Linux Lite, ラズパイ, Debian) で設定してきました。これらの記事 も参考になろうかと思います。
まず IPv6 はオフにした
IPv6 は使っていないので、ufw の対象外となるように設定ファイルを修正した。
具体的には /etc/default/ufw を vi で編集して IPv6 のパラメータを no にした。
$ cd /etc/default
$ sudo cp -p ufw ufw.org
$ sudo vi ufw
で、/etc/default/ufw を設定したあと、diff コマンドで以下のように確認した。
$ diff ufw.org ufw
7c7
< IPv6=yes
—
> IPV6=no
#
ファイアウォール設定で投入したコマンド (ufw コマンド)
以下のコマンドで設定を行った。
- sudo ufw logging on
- sudo ufw default deny incoming
- sudo ufw default allow outgoing
- sudo ufw allow from 10.1.0.0/24 to any port ssh
- sudo ufw allow from 10.1.0.0/24 to any port 7876 proto tcp
- sudo ufw allow from 10.1.0.0/24 to any port 27876 proto tcp
- sudo ufw allow 7874/tcp
- sudo ufw allow 27874/tcp
特に太字にした 5 行目と 6 行目の設定例が日本語のサイトでは全く見つからなかった。
- 許可する送信元 IP アドレス (IP セグメント) を指定
- tcp を許可する指定
- 許可する宛先ポート番号を指定
↑ コレやりたい人いっぱいいるはずだけど、なぜだか日本語ではこの情報が見つけられなかった。
ufw 設定確認
sudo ufw status コマンドで確認できます。最後に numbered をつけると一番左に通し番号がついて見やすい。

最初はファイアウォールのルールを 1 つ追加するごとに sudo ufw status で確認していきながらやるのが良いだろう。
ufw の ON/OFF
以下 3 つのコマンドで十分ではなかろうか。
- sudo ufw enable
- sudo ufw disable
- sudo ufw reload
1 行目が ufw を ON にする設定で、2 行目が OFF にする設定。3 行目は ufw を再起動する設定で、何か変更したあとに ufw を再起動する時に使う。
設定したファイアウォールのルールを消したいときは sudo ufw delete を使う。1 行ずつルールを削除することが可能だ。サンプルを紹介しておこう。
- sudo ufw delete allow from 10.1.0.0/24 to any port 7876
- sudo ufw delete allow from 10.1.0.0/24 to any port 27876
- sudo ufw delete allow 7874/tcp
- sudo ufw delete allow 27874/tcp
【2020/06/20 追記】ssh のレートリミット
30 秒の間に 6 回以上連続して ssh 接続してくるアクセスを拒否することができる。これが ssh のレートリミット機能だ。
以下のように設定する。
$ sudo ufw limit ssh $ sudo ufw limit ssh comment 'Rate Limit for ssh server'
ufw limit ssh comment ‘コメント’ でそのルールのコメントを付けることができる。設定内容を確認する。
$ sudo ufw status numbered Status: activeTo Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN 10.1.0.0/24 [ 2] 7874/tcp ALLOW IN Anywhere [ 3] 27874/tcp ALLOW IN Anywhere [ 4] 514/udp ALLOW IN 172.16.1.1 [ 5] 7876/tcp ALLOW IN Anywhere [ 6] 27876/tcp ALLOW IN Anywhere [ 7] 22/tcp LIMIT IN Anywhere # Rate Limit for ssh server $
いい感じである。ファイアウオールを再起動する。
$ sudo ufw reload Firewall reloaded $
ログファイル
sudo ufw logging on コマンドを実行することでログを吐いてくれるようになるので、忘れずに入れるようにしよう。
/var/log/syslog と /var/log/ufw.log に記録されていくので grep UFW /var/log/syslog と叩いて検索するか、
$ tail -f /var/log/syslog | grep UFW
のようにしても良いだろう。
【2020/05/08 追記】ロギング設定
/var/log/syslog もしくは /var/log/ufw.log を見ていて気がついたことがあり、追記しておきます。
どうやらデフォルトでは ufw がブロックした通信のみをログに残すように動作するようです。
tail コマンドで眺めていても [UFW BLOCK] と書かれたログしか出力されなかったのを不思議に思ってログレベルを以下のコマンドで変更したところ、
$ sudo ufw logging high
[UFW ALLOW] と [UFW AUDIT] と書かれたログも出力されるようになりました。
ものはついでで
$ sudo ufw logging medium
と叩いてみても、[UFW ALLOW] と [UFW AUDIT] のログも出力されることを確認しました。
ということで、ufw の設定をするときは必ずログレベルの設定を high か medium にするべきです。
僕は medium に設定しました。
ufw についてまとまっていてなかなかの良記事だと思います。一点気になったのは、ルール消去するときに、ポート番号等をたらたら書かずともstatus numberedで1番左に表示される番号で消す方が早いことです(ufw delete 1などでok)。この場合、消去したルール以降の番号がずれるので複数のルールを消すときに毎回確認する必要が出てきますが。
もう中年 様、貴重なお時間を割いてまでフィードバックをいただきありがとうございます。ufw の設定をする時、一発で上手く行かないことが多いのでルールを削除する作業がたいてい発生します。そういう時はゼロからやり直すことが多いので、ご教示頂きました方法 ufw delete 1 を連打することでルールを全部消す、というやり方がシンプルで良いと感じます。ご意見ありがとうございました。