Ubuntu 24.04.2 LTS 上の Vagrant + VirtualBox の中にNginx サーバを構築し、ローカルネットワークから VM に SSH 接続する


Nginxの検証環境が必要になったため構築。LXDやMultipassはネットワークブリッジの設定が煩雑なため、今回はVagrantを用いた。


#### Vagrantのインストール

```
sudo apt update
sudo apt install virtualbox
curl -LO https://releases.hashicorp.com/vagrant/2.4.1/vagrant_2.4.1-1_amd64.deb
sudo dpkg -i vagrant_2.4.1-1_amd64.deb
mkdir -p ~/vagrant/nginx-ubuntu
cd ~/vagrant/nginx-ubuntu
sudo vi Vagrantfile
```

#### IP固定のための設定

```
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/jammy64" # Ubuntu 22.04 LTS
  config.vm.hostname = "nginx-ubuntu"

  # 固定IP設定
  config.vm.network "public_network",
    ip: "192.168.3.30", # ルータのIPに応じて設定
    bridge: "enp8s0" # ホストのネットワークインターフェース名（変更が必要かも）

  # リソース設定
  config.vm.provider "virtualbox" do |vb|
    vb.memory = 2048
    vb.cpus = 1
  end
end
```

#### vagrant建てる

```
# 起動
vagrant up

# 接続
vagrant ssh
```

#### VM内で設定

```
# ユーザー作成
sudo adduser yourname

# sudoグループに追加
sudo usermod -aG sudo yourname

# yournameとしてログイン
sudo -i -u yourname

# .sshディレクトリ作成（ない場合）
mkdir -p ~/.ssh && chmod 700 ~/.ssh

# 鍵生成（パスフレーズなし）
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N ""

# 公開鍵をauthorized_keysに登録
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

# 一時的にvagrantユーザーの共有フォルダにコピー
sudo cp ~/.ssh/id_ed25519 /vagrant/nginx-ubuntu_id_ed25519
sudo chmod 600 /vagrant/nginx-ubuntu_id_ed25519

#Windowsから接続
ssh -i C:\Users\yourname\.ssh\nginx-ubuntu_id_ed25519 yourname@192.168.3.30
```

#### Nginxをインストールし、TCP Exposerを使って公開
[TCP Exposer](https://www.tcpexposer.com/)のアカウントはあらかじめ作って設定しておく
```
sudo apt update
sudo apt upgrade -y

sudo apt install nginx certbot python3-certbot-nginx -y

ssh-keygen -f yourkey -t ed25519

# 鍵をコピー
sudo cp yourkey.pub /vagrant/yourkey.pub

# これで動く (設定のため一度動かすこと)
ssh -i yourkey -R yourname:80:localhost:80 yourdomain@tcpexposer.com

sudo apt update
sudo apt install autossh -y
```

#### TCP Exposerのサービス設定

```
sudo vi /etc/systemd/system/tcpexposer-tunnel.service
```

```
[Unit]
Description=tcpexposer-tunnel
After=network.target

[Service]
ExecStart=/usr/bin/autossh -M 0 -i /home/yourname/yourkey -R yourname:80:localhost:80 yourdomain@tcpexposer.com
Restart=always
User=yourname
Environment=PATH=/usr/bin:/bin
WorkingDirectory=/home/yourname
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=tcpexposer-tunnel

[Install]
WantedBy=multi-user.target
```

```
sudo systemctl daemon-reload
sudo systemctl enable tcpexposer-tunnel.service
sudo systemctl start tcpexposer-tunnel.service
```






#### TCP Exposerのサービスの定期的な再起動設定

```
sudo vi /etc/systemd/system/tcpexposer-tunnel-restart.timer
```

```
[Unit]
Description=Daily restart of tcpexposer-tunnel service

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target

```

```
sudo vi /etc/systemd/system/tcpexposer-tunnel-restart.service
```

```
[Unit]
Description=Restart tcpexposer-tunnel service

[Service]
Type=oneshot
ExecStart=/bin/systemctl restart tcpexposer-tunnel.service


```

```
sudo systemctl daemon-reload
sudo systemctl enable --now tcpexposer-tunnel-restart.timer
```









#### Vagrantのサービス設定

```
sudo vi /etc/systemd/system/vagrant-nginx-vm.service
```

```
[Unit]
Description=Vagrant Nginx VM
After=network.target network-online.target
Wants=network-online.target

[Service]
Type=forking
User=yourname
WorkingDirectory=/home/yourname/vagrant/nginx-ubuntu
ExecStartPre=/bin/sleep 30
ExecStart=/usr/bin/vagrant up --provider=virtualbox
ExecStop=/usr/bin/vagrant halt
RemainAfterExit=true

[Install]
WantedBy=multi-user.target
```

```
sudo systemctl daemon-reload
sudo systemctl enable vagrant-nginx-vm
sudo systemctl start vagrant-nginx-vm
```