[Ubuntu] ufw の設定を SoftEther VPN サーバ構築を機に変更した記録
経緯
1 年くらいは運用している Ubuntu に SoftEther VPN サーバ (以下、VPN サーバ) をインストールして構築もほぼ終わった。
もともとこの Ubuntu ではファイアウォール設定のために ufw を使用していた。
今回、VPN サーバを構築時に ufw の設定変更が必要となったのでビフォーアフター的なものを残しておこうと思った。
Ubuntu と ufw のバージョン情報
$ head -6 /etc/os-release NAME="Ubuntu" VERSION="20.04.1 LTS (Focal Fossa)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 20.04.1 LTS" VERSION_ID="20.04" $ sudo ufw --version ufw 0.36 Copyright 2008-2015 Canonical Ltd. $
Ubuntu は 20.14 で ufw が 0.36 のようだ。
VPN サーバ導入前の ufw の設定
$ 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 $
この設定をした時、まだ ufw への理解が浅かったこともあり改善したい点があります。それも含めて変更していきます。
ufw で設定する内容を箇条書きにする
これは過去の ufw 記事でも書いてきたことですが、重要です。まず ufw で設定する事項を明文化していくわけです。
VPN サーバ用のファイアウォール設定が増えるのを踏まえて以下のように書いてみました。
- 入力パケットはデフォルトで拒否する
- 出力パケットはデフォルトで許可する
- NIC1 の IP に対し、10.1.0.0/24 からの ssh 接続を許可する
- ssh のレートリミット設定を有効にする
- NIC1 の IP に対し、172.16.1.1 からのシスログ送信を許可する
- NIC1 の IP に対し、tcp 7874 へのアクセスを許可する
- NIC1 の IP に対し、tcp 27874 へのアクセスを許可する
- NIC1 の IP に対し、tcp 7876 へのアクセスを許可する
- NIC1 の IP に対し、tcp 27876 へのアクセスを許可する
- NIC1 の IP に対し、udp 500 へのアクセスを許可する
- NIC1 の IP に対し、udp 4500 へのアクセスを許可する
- ufw のロギングを ON にする
- ufw のロギングレベルを medium にする
順序性も重要です。sudo ufw status コマンドで設定内容を表示させた時に見やすくなるからです。
上記の赤字で書いた 2 行が VPN サーバ用のファイアウォールの穴あけです。udp の 500 と 4500 を開けることで、IPsec 通信を許可しています。
ちなみに僕は OpenVPN が好きじゃないので OpenVPN のポート (udp 1194) は開けません。
「NIC1 の IP に対し、」とずらずら書いているのは、NIC が 2 枚以上あるような時や、物理 NIC とは別に仮想 NIC (SoftEther で言うところの仮想 LAN カード) がある場合、各 NIC にはそれぞれ別の IP が割り当てられます。そういう場合「こっちの IP に対しては ssh 許可するけどもう一個の方の IP には ssh 許可しない」といった制御をしたくなることがあります。そういう時の為に、たとえ NIC が 1 枚しかなかったとしても、このように書く癖をつけておくと良いと思ってやっていることです。
ufw で投入するコマンドを準備する
これも事前に準備しておいたほうが良いです。
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow in on enp0s25 from 10.1.0.0/24 to 172.16.1.2 port ssh
sudo ufw limit ssh
sudo ufw allow in on enp0s25 from 172.16.1.1 to 172.16.1.2 port 514 proto udp
sudo ufw allow in on enp0s25 to 172.16.1.2 port 7874 proto tcp
sudo ufw allow in on enp0s25 to 172.16.1.2 port 27874 proto tcp
sudo ufw allow in on enp0s25 to 172.16.1.2 port 7876 proto tcp
sudo ufw allow in on enp0s25 to 172.16.1.2 port 27876 proto tcp
sudo ufw allow in on enp0s25 to 172.16.1.2 port 500 proto udp
sudo ufw allow in on enp0s25 to 172.16.1.2 port 4500 proto udp
sudo ufw logging on
sudo ufw logging medium
となります。これを 1 つ 1 つ投入していくわけです。
赤字で書いた 2 行が IPsec を許可するためのファイアウォールルールです。これに「おや?」と思う人がいるかもしれません。
IP が 172.16.1.2 って、それで良いの?という疑問です。
インターネット側から VPN セッションを張ろうとするのであれば、VPN クライアントはグローバル IP 宛にセッションを張る必要があります。インターネット側からどうやって 172.16.1.2 に対して VPN セッションを張るのか?
これは、NAT を使っています。
我が家はヤマハの RTX1100 をホームルータとして使っていますが、このルータがグローバル IP (しかも固定のグローバル IP) を持っています。
で、RTX1100 に NAT の設定をすることで、グローバル IP 宛の通信を Ubuntu の 172.16.1.2 の IP に変換して届けるわけです。Destination NAT とかスタティック NAT とか、ポートフォワードとか言われるやつですね。
nat descriptor type 2 masquerade
nat descriptor address outer 2 secondary
nat descriptor address inner 2 172.16.1.1-172.16.1.254
nat descriptor masquerade static 2 1 172.16.1.2 tcp 7874
nat descriptor masquerade static 2 2 172.16.1.2 tcp 27874
nat descriptor masquerade static 2 3 172.16.1.2 tcp 7876
nat descriptor masquerade static 2 4 172.16.1.2 tcp 27876
nat descriptor masquerade static 2 5 172.16.1.2 udp 500
nat descriptor masquerade static 2 6 172.16.1.2 udp 4500
↑ この NAT 設定を RTX1100 に入れています。
赤字の 2 行が IPsec パケットを NAT 処理する部分です。
nat descriptor masquerade static の後の「2 5」と「2 6」は連番的に振るものなので、もしこの設定を使われたい場合はそのままコピってもうまく動かないと思います。この部分だけ環境に合わせて使っていただくのが良いでしょう。
いざ ufw の設定変更!
まず既存の ufw 設定を全部消すために sudo ufw delete 1 を必要な回数だけ実行します。以下のように。
$ sudo ufw delete 1 Deleting: allow from 10.1.0.0/24 to any port 22 proto tcp Proceed with operation (y|n)? y Rule deleted $
これを設定されている数だけ実施すると ufw で設定した内容が空っぽになります。空っぽの状態で sudo ufw status を叩くと以下のようになります。
$ sudo ufw status
Status: active
$
この空っぽの状態から設定するほうが楽ですのでこのようにしています。
$ sudo ufw default deny incoming Default incoming policy changed to 'deny' (be sure to update your rules accordingly) $ sudo ufw allow in on enp0s25 from 10.1.0.0/24 to 172.16.1.2 port ssh Rule added $ sudo ufw limit ssh Rule added $ sudo ufw allow in on enp0s25 from 172.16.1.1 to 172.16.1.2 port 514 proto udp Rule added $ sudo ufw allow in on enp0s25 to 172.16.1.2 port 7874 proto tcp Rule added $ sudo ufw allow in on enp0s25 to 172.16.1.2 port 27874 proto tcp Rule added $ sudo ufw allow in on enp0s25 to 172.16.1.2 port 7876 proto tcp Rule added $ sudo ufw allow in on enp0s25 to 172.16.1.2 port 27876 proto tcp Rule added $ sudo ufw allow in on enp0s25 to 172.16.1.2 port 500 proto udp Rule added $ sudo ufw allow in on enp0s25 to 172.16.1.2 port 4500 proto udp Rule added $ sudo ufw logging on Logging enabled $ sudo ufw logging medium Logging enabled $
全行エラーなく設定が入った!設定内容を確認しましょう。
$ sudo ufw status numbered Status: activeTo Action From
-- ------ ----
[ 1] 172.16.1.2 22/tcp on enp0s25 ALLOW IN 10.1.0.0/24 [ 2] 22/tcp LIMIT IN Anywhere [ 3] 172.16.1.2 514/udp on enp0s25 ALLOW IN 172.16.1.1 [ 4] 172.16.1.2 7874/tcp on enp0s25 ALLOW IN Anywhere [ 5] 172.16.1.2 27874/tcp on enp0s25 ALLOW IN Anywhere [ 6] 172.16.1.2 7876/tcp on enp0s25 ALLOW IN Anywhere [ 7] 172.16.1.2 27876/tcp on enp0s25 ALLOW IN Anywhere [ 8] 172.16.1.2 500/udp on enp0s25 ALLOW IN Anywhere [ 9] 172.16.1.2 4500/udp on enp0s25 ALLOW IN Anywhere $
いい感じ。
おまけ
ufw の設定変更が終わったら sudo ufw reload を実行して ufw を再起動する必要があるかと思っていましたが、マストではないようですね。
sudo ufw allow なんとか〜 というコマンドを実行した時点からそのように動作する仕様のようです。ファイアウォールの動作としては一般的かと思います。
ufw の動作確認の方法として簡単なのが、sudo tail -f /var/log/ufw.log と叩いて、リアルタイムにログが出てくる様子を見ることです。想定通りに動いているかどうかの確認ができます。