どっかの元高専生の技術備忘録

10割自分の備忘録用のブログ。

Ubuntu ServerにSSHとWireguardをセットアップする

背景

ミニ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については以下の記事がわかりやすいので、紹介させていただきます

blog.soracom.com

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番のルールを削除する

参考

wiki.archlinux.jp

qiita.com

www.wireguard.com

  翻译: