背景
ミニPCを手に入れたので、自宅サーバはじめの一歩として、
Ubuntu serverのインストールとVPNのWireguardをセットアップしていく
(ラズパイは実家にVPNとして放置してきました)
目次
環境
ミニPC: Lenovo ThinkCentre M720q
OS: Ubuntu Server 24.04.1LTS
注意
Ubuntu Serverのインストールは既に終わってる前提で進めていきます
インストール方法については公式ページや、他の人の記事, 動画を参考にしてください
SSHのセットアップ
手順0: IPアドレスの固定化
既に固定化出来ている, 必要ない人は読み飛ばしてください
IPアドレスの固定化にはnetplanを編集する必要があるので、/etc/netplan/99-config.yaml
を作成し、これを編集していきます
network: version: 2 renderer: networkd ethernets: アダプター名: dhcp4: false dhcp6: false addresses: [設定したいIPアドレス/24] routes: - to: default via: デフォルトゲートウェイ nameservers: addresses: [DNSサーバ]
また、アダプター名はip addr
コマンドで見つけることができます
編集が出来たら、以下を叩き、root以外中身をいじれないようにします
sudo chmod 600 /etc/netplan/99-config.yaml
ここまで出来たら、以下を叩き、IPアドレスの固定化は終了です
sudo netplan apply
手順1: OpenSSHのインストール
Ubuntu Serverのインストール時にOpenSSHをインストールしていない場合、インストールが必要です
以下を叩き、SSHサーバをインストールします
sudo apt update && sudo apt install openssh-server
インストールが出来たら、一度再起動し以下を叩き、Active: active (running)になっていればOKです
sudo systemctl status ssh
もし、Active: inactive (dead)の場合は以下を叩きSSHを起動してください
sudo systemctl restart ssh
起動しているのが確認できたら、以下を叩きシステム起動時に自動でSSHも起動するようにします
sudo systemctl enable ssh
手順2: SSHの設定
SSHの詳細設定は/etc/ssh/sshd_config
から行えます
今回は以下のような設定を入れていきます
- 認証方法を公開鍵認証のみに
- リッスンポートの変更
- rootでのログイン無効化
- 空パスワードユーザのログイン無効化
- Google Authenticatorを使った2段階認証
公開鍵, 秘密鍵の作成とサーバへの転送
各種設定を入れていく前に接続に必要な公開鍵と秘密鍵を作成していきます
ここからは、SSHサーバへ接続するクライアントPCでの作業が必要です
まず、クライアントPC側で以下を叩き、公開鍵と秘密鍵の鍵ペアを作成します
# client ssh-keygen -t ed25519
保存先や、パスフレーズは任意のものを使用してください
正常に作成されるとこのように表示されます
$ ssh-keygen -t ed25519 Generating public/private ed25519 key pair. Enter file in which to save the key (/home/[ユーザ名]/.ssh/id_ed25519): [任意の保存場所] Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in [秘密鍵の保存場所] Your public key has been saved in [公開鍵の保存場所] The key fingerprint is: SHA256:[作成した鍵のフィンガープリント] The key's randomart image is: +--[ED25519 256]--+ | .=Ooo oo| | . . E .| | . . E .| | . . E .| | O . . E .| | . . E .| | . . E .| | . . E .| | . . E .| +----[SHA256]-----+
次に、以下を叩き、作成した公開鍵をSSHサーバへ転送します
ここでSSHサーバへ転送するのは公開鍵(拡張子が.pub)になります、秘密鍵は大切にクライアントPCで保管してください
# client ssh-copy-id -i [公開鍵の保存場所] [SSHサーバのユーザ名]@[SSHサーバのIPアドレス]
クライアントPCがWindows等のssh-copy-id
コマンドが無い場合、
以下の手順を参考に~/.ssh/authorized_keys
へ公開鍵を追加してください
まず、以下を叩き、公開鍵をSSHサーバへコピーします
# client scp [公開鍵の保存場所] [SSHサーバのユーザ名]@[SSHサーバのIPアドレス]:~/pubkey.pub
パスワードを入力し、コピーが完了したら、以下を叩き、公開鍵ををSSHサーバの~/.ssh/authorized_keys
へ追記します
# server sudo cat ~/pubkey.pub >> ~/.ssh/authorized_keys
追記できたら、先程コピーしてきたSSHサーバ側の公開鍵は必要ないので、削除しておきます
# server rm -rf ~/pubkey.pub
2段階認証以外の設定
下準備が完了したら、まずは2段階認証以外の設定をしていきます
- 認証方法を公開鍵認証のみに
- リッスンポートの変更
- rootでのログイン無効化
- 空パスワードユーザのログイン無効化
/etc/ssh/sshd_config
を適当なエディタで開き、末尾に以下を追記します
(設定が被っていても、末尾に記載されている設定が優先されます)
# User Settings ## 公開鍵認証を有効化 PubkeyAuthentication yes ## パスワード認証を無効化 PasswordAuthentication no ## リッスンポートの変更 port [任意のポート番号] ## rootでのログイン禁止 PermitRootLogin no ## 空パスワードユーザのログイン禁止 PermitEmptyPasswords no
ポート番号は任意ですがウェルノウンポート以外をオススメします
また、インターネットからアクセスする場合、環境によっていは使用できるポートが制限されている場合があるので、適宜確認してください
保存できたら、一度SSHサーバを再起動させます
sudo systemctl restart ssh
公開鍵を使った接続確認
ここで一度、公開鍵認証のみでログインできるか確認をします
以下を叩き、正常にログインできれば問題ありません
# client ssh -i [秘密鍵の保存場所] -p [設定したポート番号] [SSHサーバのユーザ名]@[SSHサーバのIPアドレス]
また、以下を叩きPermission denied (publickey).
と表示されればパスワード認証もきちんと無効化されています
# client ssh -p [設定したポート番号] [SSHサーバのユーザ名]@[SSHサーバのIPアドレス]
もし、設定できているはずなのに弾かれる場合は、~/.ssh/authorized_keys
のパーミッションが誤っている可能性があります
以下を叩いて、正しいパーミッションにして再挑戦してみてください
sudo chmod 600 ~/.ssh/authorized_keys
GoogleAuthenticatorを使った2段階認証
必要ない方は読み飛ばしてください
SSH接続する際に、公開鍵認証とOTPを求めることが出来ます
以前に記事としてまとめたので、そちらを参考にしてください
(気力があれば、こちらの記事に追記しておきます)
RaspberryPiにUbuntuサーバーを入れて公開鍵とGoogle Authenticator使ってSSHするまで - どっかの元高専生の技術備忘録
Wireguardのセットアップ
SSHできることが確認できたら、次にWireguardをセットアップしていきます
Wireguadについては以下の記事がわかりやすいので、紹介させていただきます
Wireguardのインストール
以下を叩き、Wireguradをインストールしていきます
sudo apt update && sudo apt install wireguard
フォワーディング設定
VPNネットワーク外とも通信が行えるように、IPフォワーディングするようにカーネルパラメータを編集していきます
/etc/sysctl.conf
ファイルを適当なエディタで開き、net.ipv4.ip_forward=1
にします
28c28 < #net.ipv4.ip_forward=1 --- > net.ipv4.ip_forward=1
設定ファイルが更新できたら、以下を叩き、設定を読み込ませます
sudo sysctl -p
公開鍵, 秘密鍵の生成
※WireguadはP2P接続となるので、サーバ, クライアントという概念は無いですが、便宜上サーバ, クライアントという表現を使用します
フォルダの作成
管理がしやすいように、鍵を格納するフォルダを作成します
sudo mkdir /etc/wireguard/keys sudo mkdir /etc/wireguard/keys/server sudo mkdir /etc/wireguard/keys/client
サーバ側の公開鍵, 秘密鍵の作成
まずは、秘密鍵を以下を叩き作成していきます
sudo wg genkey | sudo tee /etc/wireguard/keys/server/server_secret.key
作成できたら、次に公開鍵を以下を叩いて作成していきます
sudo cat /etc/wireguard/keys/server/server_secret.key | sudo wg pubkey | sudo tee /etc/wireguard/keys/server/server_public.pub
公開鍵, 秘密鍵の作成ができたらroot以外中身をいじれないようにします
sudo chmod 600 /etc/wireguard/keys/server/*
クライアント側の公開鍵, 秘密鍵の作成
手順はサーバ側と同じなので簡単だと思います
また、任意ですが事前共有鍵を使用することも出来ます、
今回は使用する前提で進めていきますが、不要な方は読み飛ばしてください
クライアントが複数ある場合、区別がつくような命名をしてください
今回は以下のような命名にしました
クライアント | 公開鍵のパス | 秘密鍵のパス | 事前共有鍵のパス |
---|---|---|---|
スマホ1台目 | keys/client/client_xperia1v_public.key | keys/client/client_xperia1v_secret.key | keys/client/client_xperia1v_preshared.key |
スマホ2台目 | keys/client/client_xperia5iii_public.key | keys/client/client_xperia5iii_secret.key | keys/client/client_xperia5iii_preshared.key |
ノートPC | keys/client/client_laptop_public.key | keys/client/client_laptop_secret.key | keys/client/client_laptop_preshared.key |
事前共有鍵を使用する場合は、以下のコマンドを使用してください
sudo wg genkey | sudo tee [事前共有鍵の保存先]
各種鍵の作成が出来たらroot以外中身をいじれないようにします
sudo chmod 600 /etc/wireguard/keys/client/*
サーバ側設定ファイルの作成
VPNのインターフェイス名をwg0
としたいので、/etc/wireguard/wg0.conf
を作成し、編集していきます
また、設定ファイルにはInterface, Peerがあり、それぞれ自分自身の設定, 接続先の設定となっています
サーバ側の場合、InterfaceはVPNサーバ, Peerはクライアントとなります
従って、今回は接続クライアントが3台なので、Peerの設定も3台分必要ですが1台分のみ書いています
[Interface] Address = [VPNで使用したいIPレンジ(CIDR表記 /24とか)] SaveConfig = true PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE ListenPort = [任意のポート番号] PrivateKey = [server_secret.keyの内容] [Peer] # Xperia 1V PublicKey = [client_xperia1v_public.keyの内容] PresharedKey = [client_xperia1v_preshared.keyの内容] AllowedIPs = [このクライアントに割り当てるIPアドレス(CIDR表記 /32になる)]
また、Interface側の設定にあるPortUP, PortDownでは、
VPNインターフェイス(wg0)と物理インターフェイス(eth0)とをNATするルールを、起動時に作成, 終了時に削除するようになっています
物理インターフェイス名は環境によって変わるので、適宜変更してください
クライアント側設定ファイルの作成
次にクライアント側の設定ファイルを作成していきます
クライアント側の場合、Interfaceはクライアント, PeerはVPNサーバとなります
従って、Peerの設定もVPNサーバ1台分のみとなります
[Interface] Address = [このクライアントに割り当てるIPアドレス (CIDR表記 /24とか)] DNS = [DNSサーバのIPアドレス (8.8.8.8とか)] PrivateKey = [client_xperia1v_secret.keyの内容] [Peer] PublicKey = [server.pubの内容] PresharedKey = [client_xperia1v_preshared.keyの内容] AllowedIPs = 0.0.0.0/0 Endpoint = [サーバのアドレス]:[任意のポート番号] PersistentKeepalive = 25
設定ファイルのパーミッション変更
各種設定ファイルの作成が出来たら、root以外中身をいじれないようにします
sudo chmod 600 /etc/wireguard/*.conf
Wireguardの起動
以下を叩きwireguardを起動させます
sudo wg-quick up wg0
正常に起動できたら、スタートアップに登録します
sudo systemctl enable wg-quick@wg0
これにて、Wireguardのセットアップは完了です
作成したクライアント側設定ファイルを、qrencode
等を使用して、インポートしたうえで接続できるようになります
ファイヤーウォールの設定
最後に、ファイヤーウォールの設定をしていきます
ここは、環境によって異なってくると思うので、チートシートを乗せておきます
SSHからファイヤーウォールをいじる際には、必ず1セッション残した状態で作業するようにしてください
コマンド | 内容 |
---|---|
sudo ufw enable | ufwの有効化 |
sudo ufw disable | ufwの無効化 |
sudo ufw status | 現在設定されているルールとufwの動作状態 |
sudo ufw default deny | ufwをホワイトリスト方式で運用する |
sudo ufw defalut allow | ufwをブラックリスト方式で運用する |
sudo ufw allow AAAA | AAAAポートへのアクセスを許可する |
sudo ufw deny AAAA | AAAAポートへのアクセスを拒否する |
sudo ufw allow 192.168.0.YY to any port AAAA | 192.168.0.YYからAAAAポートへのアクセスを許可する |
sudo ufw deny 192.168.0.YY to any port AAAA | 192.168.0.YYからAAAAポートへのアクセスを拒否する |
sudo ufw delete N | N番のルールを削除する |