512MBメモリのさくらインターネットVPS(AlmaLinux9)に、以下の構成で安全なVPN中継サーバを構築する。
WireGuard (VPN)
firewalld (nftables backend)
fail2ban (SSH保護)
swapfile (2GB)
| 項目 | 設定値 | 備考 |
| VPSグローバルIP | 160.xxx.xxx.185 | |
| 外向きNIC | ens3 | さくらVPS以外の方はここは要確認 |
| SSHポート | 5xxx2/tcp | 50000台の任意なポートを設定 |
| WireGuardポート | 5xxx0/udp | 50000台の任意なポートを設定 |
| VPNネットワーク | 10.200.0.0/24 | 255台分 |
| VPSのVPN内IP | 10.200.0.1/24 | 中継サーバのVPN上のIPアドレス |
| スワップ領域 | 2GB (/swapfile) | |
最初に設定しないとメモリ不足でインストールできない場合があります。
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オプションにより、ユーザーの確認なしで進む。
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
さくらインターネット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`
この項目の詳しい解説はこちら。
sudo dnf install -y epel-release
sudo dnf install -y wireguard-tools
鍵ペアは必ず、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
カーネルパラメータレベルの設定(根本-これがないと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
ファイヤーウォール設定についてはいろいろご意見あるかも知れません。
ゾーン設定し、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:
※ポート番号置き換え
あとで変更する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
# 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'
次は、クライアントの設定です。