共有回線で自宅サーバーを公開できるようにしてみた

## 概要
自宅の回線が共有になっており、サーバーが公開できない状態になっていました
(共有回線のため大本のルーター設定をこちらでできない)

さくらVPSを利用し、自宅サーバーとVPNしポートフォワードすることで任意のポートを公開できるようにしてみました

今回は、とりあえずポート80を公開しapacheのデフォルトページをさくらVPSのグローバルIPにアクセスしたら表示できるようしてみます

利用環境
■さくらVPS
・OS ubuntu
・512Mプラン
■自宅
・OS proxmox
・CPU 5700g
・メモリ 32GB
・VM ubuntu
・VM設定(割り当て)
　└メモリ16GB
 　　CPU6コア

## 手順
### さくらVPSをレンタルする
https://vps.sakura.ad.jp/

基本ポートフォワードするぐらいなので、512MBのプランで契約しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882356/750aa4c7-dc2d-a24e-9a0c-a3fd3f9bf83a.png)

### パケットフィルターを設定する
デフォルトですと、ポート22がすべてになっているので
自宅のグローバルIPだけに変更しておきます
そのほどHTTPでアクセスし、動作確認もするのでこの段階でポート80もあけておきます
(こちらも念のため、自宅のグローバルIPだけ許可しました。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882356/eb5559a0-8895-75c8-f702-ab738e82ab4f.png)

### さくらVPSの初期設定をする
SSHでVPSにログインし、下記コマンドを実行する
```
sudo apt update
sudo apt upgrade
sudo reboot
```
これで最新バージョンにアップデートが完了します

:::note 
最後のrebootを実行すると、VPSが再起動するのでSSHで再接続してください
いきなり接続がきれるので、初めての人はびっくりするかもしれませんが安心してください
:::

### WireGuardをインストールする(さくらVPS)
下記コマンドを実行する
```
sudo apt install wireguard
```
VPN接続に利用する秘密鍵を作成する
```
wg genkyey | sudo tee /etc/wireguard/vps.key
```
公開鍵を作成する
```
sudo cat /etc/wireguard/vps.key | wg pubkey | sudo tee /etc/wireguard/vpsPublic.key
```

:::note
作成したキーはchmodを使い600にしておくといいかと思います
しなくても動きますが、セキュリティを考えると上記にしたほうが無難です
:::

### 自宅サーバーの設定をしていく
基本的には、さくらVPSと同じコマンドを入力していきます
下記内容を順番に入力してください
```
sudo apt update
sudo apt upgrade
sudo reboot

sudo apt install wireguard
wg genkyey | sudo tee /etc/wireguard/jitaku.key
sudo cat /etc/wireguard/jitaku.key | wg pubkey | sudo tee /etc/wireguard/jitakuPublic.key
```
これでさくらVPSと自宅サーバーにwireguardのキー作成まで終わりました

### wg0.confの設定をしていく
さくらVPS、自宅サーバーそれぞれに設定していきます
両方ともファイルの場所は下記になり、vimあたりのコマンドで新規作成してください

/etc/wireguard/wg0.conf

さくらVPS側の設定
```
[Interface]
PrivateKey = 作成したさくらVPSの秘密鍵
Address = 172.16.0.1 (サーバーのインターフェイスに割り当てるIPアドレス)
ListenPort = 51820

[Peer]
PublicKey = 作成した自宅サーバーの公開鍵
AllowedIPs = 172.16.0.2/32 (クライアントに割り当てたIPアドレス)
```

自宅PC側の設定
```
[Interface]
PrivateKey = 自宅サーバーの秘密鍵
Address = 172.16.0.2 (クライアントのIPアドレス)

[Peer]
PublicKey = さくらVPSの公開鍵
EndPoint = さくらVPSのグローバルIPアドレス:51820
AllowedIPs = 172.16.0.0/24 (WireGuardを経由して通信する先のIPアドレス)
```

### ポートフォワードの設定をする
さくらVPS側で下記コマンドを実行する
```
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 172.16.0.2:80
sudo iptables -t nat -A POSTROUTING -p tcp -d 172.16.0.2 --dport 80 -j SNAT --to-source 172.16.0.1

# 外部インターフェース（例：ens3）にマスカレードを適用
sudo iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
```
:::note
外部インターフェースについては、ip aのコマンドで外部に向かっているものを指定してください
:::

### wireGuardの起動
さくらVPSで下記コマンドを実行してください
```
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
```
その後自宅サーバーで下記をコマンドを実行してください
```
sudo wg-quick up wg0
```

### 疎通確認をする
念のためさくらVPSと自宅サーバーからそれぞれpingをうってみてください
成功すると応答が返ってきます

### 自宅サーバーにapacheをインストールする
下記コマンドを実行してください
```
sudo apt install apache2
sudo systemctl start apache2
```
これで自宅サーバーにapacheのインストールと、起動が完了します

### 最終確認
成功すると、さくらVPSのグローバルIPにアクセスすると自宅サーバーにインストールされているapacheのページが開きます。

## まとめ
ずっとAWS側ばかり触ってきましたが、linuxの設定を本格的にやってみました。
この方法ならRTX1200などのVPNルーターも不要ですし、環境の用意はしやすいのかなと思います。
今回はapacheでしたが、ゲームサーバーでも公開してみようと思います。