[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: active

     To                         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: active

    To                         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 と叩いて、リアルタイムにログが出てくる様子を見ることです。想定通りに動いているかどうかの確認ができます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください