Linux 環境でファイアウォールを構築するお話です。
Linux にはカーネルレベルでパケットフィルタや NAT を行う netfilter という仕組みがあり、それを設定するのが iptables です。iptables をそのまま扱えれば一番良いのですが、柔軟さ故に学習コストは高めです。そのため、firewalld や ufw といった iptables のフロントエンドが存在しています。今回は ufw を使います。
ufw は Uncomplicated Firewall の略で、Python で書かれた iptables のフロントエンドです。
以下、インストールと簡単な使い方です。
インストールと有効化
$ sudo apt install ufw $ sudo ufw enable Command may disrupt existing ssh connections. Proceed with operation (y|n)? y Firewall is active and enabled on system startup $ sudo ufw status Status: active
SSH で作業しましたが、有効化しても切断されることはありませんでした。絶対に切断されないとは言い切れないので、念のため切断されたら八方塞りになる状況では止めておきましょう。
全てを deny して SSH のみ allow する
$ sudo ufw default deny Default incoming policy changed to 'deny' (be sure to update your rules accordingly) $ sudo ufw allow ssh Rule updated Rule updated (v6) atmark@dev:~$ sudo ufw status Status: active To Action From -- ------ ---- 22/tcp ALLOW Anywhere 22/tcp (v6) ALLOW Anywhere (v6)
たったこれだけです。default を deny して、ssh を allow するだけ。簡単ですね。
アプリケーション単位で allow/deny する
ufw app list で有効なアプリケーションの一覧が表示されます。
$ sudo ufw app list Available applications: AIM Bonjour CIFS DNS Deluge Dovecot IMAP Dovecot Secure IMAP IMAP IMAPS IPP KTorrent Kerberos Admin Kerberos Full Kerberos KDC Kerberos Password LDAP LDAPS LPD MSN MSN SSL Mail submission NFS OpenSSH POP3 POP3S PeopleNearby Postfix Postfix SMTPS Postfix Submission SMTP SSH Socks Telnet Transmission Transparent Proxy VNC WWW WWW Cache WWW Full WWW Secure XMPP Yahoo qBittorrent svnserve
この名前をつかって deny/allow するだけです。
$ sudo ufw allow SSH $ sudo ufw allow "WWW Full" $ sudo ufw status Status: active To Action From -- ------ ---- SSH LIMIT Anywhere WWW Full ALLOW Anywhere SSH (v6) LIMIT Anywhere (v6) WWW Full (v6) ALLOW Anywhere (v6)
ルールの削除
2 通りあります。まずは追加したルールをそのまま削除するやり方。
$ sudo ufw delete allow SSH
もう一つは現在のルール一覧を番号付けして、その番号で削除するやり方。
$ sudo ufw status numbered Status: active To Action From -- ------ ---- [1] SSH LIMIT Anywhere [2] WWW Full ALLOW Anywhere [3] SSH (v6) LIMIT Anywhere (v6) [4] WWW Full (v6) ALLOW Anywhere (v6) $ sudo ufw delete 4 Deleting: allow 'WWW Full' Proceed with operation (y|n)?
名前で指定するか、ポート番号で指定するか
ちょっとややこしかったので、軽くまとめておきます。
app list で表示される内容は /etc/ufw/applicatoin.d/ 以下に用意されています。例えば WWW 関係は次のようになっています。
$ cat /etc/ufw/application.d/ufw-webserver [WWW] title=Web Server description=Web server ports=80/tcp [WWW Secure] title=Web Server (HTTPS) description=Web Server (HTTPS) ports=443/tcp [WWW Full] title=Web Server (HTTP,HTTPS) description=Web Server (HTTP,HTTPS) ports=80,443/tcp [WWW Cache] title=Web Server (8080) description=Web Server (8080) ports=8080/tcp
ルールを追加するときのポートの指定は 3 通りあって
- ポート番号の直接指定 - 443/tcp
- プロトコル名 - https
- アプリケーション名 - WWW Secure
このうち、ポート番号の直接指定もプロトコル名も、ルールに登録されるのは数字のポート番号そのものです。allow https としても 443/tcp でルールに登録されます。
アプリケーション名で指定すると、指定した名前そのままで登録されます。
ここでややこしいのが、例えばアプリケーション名とプロトコル名が同じ SSH の場合。allow SSH と書くと名前で登録されますが、allow ssh とすると 22/tcp で登録されます。
接続制限 limit
$ sudo ufw limit ssh
もう一つ、limit というルールがあります。man には次のよう書かれています。
...... ufw will normally allow the connection but will deny connections if an IP address attempts to initiate 6 or more connections within 30 seconds ......
30 秒間に 6 回以上接続を試みた場合に接続を拒否するルールです。SSH などは総当りでログイン試行が来るので、limit をかけておいた方が良いでしょう。