VPNを使ったファイル共有サーバーの設計

VPNを使いファイル共有サーバー構築したい
Googleドライブなども使用できるが今回コードを使用して構築し勉強したい為、そのルートを選定

その為に必要な知識や設計構築をしていく


:::note info
- 使用プロトコル：WireGuard
- 使用サーバー：ConoHa VPS
- OSテンプレート：Ubuntu
- アプリケーションテンプレート：Docker
- ファイル共有ソフトウェア：Nextcloud
:::

想定される使用方法は
「Win」ー「Linux（中継）」ー「Win」
間にLinuxを挟む事になる

ここで中継点をLinuxかWindowsどっちにすべきかとなる
それぞれの利点を書き出していく

**【Linux】**
- コスト
ConoHa VPS（Linux）はWindowsより安い
- 高負荷環境
多数の接続を処理する場合Linuxの軽量性とパフォーマンスが良い
- セキュリティ
ファイアウォールや細かいアクセス制御が必要な場合に適している
- 柔軟性
独自の構成やカスタム性に優れている
- 長期的な稼働
再起動の必要が少ないため常時起動が求められるサーバーに向いている

**【Windows】**
- Windows環境がメイン
ADを使ってる場合やWindowsクライアントが多い場合
- 管理者がWindows知見ある場合
学習コストを削減できる
- 特定のWindows専用ソフトウェアを利用
商用ソフトウェアやWindows特化アプリケーションを使用する場合
- GUI管理
コマンドラインに慣れてない場合や直感的な操作を求める場合

:::note info
Windows環境同士の接続だが将来的にDockerで環境を分け、ゲームサーバーや個人開発にも使用したい為Linux環境を選択する
:::


# WireGuard（ワイヤガード）
- 高速かつシンプルで安全なVPNプロトコルの1つ
- SSHのように安全でシンプルに扱えることを念頭に開発がされている
- コードが4000行前後とOpenVPNの1/3程度
- レイヤー3（ネットワーク層で）で動作する
- クライアントやサーバーには公開鍵、秘密鍵が割り当てられ通信を暗号化する
- UDPプロトコルを使用して通信するため高速かつ効率的（会社内やセキュリティの厳しいエリアで使う際には注意が必要。ファイアーウォール等の設定でUDPを許可する必要がある）
- 実装のしやすさ、接続/切断のスピード、セキュリティ、pingや通信速度といったあらゆる観点から見てもOpenVPN、IKEv2といったプロトコルより優れている
- 大手VPNプロバイダはWireguardのカスタムプロトコルを提供している

**【他のVPNプロトコル】**
- **OpenVPN**
最も信頼できるVPNプロトコルと言われている
オープンソースで開発がされている
UDPだけでなくTCPにも対応可能
非常に柔軟なプロトコル
設定がやや複雑、暗号化によっては速度が遅い場合もある
- **IPsec（アイピーセック）**
高いセキュリティ
設定が複雑で導入に時間がかかる
- **L2TP**
PPTPのアップグレード版としてリリース
L2TP自体には強力な認証が付属してないのでIPsecと一緒に使われている
PPTPより安全な接続はできる
比較的簡単に設定できる
ファイアウォールを通過する際に問題が発生しやすい
OpenVPNより速度が出ない（データをL2TPに変換してからIPsecで暗号化するため）
- **IKEv2**
IPsecをベースにCiscoとマイクロソフトによって開発され2006年頃から実装されている比較的新しいプロトコル
高速で安定性が高い
モバイル機器に適した限られたプラットフォームでの利用が可（通信の信号を自動的に追従してくれるプロトコルでWi-Fi通信からセルラー通信（3GやLTE等）へ切り替わる際にシームレスでVPN接続を維持する事ができる特徴のため）
オープンソースではない
- **SSTP**
クレジットカードの支払いやパスワード入力の際に使われている信頼の高いセキュリティレイヤー
HTTPポート（TCP/443）を使用
ファイアウォールを通過しやすい
非常にセキュリティが高い
Windowsに依存
互換性が低い
オープンソースではないため柔軟性はない
- **PPTP**
互換性が高い
VPNが確立された初期から使用されてるプロトコル
設定が非常に簡単で高速
とてもセキュリティが低いので現在は殆ど使用されてない
- **SSL VPN**
ファイアウォールを通過しやすく企業のリモートワーク目的に良く使用されているプロトコル
汎用性と互換性に優れている
TCPの影響で遅延はしやすい
今はあまり使われていないらしい

:::note info
今回はWireGuard使う
OpenVPNと迷ったが
- WireGuardの方がシンプルな設計であること（コード行数が少なくセキュリティ監査が容易、OpenVPNは複雑である）
- 速度がWireGuardの方が最新の暗号化技術を採用しておりOpenVPNで懸念されてる暗号によっては速度が遅くなるという心配がない
- WireGuardの方が初心者でも手軽に導入可能なこと（OpenVPNは柔軟性が高い分設定が複雑になりがち）
という観点からWireGuard。OpenVPNの使用は自分自身の熟練度や用途によって今後の選択肢には入る

:::

:::note info
VPSとVPNの違い
- VPS「Virtual Private Server」
仮想技術を用いた仮想サーバー
- VPN「Virtual Private Network」
仮想的に専用線のように作られるもの
:::


# 使用サーバー
使用サーバーを選定指定していく、候補は
- クラウドサービスプロバイダー
- 自宅サーバー
- VPS（仮想専用サーバー）プロバイダー
- WireGuard専用VPNプロバイダー

## クラウドサービスプロバイダー（✖️）
今回クラウドサービスは使わない方針
- **AWS（✖️）**
高い信頼性と可用性、世界中に分散したデータセンター
柔軟な料金設定だが設定が少し複雑
- **GCP（✖️）**
高速なネットワークインフラ、使いやすいコンソール
トラフィック料金が高め
- **Azure（✖️）**
Windows環境と高い互換性、企業向けサービス充実
他のクラウドより若干コストが高い

## 自宅サーバー（✖️）
自宅でWireGuardサーバーをセットアップする方法
契約内容もそうだが常時電源ONにしておくのが厳しい

- メリット
プライバシーの完全管理
月額費用が不要

- 必要な環境
安定したインターネット接続（固定IP推奨）
古いPC使用可能

- 注意点
ISPによる帯域制限やNATの設定が必要
常時電源を入れておく必要がある為電力コストが掛かる

**ISP**
インターネットサービスプロバイダー

**帯域制限**
インターネットサービスプロバイダー（ISP）が
通信速度やデータの使用量に制限を掛けること

**NAT（ネットワークアドレス変換）**
LAN内のプライベートIPアドレスをグローバルIPアドレスに変換する技術

:::note warn
常時電源を入れておく必要がある
ISPの制約や帯域制限を使用してない設定や契約が必要。難しい場合はクラウドやVPSの使用を考える
:::

## VPS（仮想専用サーバー）プロバイダー
低コストで利用できるVPS
両方とも日本国内にあるためサポートやマニュアルが日本語
国内サーバーも多い為接続速度や安全性が高い
ただ海外と比べると匿名性が低く料金が割高
また最新技術をサポートしていない場合もある

:::note info
どのくらいサーバーを動かすか不透明のため今回はConoHaVPSを選択。
VPN Gateは無料で魅力的だがWireguardには対応していない。現時点では選択肢から外れるがいずれは使ってみたい。
:::

- **ConoHa VPS（⚪︎）**
日本国内にデータセンターがあり遅延が少ない
WireCuard対応（Linux）
自分で自由にVPNサーバーを構築したい人向け
コストを抑えつつ柔軟な設定、カスタマイズをする事ができる
初期費用を抑えて短期間の利用もできる
月額料金（特に上位プラン）が高め
長期運用する場合はコスト高い

- **さくらVPS（△）**
日本のプロバイダーで信頼性が高い
WireCuard対応（Linux）
長期的に安定した運用をしたい人向け
商用目的でサーバーを利用する企業や団体が多い
初期費用掛かるプランあり
プランや機能面でConoHaVPSと比べて柔軟性に劣る

- **VPN Gate（✖️）**
筑波大学が提供する無料のVPNプロジェクト
WireCuard使用可能だが公式にサポートしていないため操作が複雑になり現実的ではない
完全無料でIPアドレスを切り替えたり匿名通信可能
ボランティア提供の為サーバーの安定性や通信速度の遅延などの不安要素あり
商業利用や高セキュリティ用途には不向き



## WireGuard専用VPNプロバイダー（△）
固定VPNプロバイダーはWireGuardを簡単に利用できる環境を提供している。値段もあまり変わらず匿名で使用できたりするがサポートが日本語対応していない点から今の私には不安要素が残る。MullvadやProton VPNは有名

- **Mullvad（△）**
5ユーロ：約810円
プライバシー重視、月額固定
匿名でVPNを利用できる

- **IVPN（✖️）**
6ドル：約725円
高速で安全な接続、プライバシー保護も
マルチポップ接続やファイアウォール機能あり
ストリーミングや追加機能を重視する人に向いてる

- **Proton VPN（△）**
セキュリティが高く無料プランあり
（制限付き：3カ国、速度制限、1デバイス）
ストリーミングや地理制限回避の必要がある人に向いてる
スイスの法律が適用される

:::note info
どれもメリットデメリットがあるが今回私が選択したのはConoHa VPN。別のプロトコルやVPN接続先により用途を変更していきたい。
:::

# 使用OSテンプレート
ここからはConoHa VPSで提供されているOSテンプレートの選定をしていく

- **CentOS（セントオーエス）**
RHELの開発版として位置付けられている
最新の機能や更新がいち早く取り入れられているため、安定性と新機能のバランスを求めるユーザーに適している
SambaやNFSを利用してWindowsクライアントやLinuxクライアントとファイルを共有可能。SELinuxやファイアウォール設定により高いセキュリティを確保できる

RHEL：エンタープライズ向けのLinux環境として安全性・セキュリティ・サポート体制を重視されたもの。クラウドやコンテナ技術との相性も良い為、最新のITインフラ環境にも対応できる柔軟性がある

エンタープライズ：企業・ビジネス

- **Oracle Linux**
Oracle社が提供するエンタープライズ向けLinuxディストリビューション。高いパフォーマンスとセキュリティが特徴。RHELと互換性があり企業環境での利用に適している

ディストリビュージョン：特定の用途やユーザーに向けてソフトウェアを組み合わせて提供する仕組み

- **Ubuntu（ウブントゥ）**
デスクトップからサーバーまで幅広く利用されているディストリビュージョン。長期サポートも提供されており豊富なパッケージとコミュニティサポートが魅力。
初心者から上級者まで幅広く利用されており豊富なドキュメントやチュートリアルがある。
SambaやNFS、Nextcloudなどのファイル共有ソフトウェアを簡単にインストール可能。

- **Debian（デビアン）**
安定性とセキュリティを重視したもの。サーバー用途に広く採用されている。SambaやNFSの設定が簡単で軽量な環境を提供可能。

- **Arch Linux**
常に最新のソフトウェアを提供する軽量なOS。高度なカスタマイズ性を求める上級ユーザーに適している

- **AlmaLinux**
CentOSの後継としてコミュニティ主導で開発されているRHEL互換OS。安定性と長期サポートを提供し企業環境での利用に適している。
SambaやNFSを利用してWindowsクライアントやLinuxクライアントとファイルを共有可能。SELinuxやファイアウォール設定により高いセキュリティを確保できる

- **MIRACLE LINUX**
サイバートラスト社が提供する日本発のエンタープライズ向けのOS。国内企業のニーズに応じたサポートが特徴


- **FreeBSD**
BSD系のオープンソースOS。高いパフォーマンスとセキュリティが特徴。ネットワークサーバーやストレージサーバーとしての利用に適している

BSD系：Unix系を引き継ぎながら安全性や信頼性、セキュリティを重視したOS群
Unix系：ユニックス。マルチタスク、マスチユーザーが同時にアクセスできる。

- **NetBSD**
移植性の高さを特徴とするBSD系OS。多様なハードウェアプラネットフォームで動作する。軽量でシンプルな設計を求めるユーザーに適している

- **OpenBSD**
セキュリティとコードの正確性を重視したBSD系OS。セキュアな環境を求めるユーザーに適している

:::note info
ファイル共有サーバーを視野に入れた時
初心者で簡単に始めたい気持ちと使いやすさ、サポートの豊富さからUbuntuを選択
企業や長期運用を視野に入れた時はRovky LinuxやAlmaLinuxが選択肢に入る
:::


# 使用アプリケーションテンプレート
- **Docker**
開発環境から本番環境までアプリケーションが一貫して動作する環境を提供。仮想マシンとは異なりリソース消費が少なく軽量性がある。またサーバーリソースを効率的に活用でき、コンテナの作成・削除・再起動が簡単にできる。
デメリットはホストOSのカーネルを共有するためセキュリティ観点では仮想マシンより弱い場合がある。また複雑なシステムでは管理やオーケストレーションが必要になったり高い技術が必要になることがある。
（つまり仮想マシンではOSも自由にできるがコンテナ仮想技術はOSを新たにインストールするとはできぐPCに備わってるOSをそのまま使用する。なので仮想マシンと比べてプログラムの立ち上げが早くメモリも節約する事ができる）

カーネル：オペレーティングシステム（OS）の中核部分でありハードウェアとソフトウェアを仲介する役割を持つ重要なコンポーネント
オーケストレーション：システムやソフトウェアの各種コンポーネントやプロセスを自動化して効率的に管理し複雑な作業を調整すること
コンポーネント：構成要素・部品

# 使用ファイル共有サーバー
ファイル共有サーバー（ソフトウェア）を使わなくても共有は可能。まずはソフトウェアを使った場合、使わなかった場合についてまとめていく

## ソフトウェアを使用しない場合
- 直接転送になる
SCPやHTTP/HTTPSなどネットワークプロトコルや標準ツール使用
- WindowsやLinuxのネットワーク共有の使用を使う
プロパティからの設定で共有可能にする
- USBドライブなどの物理メディア使用
直接会えるなら手軽で有り

## ソフトウェアを使用する場合
- 異なるOS間でのファイル共有ができる
WindowsとLinux、MacOSを跨ぐクロスプラットフォームのファイル共有ができる
- ローカルネットワーク内の共有
ソフトウェアを使った方が簡単高速に共有できる
- 権限管理
フォルダの読み取り書き込みなどユーザーごとに管理ができる
- ドメイン管理と連携
ADやLDAPと連携しユーザー管理を簡素化したい場合

:::note info
ファイル共有ソフトウェアは便利なので使う！
注意点もあるので下記に記載
- セキュリティ設定が必要
VPN接続をすること
- 初期設定がやや複雑
設定ファイル（smb.conf）の編集が複雑。
テンプレートやGUIツールを活用することで簡略化は可能
- パフォーマンスの最適化
デフォルト設定ではパフォーマンスが最適化されてない場合があるため大量のファイル共有が必要な場合は調整が必要（例：キャッシュ設定、TCPウィンドウサイズの調整など）
:::

## ファイル共有ソフト
- Samba
Linux上でWindowsの機能が使えるフリーソフト
ドメインコントーラー機能もあるのでADと連携もできる
Windowsの「ファイル共有」と同じプロトコル（SMB/CIFS）をLinuxで利用できるようにするソフトなので良く使われている
ユーザー管理やアクセス制御ができる
ローカルネットワーク内で継続的にファイル共有したい場合に向いている

- NFS
Linux標準のネットワークファイル共有プロトコル
Windowsでも「Windows NFSクライアント」をインストールすれば利用可能
Linux環境同士でのファイル共有に最適。Linux中心の環境でWindowsからもアクセスしたい場合も使える

- SSH（SFTP/SCP）
SSHを使って安全にファイルを転送する方法
セキュリティが高い
Windows側では「WinSCP」や「FlieZilla」などのクライアントを使用
Linux側では「OpenSSHサーバー」を有効化するだけで利用可能
インターネット経由で安全にファイルをやり取りしたい場合に向いている

- FTP/FTPS
古くからあるファイル転送プロトコル
Windows側では「FileZilla」
Linux側では「vsftpd」などを使えば
SFTPより簡単に設定可能
大容量のファイルを定期的に転送したい場合は良い

- Syncting
P2P方式のファイル同期ソフト
Windows、Linux、Mac、Androidなど異なるOS間のリアルタイム同期が可能
クラウドをか介さず直接ファイルを同期
自動的にフォルダを同期したい場合に良い

- Cloudサービス
クラウドストレージを介してファイルを共有
Windows、Linux両方で利用可能
自動バックアップ機能が使える
クラウド経由でファイルをやり取りしたい場合に最適
NextcloudやSeafilがある

- Rsync
Linuxの標準的なファイル同期ツール
Windowsでも「cwRsync」などを使えば利用可能
増分同期が可能で高速かつ効率的
SSHを組み合わせることでセキュアな転送が可能

:::note info
最初は有名なSambaを検討していたがローカル推奨
なのでクラウドで汎用性の高いNextcloudを使用する事に。このソフトはクラウドなので他のクラウドサービスでもいいのではないかと思う使う利点や理由、どう使うかを下記に記載する
- 自分でサーバーを立てその中にクラウドファイルを構築するためセキュリティが高い（DropBoxなどは他責になる）
- VPN接続を使わず使用できるがセキュリティ上WireGuardを使い設定する（設定も可能）
- 自分のサーバー容量でファイル容量も決まる
- 異なるOS間は勿論Nextcloudはクライアントアプリもあり使い勝手が良い
:::

# まとめ
1. ConoHaVPSを契約
2. OSはLbuntuを選ぶ
3. Lbuntu(Linux)上にDockerを使い環境を分ける
4. Nextcloudを入れる
5. セキュリティ強化の為WireGuard（VPN）を使用する

これで遠くにいる知人のPCとOS関係なく
シームレスにファイル共有できる…はず

次回から別記事にて環境構築をしていく