使えるVPN-中継サーバ設定

2025/11/09

さくらVPS (AlmaLinux 9) WireGuard VPN構築 サーバー編

目的

512MBメモリのさくらインターネットVPS(AlmaLinux9)に、以下の構成で安全なVPN中継サーバを構築する。

WireGuard (VPN)
firewalld (nftables backend)
fail2ban (SSH保護)
swapfile (2GB)

構成概要

項目設定値備考
VPSグローバルIP160.xxx.xxx.185
外向きNICens3さくらVPS以外の方はここは要確認
SSHポート5xxx2/tcp50000台の任意なポートを設定
WireGuardポート5xxx0/udp50000台の任意なポートを設定
VPNネットワーク10.200.0.0/24255台分
VPSのVPN内IP10.200.0.1/24中継サーバのVPN上のIPアドレス
スワップ領域2GB (/swapfile)

STEP 0 さくらインターネットVPSクリーンインストール

さくらインターネットVPSをご参照ください。

STEP 1 基本設定

SWAP設定

最初に設定しないとメモリ不足でインストールできない場合があります。

swapfile (512MB RAM対策)

sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
swapon --show
free -h
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
echo 'vm.swappiness = 10' | sudo tee /etc/sysctl.d/99-swap-tune.conf
echo 'vm.vfs_cache_pressure = 100' | sudo tee -a /etc/sysctl.d/99-swap-tune.conf
sudo sysctl -p /etc/sysctl.d/99-swap-tune.conf

システムを最新に保つ

sudo dnf update -y
 リポジトリのメタデータを更新(キャッシュをリフレッシュ)。
 インストール済みパッケージのアップデート可能なものをリストアップ。
 アップデートをダウンロード・インストール(カーネルやセキュリティパッチを含む)。
 -yオプションにより、ユーザーの確認なしで進む。

ロケール設定(ja_JP.UTF-8)タイムゾーンと時刻同期設定

sudo dnf install -y glibc-langpack-ja
sudo localectl set-locale LANG=ja_JP.UTF-8

sudo timedatectl set-timezone Asia/Tokyo
sudo systemctl enable --now chronyd

SELinux 状態確認と無効化(構築が完了したら有効化しましょう)

さくらインターネットVPSのalmalinuxでは、SElinuxは当初からdisableのようであるが、念の為。
getenforce
sudo cp -a /etc/selinux/config /etc/selinux/config.bak-$(date +%Y%m%d)
sudo setenforce 0 || true
sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
getenforce
grep '^SELINUX=' /etc/selinux/config
想定結果:
`Disabled`

この項目の詳しい解説はこちら。

基本パッケージ導入

sudo dnf install -y epel-release
sudo dnf install -y bash-completion curl wget git tar zip unzip bind-utils net-tools firewalld fail2ban glibc-langpack-ja telnet nc rsync screen  htop tree jq
この項目の詳しい解説はこちら。

エディタ導入

自分の好みのエディタをいれて構いませんが、ここでは vim-enhanced 、nano、microの3つを入れておきます。両方とも定評のあるエディタです。
nanoはシンプルで使いやすいですが、ショートカットキーがunixライクなので、windows環境に慣れている方はmicroのほうがいいかもしれません(好みです)。
vimは、プロには好まれますが、初学者には習熟するまで時間がかかるかも知れません。
エディタは複数インストールしておいて使いやすいのを使えばよいと思います。

nanoの導入
sudo dnf install -y nano vim-enhanced  
micro エディタは、EPELには含まれていないので、スクリプトから導入(直接バイナリ導入)する必要があります。

microの導入
cd ~
curl https://getmic.ro | bash
sudo mv ~/micro /usr/local/bin/micro

#microはそのままではパスが通らないので、通しておく。
#`sudo micro` 実行時に「command not found」になる問題の対策。
#sudo secure_path に /usr/local/bin を追加(恒久対策)

grep -Rq "/usr/local/bin" /etc/sudoers /etc/sudoers.d 2>/dev/null || {
echo 'Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin' | sudo tee /etc/sudoers.d/10-secure-path >/dev/null
sudo chmod 440 /etc/sudoers.d/10-secure-path
sudo visudo -cf /etc/sudoers.d/10-secure-path
}
#デフォルトエディタにmicoroを指定(デフォルトをnanoにしたい場合は下記のmicroをnanoに変更)
環境変数設定(冪等):
grep -q "EDITOR=micro" ~/.bashrc || echo 'export EDITOR=micro' >> ~/.bashrc
grep -q "VISUAL=micro" ~/.bashrc || echo 'export VISUAL=micro' >> ~/.bashrc
リポジトリにあるソフト(vim,nano)は、/usr/bin/ にインストールされますが、ここはOSやディストリビューションが管理するディレクトリなので、ディストリに含まれないmicroは/usr/local/binにインストールしています。今後、リポジトリにmicroが含まれるようになれば、nanoと一緒のディレクトリにインストールすることになるでしょう。


確認:
sudo -V | sed -n 's/^Secure Path: //p'

出力例:
`/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin`

この項目の詳しい解説はこちら。

STEP 2: WireGuard インストール

sudo dnf install -y epel-release
sudo dnf install -y wireguard-tools

STEP 3: WireGuardサーバ設定

鍵生成と設定作成

鍵ペアは必ず、WireGuard(=wg)で作成します。

※ポート番号置き換え
sudo mkdir -p /etc/wireguard && sudo chmod 700 /etc/wireguard
sudo wg genkey | sudo tee /etc/wireguard/server_private.key >/dev/null
sudo chmod 600 /etc/wireguard/server_private.key
sudo cat /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key >/dev/null
srv_priv=$(sudo cat /etc/wireguard/server_private.key)
sudo tee /etc/wireguard/wg0.conf >/dev/null <<EOF
[Interface]
Address = 10.200.0.1/24
ListenPort = 5xxx0
PrivateKey = ${srv_priv}
EOF
sudo chmod 600 /etc/wireguard/wg0.conf

起動

sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
sudo systemctl status wg-quick@wg0 --no-pager
sudo wg show

STEP 4: IPフォワーディング有効化

カーネルパラメータレベルの設定(根本-これがないとfiwewalldの設定が機能しない)
echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-wireguard.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-wireguard.conf
sudo sysctl -p /etc/sysctl.d/99-wireguard.conf

STEP 5: firewalld恒久設定

ファイヤーウォール設定についてはいろいろご意見あるかも知れません。
ゾーン設定し、vpsデフォルトのens3 と,wireguardで作成されるwg0をpublicゾーンに設定します。
そのうえで、masqueradeも設定しておきます。 forwardはデフォルトでyesになっているはずです。

※ポート番号置き換え
sudo systemctl enable --now firewalld
sudo firewall-cmd --set-default-zone=public

# firewall ゾーン設定
sudo firewall-cmd --permanent --zone=public --add-interface=wg0
sudo firewall-cmd --permanent --zone=public --add-masquerade

# RDPの穴開け ポート番号はご自分が設定しようとするものに変更してください
sudo firewall-cmd --permanent --add-port=5xxx0/udp

sudo firewall-cmd --reload
※--add-masqueradeとすることで、forward もyes となります。
# 確認
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --zone=public --list-all
結果
public
  interfaces: wg0 ens3
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3 wg0
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 5xxx0/udp
  protocols: 
  forward: yes
  masquerade: yes
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

STEP 6: fail2ban firewalld連携設定

※ポート番号置き換え
あとで変更するSSHのポート番号に置き換え。SSHポート番号を置き換えない場合は、22,としておく。
sudo tee /etc/fail2ban/jail.local >/dev/null <<'EOF'
[DEFAULT]
bantime  = 3600
findtime = 600
maxretry = 5
backend  = systemd
banaction = firewallcmd-ipset
[sshd]
enabled  = true
port     = 5xxx2
logpath  = /var/log/secure
maxretry = 3
bantime  = 7200
EOF
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd

STEP 7: SSH接続ポートの変更(セキュリティ強化)

SSH強化 (22→5xxx2/tcp) SSHログインポート番号変更(5xxx2はご自身の環境に置き換え)

# SSHの別穴開け
※ポート番号置き換え
sudo firewall-cmd --permanent --add-port=5xxx2/tcp

sudo firewall-cmd --reload

# sshdの設定を変更
※ポート番号置き換え
sudo cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo sed -i -e 's/^#*\s*Port .*/Port 5xxx2/' /etc/ssh/sshd_config
sudo sshd -t && sudo systemctl restart sshd
この設定のあとに今のセッションは切らずに、別windowで、ポート5xxx2番で繋がるかどうかテスト。
テスト完了後22番ポートを閉める。
sudo firewall-cmd --permanent --zone=public --remove-service=ssh
sudo firewall-cmd --reload
念の為、別windowで、ポート5xxx2番で繋がるかどうかテスト。22番で繋がらないことの確認。


最後に再起動
sudo reboot

まとめ

512MBメモリでも安定稼働するVPN中継サーバ構成。

swapfileでOOM対策
firewalldにNAT・フォワード・ポートを恒久登録
fail2banでSSHを防御

再起動後の自動起動確認:
sudo systemctl list-unit-files | egrep 'firewalld|wg-quick@wg0|fail2ban|vpn-firewalld'
次は、クライアントの設定です。