先週に引き続き,今回もufwを使いこなすためのレシピを紹介します。今回は実践編となりますので,先週の基礎操作編とあわせて利用してください。
特定のIPアドレスからの接続を許可する
ネットワークの構成上,「このIPアドレスからの接続は安全であると仮定してもいい」(そこには自分が普段使うマシンしかない)といったこともあるでしょう。このような場合は,次の構文を用います。
$ sudo ufw allow from 192.168.254.0/24
この設定は,「192.168.254.*に属するホストからのすべての通信を許す」というものです。個別のホスト単位にしたい場合は,次のようにIPアドレスを指定してください。以下では,192.168.254.10からのすべての通信を受け付けるように設定しています。
$ sudo ufw allow from 192.168.254.10
さらに,以下のようにポート単位で「そのホストからの接続を許可する」設定を書くことができます。以下は,SSHが利用するポート(=22)を,192.168.254.20というホストに対して許しています。
$ sudo ufw allow from 192.168.254.20 to any port ssh
上記では/etc/servicesに書かれている「ssh」というサービス名での表記をしていますが,「22/tcp」などとすることも可能です。さらに,ここで行う指定でapp構文を利用することもできます。
以下は,「192.168.254.*のホストからのSamba関連の接続要求は許す」というものです。
$ sudo ufw allow from 192.168.254.0/24 to any app Samba
ルールの組み合わせと入れ替え
前掲のLIMITキーワードによる指定を行った場合,scpによるコピーなど,「適切な通信にもかかわらず,ufwのLIMIT条件にマッチしてしまう」といった困った状態が起こりえます。
次のような環境を想定してみましょう。
- SSHサーバーは,外部のネットワークと内部のネットワークの双方に接続されている。
- 外部からのSSHブルートフォースを防ぎたい。
- 内部からは,192.168.254.10からscpを用いてコンテンツをアップロードしている。
- このscpは非常に頻繁に行われている。
このような環境では,そのままではsudo ufw limit sshを実行するわけにはいきません。scpによるコピーまでもLIMIT条件に引っかかってしまい,通信不能になってしまうおそれがあるからです。
このような場合は,「特定のIPアドレスからの接続を許可」し,「それ以外の接続はLIMIT」という設定が必要です。次のようにルールを組み合わせて設定します。
$ sudo ufw allow from 192.168.254.10 to any port ssh $ sudo ufw limit ssh
このように設定することで,192.168.254.10からのssh(=scp)接続は自由に行える一方,それ以外のホストからの接続はLIMITにより制限される,という状態になります(図1)。
ここで重要なのは,ルールの設定順です。
上記の設定手順では,「特定のIPアドレスからの接続を許可」した後に,「全ての接続をLIMIT」という順番でルールを指定しています。ufwのルールは上からチェックされますので,この順番が逆になると,「全ての接続をLIMIT」だけが有効になってしまいます。ufwは通常の動作では,「登録した順番で」ルールを評価します。このため,以下のように「全てのSSH接続のLIMIT」を先に設定してしまった場合,そちらの方が優先されてしまいます。
・誤った例
$ sudo ufw limit ssh
$ sudo ufw allow from 192.168.254.10 to any port ssh
この状態でstatusを見ると,以下(図2)のように,「LIMIT」指定の方が上に来ているはずです。
このような状況で,正しい設定に戻すにはどうすればいいのでしょうか?
一つの方法は,単純に,「全てのSSH接続のLIMIT」指定を削除してから,再度追加することです。以下のように操作します。
$ sudo ufw delete limit ssh $ sudo ufw limit ssh
この状態でstatusを見ると,正しい設定になっていることが確認できます(図3)。
ただし,必ずしも削除と追加だけで問題を解決できるわけではありません。より複雑な設定の場合,「設定ルールのこの場所に,新しいルールを追加したい」といった要望もありえます。たとえば,「192.168.254.10からのSSHは許し,192.168.254.20からのSSHはLIMITで限定的に許す。他のSSH接続は全て拒否」などといった場合です。
このような場合,sudo ufw status numberedとinsertキーワードを利用して,「指定した箇所にルールを追加」する操作を行います。
最初に,ufw status numberedで,ルールのナンバーを表示する状態で一覧します(図4)。
$ sudo ufw status numbered
図4における,「1」,もしくは「2」の欄にLIMIT 192.168.254.20のルールが入れば良いわけです(注1)。ufwの「insert」を使うことで,「1」の位置にルールを挿入することができます。insertで指定しない場合,常にルールの最後の位置に追加されることになります(注2)。
$ sudo ufw delete limit from 192.168.254.20 to any port ssh $ sudo ufw insert 1 limit from 192.168.254.20 to any port ssh
- 注1
- この例ではルールが三つしかありませんから,現実的にはDENYする設定を削除して追加しなおせば解決します。ですが,より多くのルールが存在する場合,非常に厄介なことになるでしょう。
- 注2
- ただし,この例ではすでに「LIMIT 192.168.254.20」のルールが存在していますので,このルールを削除する必要があります。若干挙動としては不完全ですが(同じルールがinsertされたのなら,それは「移動」として扱う方が妥当な挙動です),このあたりはufwの将来の拡張に期待してください。
この操作を実際に行った例は,図5のようになります。

