使える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'
次は、クライアントの設定です。

使えるVPN-WireGuard

2025/11/09

WireGuardとVPSで'使える'VPN構築を構築する(LAN,NAT越え)

WireGurdというVPNを実現するアプリがあり、windowsでもlinuxでも使えます。
各マシンにWireGuardを組み込めば、P2PでVPNを実現してくれるスグレモノです。
2020年1月に正式にlinuxカーネルツリーに統合された、比較的新しいものです。
これまでVPNは、多くの人にとって、仕事で使うには有料の選択肢しかなく、無料のものは設定が複雑だったりして、なかなか難しいものでした。

一方、WireGuardも、超えられない壁があります。それは、社内LAN設定やDHCPです。
外部からのパケットが、社内LANを超えてちゃんとそのマシンに入ってくればいいのですが、社内ポリシーでNAT等が認められなかったり、DHCPでIPアドレスが固定でなかったりすると、WireGuardもうまく機能しません。個人利用かIT開発系企業で、自宅と(比較的緩めな)職場を結ぶ程度であれば、いろんな工夫で使えないことはない、という感じだったと思います。
しかし、わずかな課金は必要ですが、第三者の中継サーバーを立てることで、社内LAN、DHCPの壁を越えて、WireGuardを使ってVPNを構築できるような仕組みがあります。

職場PC(複数台OK) →(社内LAN)→ 中継サーバ → 別の場所のPC(他のLAN越しも可) とすることで、立派なVPNが構築できます。

あとは、中継サーバーが必要ですが、インターネット直繋ぎのサーバーを保有している会社であればそれを使えばいいですが、ない場合には、レンタルサーバー会社のVPSが適任です。
私は、さくらインターネットVPSサービスを選択し、最低プランの641円/月で、十分に使えるVPNを構築できました。
(石狩サーバであれば590円/月プランもある)
512MBのメモリということで、スペック的に不安でしたが、やってみたら全く問題ありませんでした。私の用途は、リモートデスクトップです。

それまで私はhamachiやNATでの直繋ぎをしていましたが、スピード的にも遜色ありませんでした*1
もちろん、大人数で使う場合には、中継サーバーの力量が足りなくなることもあるかも知れません。誰か大きな組織の人が試して欲しいです。

ということで、徐々にコンテンツをアップしていきたいと思います。

なお、中継サーバー方式を用いる場合、そのサーバーはVPN専用としてください。他の用途と混在するとセキュリティホールとなる可能性があります*2

*1 : 時間帯によりどれが早いか変わるが、どれも実用に問題ない

*2 : IPフォワーディングを利用しているので

他の構成

企業では拠点間をVPNで結ぶ、ということも多いと思います。下記の記事が参考になります。
Wireguard(その1)&久しぶりにGNS3(その40)

とても参考になります。
さくらのVPSにWireGuard入れて個人用途のVPN環境作った

TPリンクのルーターは、WireGurdで気軽にVPNを構成できるようになっているようです。
WireGuard VPNの設定方法(ルーター)

こちらは自宅サーバーをWireGUardを利用して公開する方法
WireGuardを使って固定IPアドレスが当たっていないお家サーバーにアクセスする

WireGuard技術の解説、ためになります
WireGuardでVPN接続する。

なるほど、こんな使い方もあるのかと。
【Wireguard】VPNクライアント機能があるトラベルルーター2選

linuxからlinuxへのSSH接続

2025/11/09
1. 基本的な SSH 接続

最も簡単な方法は、接続先のユーザー名とホスト名(または IP アドレス)を指定することです。
ssh [ユーザー名]@[ホスト名 または IPアドレス]
2. 秘密鍵を指定して接続する (推奨)

id_ed25519 鍵ペアを使用して接続する方法です。-i オプションで秘密鍵ファイルを指定します。
ssh -i [秘密鍵のパス] [ユーザー名]@[ホスト名 または IPアドレス]
22番ポート以外の場合
ssh -i [秘密鍵のパス] -p (ポート番号) [ユーザー名]@[ホスト名 または IPアドレス]


### 3\. 初回接続時の確認
初めて接続するサーバーの場合、以下のよジが表示されます。
The authenticity of host 'example.com (192.0.2.1)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])? 
これは「接続先のサーバーが本物かどうかわかりません。接続を続けますか?」という確認です。サーバーが正しいことを確認した上で `yes` と入力すると、接続が続行され、このサーバーの情報が `~/.ssh/known_hosts` ファイルに保存されます。(次回からは聞かれなくなります)

4. パスフレーズの入力
鍵の作成時にパスフレーズを設定した場合、接続時にそのパスフレーズの入力を求められます。
Enter passphrase for key '~/.ssh/id_ed25519': [ここでパスフレーズを入力]
パスフレーズを入力して Enter キーを押すと、認証が完了し、サーバーにログインできます。

bashコマンド覚え書き

2025/11/06

あるファイル、ディレクトを探す

find /path/to/dir -name filename -type f
オプション
判別式 -type f ファイルのみを対象とし検索する。
判別式 -type d ディレクトリを対象とし検索する。

デバッグ、解析用

そのスクリプトが実行されたか、ファイル名、行数等をログファイルに追記
echo "$(date '+%Y-%m-%d %H:%M:%S') | $(realpath ${BASH_SOURCE[0]}) | Line:${LINENO} | 任意のコメント" >> ~/.usrlog/startlog
本格的には。
#!/bin/bash
# ログ関数の定義
log_write() {
    local comment="$1"
    echo "$(date '+%Y-%m-%d %H:%M:%S') | ${BASH_SOURCE[1]##*/} | Line:${BASH_LINENO[0]} | ${comment}" >> ~/.usrlog/startlog
}

# 使用例
log_write "スクリプト開始"
some_command
log_write "処理1完了"

あるディレクトリ以下に、xxxのワードが入っているファイルを検索

使用例
# カレントディレクトリ以下で"xxx"を検索
grep -r -l "xxx" .

# /home/user以下で大文字小文字を区別せず"xxx"を検索
grep -r -l -i "xxx" /home/user

# 特定の拡張子のファイルのみを検索
find /path/to/directory -name "*.txt" -exec grep -l "xxx" {} ;

# バイナリファイルを除外して検索
grep -r -l -I "xxx" /path/to/directory

grepの主要オプション説明

  • r または --recursive: サブディレクトリも再帰的に検索
  • l または --files-with-matches: マッチしたファイル名のみを表示(内容は表示しない)
  • i: 大文字小文字を区別しない
  • n: 行番号も表示
  • c: マッチした行数を表示
  • w: 単語単位で検索(部分一致を除外)

antiX リポジトリにソフト(xxx)があるかどうかを確認するコマンド:

`apt search xxx`
(これは利用可能なパッケージを検索します。antiXはDebianベースなので、aptコマンドが標準です。事前に`sudo apt update`を実行してリポジトリを更新することをおすすめします。)

antiX そのソフトをインストールするコマンド:

`sudo apt install xxx`
(インストール前に`sudo apt update`を実行し、依存関係を確認してください。)

AlmaLinux 9の場合(RPMベースのシステムで、dnfパッケージマネージャを使用):

リポジトリにインストールしたいソフト xxx があるかどうかの確認コマンド:

`dnf search xxx`
(事前に`sudo dnf makecache`を実行してリポジトリ情報を更新することをおすすめします。)

そのソフトをインストールするコマンド:

`sudo dnf install xxx`
(インストール前に`sudo dnf update`を実行してシステムを最新に保つと良いです。)

antiXのデスクトップセッションを読み解く

2025/11/04

antiXのデスクトップセッション

antiXのGUIの起動ファイル desktop-session を読み解いてみました。
場所は /usr/local/bin/desktop-session です。
これの設定ファイルは、 ~/.desktop-sesshion/desktop-session.conf です。
main() → launch_wm() → min_chek() → launch-desktop &(バックグラウンド起動) ①ここでFM起動 → min_chek() → launch_wm() ②ここでDbus起動+wm起動 → main() → 終わったら、startup を起動
launch-desktopが & 付で実行されているので、バックグラウンド+プロセス化となり、ここで、ファイルマネージャー(File-filter)とウィンドウマネージャー(WM)が「枝分かれ」します。
先にlaunch-desktopプロセスが分離して、そこで①File-filterが起動されるので、これ以降の環境変数を、File-filterは取得することができません。したがって、Dbusアドレスも知ることができません。

なので、日本語入力を設定する際には、この②で実行されるDbusアドレスをROXも知らないと、ROXから起動されたアプリには、Dbusアドレスが伝わらず、日本語入力ができなくなることがあります。

よって、日本語入力を設定する際には ~/.desktop-sesshion/desktop-session.conf の中で、Dbusを先行して起動させ環境変数にセットし、そのあとに実行される②のDbus起動をfalseにしておく、ということです。詳細は、こちら

なんで、こういう構造なのだろう

と思って調べたら、2016年には、指摘されているものの、antiXの中の人は、あえて対応していない、ということのようです。
Dbusセッションは、desktop-sessionが終了したら、同時に終了するというのが理念のようですが、よくわかりません。私はシステム通して、Dbusはユニークであるほうがいいと思うのですが。

もともと、antiXは軽量化のためにDbusがなくても動作するようにしていたので、その名残りみたいなものもあるようですが、昔のことはよくわかりません。

ということで、日本語入力のところで述べた方法も、antiXが想定する設定ではないと思うので、他の部分で不具合がでるかも知れません(わかりません)。