9.4. VPN

9.4.1. VPNの接続方式

VPNの接続方式にはルート接続ブリッジ接続の2つの方式がある。

  • ルート接続 (L3-VPN)
    • 概要: ルート接続は、IPアドレスを基にしたルーティングによって通信を行う。VPNクライアントとVPNサーバーがそれぞれ異なるセグメントに属し、VPNサーバーが両セグメント間の通信を中継する役割を果たす。
    • 通信の仕組み: VPNサーバーがルーターのように動作し、VPNクライアントからのパケットを、宛先IPアドレスに基づいてVPNサーバー側のネットワークに転送する。
    • 特徴:
      • IPアドレスによるルーティングのため、ブロードキャスト通信はVPNサーバーを越えて届かない。
      • VPNサーバー側のネットワークとVPNクライアント側のネットワークが論理的に分離される。
      • 大規模なネットワークや、複数の拠点を接続する場合に適している。
      • 通信速度はブリッジ接続に比べて遅くなる可能性がある。
  • ブリッジ接続 (L2-VPN)
    • 概要: ブリッジ接続は、MACアドレスを基にした通信を行う。VPNクライアントとVPNサーバー側のネットワークを、あたかも1本のLANケーブルで接続したかのように同一のセグメントに統合する。
    • 通信の仕組み: VPNサーバーがL2スイッチのように動作し、VPNクライアントからのパケットをVPNサーバー側のネットワークにそのまま転送する。
    • 特徴:
      • ブロードキャスト通信がVPNサーバーを越えて届く。
      • VPNクライアントとVPNサーバー側のネットワークは論理的に同一のセグメントとして扱われる。
      • 同じセグメントに接続している機器(IPアドレスを自動取得するDHCPサーバーや、同一セグメント内の特定のプロトコルに依存する機器など)と通信する必要がある場合に有効。
      • IPX/SPXやNetBEUIなど、IP以外のプロトコルも使用できる。
      • シンプルなネットワーク構成を構築できますが、ブロードキャストトラフィックが増加するとネットワーク全体のパフォーマンスに影響を与える可能性がある。

9.4.2. OpenVPN

OpenVPNは安全なポイントツーポイント接続またはサイト間接続を作成する仮想プライベート ネットワーク (VPN) 技術を実装するOSSソフトウェア。

OpenVPN は、事前共有秘密キー、証明書、ユーザー名/パスワードなどのさまざまな方法を使用して、クライアントがサーバーに対して認証できるようにする。

なおデフォルトではOpenVPNは1194のUDPポートで動作する。

OpenVPNのインストール

ダウンロードする前にIP転送を有効にする必要がある。

sysctl -w net.ipv4.ip_forward=1

RedHat系では以下のようにインストールする。

dnf install epel-release -y
dnf install openvpn -y

Easy-RSAの構成

OpenVPNのインストール後、SSL証明書を追加して構築する必要がある。

cd /etc/openvpn/
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.6/EasyRSA-unix-v3.0.6.tgz
tar -xvzf EasyRSA-unix-v3.0.6.tgz
mv EasyRSA-v3.0.6 easy-rsa
cd /etc/openvpn/easy-rsa
vi vars

easy-rsaのvarsを作成したら以下ステップを実行する

  1. ./easyrsa init-pkiでpkiディレクトリの開始
  2. sudo ./easyrsa build-caでCA証明書の作成
  3. sudo ./easyrsa gen-req myov-server nopassでキーペアと証明書のリクエストを作成
  4. sudo ./easyrsa sign-req server myov-serverでサーバキーに署名する
  5. sudo ./easyrsa gen-dhでキー交換のためのDH鍵を作成する
  6. 上記で作成したファイルを/etc/openvpn/server/にコピーする(ca.crt,dh.pem, .key, .crt)
  7. sudo ./easyrsa gen-req client nopassでクライアント キーを取得する
  8. sudo ./easyrsa sign-req client clientで生成された CA 証明書を使用してクライアント キーに署名する
  9. 上記で生成したファイルを/etc/openvpn/client/にコピーする(ca.crt,client.crt,client.key)

OpenVPNサーバの構築

/etc/openvpn/server.confにEasy-RSAの構成で構成したファイルをもとに設定ファイルを以下のように記述する。

なお設定は0から作成する必要はなく、/usr/share/doc/openvpn-/sample/sample-config-files/server.confに設定ファイルの散歩ウルがあるためそれを利用すると良い。

port 1194
proto udp
dev tun
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/myov-server.crt
key /etc/openvpn/server/myov-server.key
dh /etc/openvpn/server/dh.pem
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
duplicate-cn
cipher AES-256-CBC
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
auth SHA512
auth-nocache
keepalive 20 60
persist-key
persist-tun
compress lz4
daemon
user nobody
group nobody
log-append /var/log/openvpn.log
verb 3

OpenVPNサービスの有効化

以下コマンドを使用してサーバーを起動し、有効にする。

systemctl start openvpn-server@server

なおこのコマンドにより、正常にVPNサーバが起動すると新しいネットワーク インターフェイスtun0が作成される。

クライアント構成ファイルの生成

OpenVPNクライアント構成ファイルを生成するには以下.ovpnファイルを作成することで可能。ファイル内容は以下のように記述する。

サンプルファイルは/usr/share/doc/openvpn-/sample/sample-config-files/client.confに存在するためこのファイルの改造で可能となる。

client
dev tun
proto udp
remote vpn-server-ip 1194
ca ca.crt
cert client.crt
key client.key
cipher AES-256-CBC
auth SHA512
auth-nocache
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
resolv-retry infinite
compress lz4
nobind
persist-key
persist-tun
mute-replay-warnings
verb 3

ルーティングの構成

以下コマンドでOpenVPNサービスの通信がファイヤーウォールを通過できるようにできる。

firewall-cmd --permanent --add-service=openvpn
firewall-cmd --permanent --zone=trusted --add-service=openvpn
firewall-cmd --permanent --zone=trusted --add-interface=tun0
firewall-cmd --add-masquerade
firewall-cmd --permanent --add-masquerade

VPN からの受信トラフィックをローカル ネットワークに転送するようにルーティングを設定するには以下の通り。

routecnf=$(ip route get 8.8.8.8 | awk 'NR==1 {print $(NF-2)}')
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o $routecnf -j MASQUERADE

変更の有効化/再読み込みはfirewall-cmd --reloadで可能。

クライアントマシンにOpenVPNをインストールする

インストールする

dnf install epel-release -y
dnf install openvpn -y

サーバからクライアント構成をコピー

sudo scp -r root@vpn-server-ip:/etc/openvpn/client .

OpenVPNサーバに接続する。

cd client/
openvpn --config client.ovpn

OpenVPNコマンド

openVPNを操作するユーティリティ

openvpn <オプション>
オプション説明
–daemonデーモンとして起動
–genkey共有秘密鍵として使用するランダムキーを生成
–mlock鍵をSWAP領域に書き込まないことを保証
–sercert [鍵ファイル]StaticKeyモードの有効化
–show-ciphersすべての暗号化アルゴリズムを表示
–show-tlsすべてのTLS暗号を表示
–tls-timeout [秒]ピアへの制御パケットを再送するまでのタイムアウト時間(デフォルトは2秒)

9.4.3. IPSecサーバとクライアント操作

IPsec

IPsecは保護されたネットワークと保護されていないネットワークの間に境界を作成する。境界を通過するトラフィックは、IPSec 構成を担当するユーザーまたは管理者によって指定されたアクセス制御の対象になる。

IKE: RFC 7296 で定義されている IKE は、2 つのシステムまたはデバイスが信頼されていないネットワーク上で安全な通信チャネルを確立できるようにするプロトコル。 このプロトコルは、一連のキー交換を使用して、クライアントとサーバーの間に暗号化されたトラフィックを送信できる安全なトンネルを作成する

IPsecのポリシー

IPSecりよるサービスは2つのデータベースによって定義される。
1つが**SPD(Security Policy Database)SAD(Security Association Database)**のこと。このポリシは送信元から宛先に送信される各 IP パケットに適用される。

セキュリティアソシエーション

セキュリティアソシエーションは両方のノードが認証および暗号化メカニズムに関する情報を交換するための概念で、送信者と受信者の間で伝送されるトラフィックにセキュリティ サービスを提供する。

IPsec

IPsecのアーキテクチャではセキュリティアソシエーションを識別するパラメータは3つある。

  1. SPI(Security Parameter Index)、受信側システムが受信パケットを選択するためのIPSecプロトコルヘッダを伝えるビット文字列
  2. IP宛先アドレス、IPSecのエンドポイントアドレス
  3. セキュリティプロトコル識別子

SAD(Security Association Database)

SADはSAという暗号化通信時にデータを送信する前に証明書や鍵などを交換し前年な通信路を確保するためのものを管理するデータベースのこと。

SPD(Security Policy Database)

SPDはSPと呼ばれるどのプロトコルでSAを使うかを決めるための補足情報を保存/管理するデータベースのこと。

IPSecプロトコル

IPSecではAH(プロトコル認証ヘッダ)、ESP(カプセル化セキュリティペイロード)の2つのプロトコルを使用してトラフィックセキュリティサービスを提供する。

  • プロトコル認証ヘッダ (AH)
    • IP ヘッダーとデータ ペイロードがハッシュされるために使用
    • ハッシュから新しい AH ヘッダーが構築され、パケットに追加される
    • 認証機能と未改竄の保証
    • IPパケットの真正性と完全性を保証
  • セキュリティペイロードのカプセル化 (ESP)
    • データ パケットの暗号化と整合性を提供するセキュリティ プロトコル
    • 標準 IP ヘッダーの後に追加される
    • AHの機能+暗号化(機密性)

IKE(Internet Key Exchange)

IKEはセキュアコネクションを構築する際の鍵交換を行うプロトコル
鍵の共有、暗号化方式を合意するためのプロトコルといえる。

IKEには「IKEv1」と「IKEv2」という2つのバージョンがあり、IKEv2は、IKEv1をよりシンプルに、また高度な認証に対応した実装となる。
IKEv1では、鍵交換を行う際、IKEプロトコル同士の認証を行うフェーズ1と、鍵交換の設定を行うフェーズ2の2段階で行われており、VPNを行うノード同士で複数回の通信が行われていた。
IKEv2ではこの2つのフェーズの概念が統合され、少ないパケット数でシンプルに処理するようになった。 なお、IKEv1とIKEv2に互換性はない。

IPSec暗号化の技術

IPSecのセキュリティアソシエーションではトンネルモードトランスポートモードの2つのモードの操作を設定できる。

  • トンネルモード
    • ペイロードとヘッダーの両方が暗号化される
    • ゲートウェイ間、またはエンド ステーションからゲートウェイへの使用が一般的
    • パケットの送信元がセキュリティを提供するデバイスと異なる場合は、トンネル モードが使用
  • トランスポートモード
    • 各パケットのデータ部分のみが暗号化される
    • エンド ステーション間、またはエンド ステーションとゲートウェイの間に適用できる

IPsec画像

IPSecのトラフィック処理

Racoon

RacoonはIPsec IKE プロトコルのキー交換デーモンのこと。 設定ファイルは/etc/racoon/racoon.confとなる。

setkey

setkeyはIPsecにおける二つのデータベース(SAD、SPD)を操作するためのユーティリティ

ipsec-tools

ipsec-toolsはIPsec接続を確立するために必要なユーティリティ。 なお現在はRedHat系OSではIPsec-toolsは使用されておらず、LibreSwanといったツールでVPNが構成されている。

設定ファイルは/etc/ipsec-tools.confとなる。

9.4.3. StrongSwan

StrongSwan はIPsec ベースのOSSのVPN
StrongSwan は元々 Linux 用に設計されたが、その後 Android、FreeBSD、Mac OS X、Windows およびその他のプラットフォームに移植された。特徴は以下の通り。

  1. 構成がシンプル
  2. 強力な暗号化と認証方法の提供
  3. 大規模で複雑なVPNネットワークをサポートする
  4. 拡張性に優れたモジュラー設計

また、StrongSwanは以下コンポーネントで構成される。

  • charon … strongSwanのデーモン
  • starter … charonデーモンを起動するためのフロントエンドツール
  • swanctl … strongSwanを操作するためのCLI

StrongSwanのインストール

dnf install -y epel-release
dnf install -y strongswan.x86_64

/etc/strongsan.conf

strongswanの設定ファイル。

# strongswan.conf - strongSwan configuration file
#
# Refer to the strongswan.conf(5) manpage for details
#
# Configuration changes should be made in the included files

charon {
        load_modular = yes
        plugins {
                include strongswan.d/charon/*.conf
        }
}

include strongswan.d/*.conf 

swanctl

swanctlはインターフェイス プラグインを介して StrongSwan IKE デーモン ( charon )を設定、制御、監視するためのコマンドライン。

swanctl <オプション>

swanctl.conf

9.4.4. WireGuard

WireGuardは非常にシンプルで高速な最新の VPN 。 OpenVPN よりも大幅にパフォーマンスが向上している。

Wireguardのインストール

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

Wireguard サーバの構成

適切な権限を持つ Wireguard 設定用の空の構成ファイルをサーバー上に作成する。

mkdir /etc/wireguard

ディレクトリを作成した後、wgおよび``tee`コマンドライン ツールを使用して公開キーと秘密キーを作成する。

wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey

次に、VPN トラフィックをルーティングするためにトンネル デバイスを設定する必要があり、/etc/wireguard以下にwg0.conf等を作成する必要がある。

[Interface]

## IP Address of VPN server ##
Address = 192.168.108.101/24

## Save the configuration when a new client will add ##
SaveConfig = true

## port number of VPN server ##
ListenPort = 51820

## Private Key of VPN Server ##
PrivateKey = SERVER_PRIVATE_KEY

## Command to be executed before starting the interface ##
PostUp     = firewall-cmd --zone=public --add-port 51820/udp && firewall-cmd --zone=public --add-masquerade

## Command to be executed before turning off the interface ##
PostDown   = firewall-cmd --remove-port 51820/udp --zone=public && firewall-cmd --remove-masquerade --zone=public

インターフェイスはsudo wg-quick up wg0コマンドで起動する。 またsudo systemctl enable wg-quick@wg0で有効化できる。

wgコマンド

wgはWireGuard トンネル インターフェイスの構成を取得および設定するための構成ユーティリティ。 インターフェイス自体は を使用して追加および削除でき、その IP アドレスとルーティング テーブルはと をip-link(8)使用して設定できる。

wg <サブコマンド>
サブコマンド説明
genkeyBASE64の秘密鍵を生成し標準出力に表示
pubkey秘密鍵を読込み公開鍵を作成し標準出力に表示
show現在の構成とデバイス情報を表示する
showconf指定された WireGuard インターフェイスの現在の設定を表示する
set現在の構成の変更、ピアの追加、ピアの削除、またはピアの変更

IPv4転送の有効化

NATのIPv4転送の有効化には/etc/sysctl.d99-custom.confを作成する。

## for enabling IPv4 forwarding ##
net.ipv4.ip_forward = 1

## for enabling IPv6 forwarding ##
#net.ipv6.conf.all.forwarding = 1
sysctl -p /etc/sysctl.d/99-custom.conf

Wireguard クライアントの構成

手順はサーバの時と同じで、設定ファイルのみが少し異なる。

[Interface]
## Private Key of VPN Client ##
PrivateKey = qCi5ugILVhTOOmCzchqFzkNaHM3HP1qFUWgtYun2A3w=

## IP address of VPN Client ##
Address = 192.168.108.102/24

[Peer]
## Public Key of Rocky 8 VPN Server ##
PublicKey = m58H6KTuRt+4z6g+jMIeRCdAkQoikkiVvTd7pJvrPGE=

## set ACL ##
AllowedIPs = 0.0.0.0/0

## IP address and Port of CentOS 8 VPN Server ##
Endpoint = 192.168.108.101:51820

なお起動後に、WireGuardサーバにVPN クライアント マシンの IP アドレスと公開キーを登録する必要がある。

[Peer]
## Public Key of VPN Client ##
PublicKey = 73gw+v4V0TKsw2uGLHJ9EI26qfMEwvk+JZ+xED2ttAs=

## IP Address of VPN Client ##
AllowedIPs = 192.168.108.102/32

wg-quickコマンド

wg-quickはWireGuardインターフェイスを起動するコマンド。

wg-quick up wg0