工事現場備忘録

私の備忘録を私がどう書こうが私の自由であるとの信念に基づき自由に書いています

アパート回線でも自宅サーバを外部公開したい

なにこれ?

グローバルIPがもらえないアパート回線でも何とかして自宅鯖に外部からアクセスできるようにしたいお話.

できあがるもの

外部のグローバルIP持ってるマシンと自宅鯖をVPNで繋いで通信中継させてなんとかする.
図にはnginx UDP proxyって書いたけどTCPでもおk.
今回はAzure Studentで実質無料で使えたからAzureのVMにした.
(2022/12/25 WebARENAの1GBでもできた)
通信中継だけなら大した性能は要らないし,さくらでもGMOでもWebARENAでも安いところを選べばヨシ!

環境

自宅鯖

FUJITSU PRIMERGY TX1330 M1
Xeon E3-1220v3
DDR3 8GB
AlmaLinux8
悲しきアパート回線故グローバルIPなし

Azure側

Standard B1ls
CentOS 7.9.2009

( ^ν^)おかしい…CentOS7はすでにサポート切れのはずでは…?
そのうち更新するよそのうち→WebARENA移行に伴いRocky8.4に更新

やる

自分のメモ見ながらこれ書いてたんですけどメモにsudo書いたり書かなかったりしてるせいでこの記事もsudo書いたり書かなかったりになってます.
適宜いい感じにしてください.

Azure側

B1lsはメモリ少なすぎてdnf updateないしyum updateですら普通にメモリ不足で死ぬのでスワップを確保すること.

koji-genba.hateblo.jp

yum updateだのなんだのかんだのって感じのテンプレ初期設定を済ませる.
したらばSoftEtherのセットアップ
基本的に↓これ準拠になる.若干違うけど.

7.3 Linux へのインストールと初期設定 - SoftEther VPN プロジェクト

SoftEther VPN Server → LinuxIntel x64 / AMD64 (64bit)
でVPNServerを落としておく.ついでに SoftEther VPN Client も同様に.あとSoftEther VPN Server Manager for Windowsも.

www.softether-download.com

したら/usr/localにどちらも展開.必要に応じてgccとかコンパイラ入れてmake
あとそれぞれのvpncmdとvpnserverとvpnclientをchmodで700にしておく
そしたらそれぞれサービス化する.さっきのリンク先ではinit.dでやってるけど今時らしくsystemdでやったほうがいい気がするので

vpnserver
vi /etc/systemd/system/vpnserver.service
[Unit]
Description=SoftEther VPN Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop

[Install]
WantedBy=multi-user.target
vpnclient
vi /etc/systemd/system/vpnclient.service
[Unit]
Description=SoftEther VPN Client
After=network.target network-online.target

[Service]
ExecStart=/usr/local/vpnclient/vpnclient start
ExecStop=/usr/local/vpnclient/vpnclient stop
Type=forking
RestartSec=3s

[Install]
WantedBy=multi-user.target

こんな感じで.そしたらsystemctl start vpnserversystemctl start vpnclientする.
ついでにfirewall-cmdとかAzurePortalのネットワークの設定とかからTCP443とかいい感じのポートを開けておく(VPN接続用)
TCP443番でいいならこんな感じで

firewall-cmd --add-service=https --zone=public --permanent
firewall-cmd --reload
firewall-cmd --list-service
firewall-cmd --list-port

他ポートなら (ex, TCP4444)

firewall-cmd --add-port=4444/tcp --zone=public --permanent
firewall-cmd --reload
firewall-cmd --list-service
firewall-cmd --list-port

そしたらSoftEther VPN Server Manager for Windowsで接続,パスワードとかを設定して仮想ハブ作ってAzure側のユーザと自宅鯖側のユーザ作って「仮想NAT及び仮想DHCP機能」からSecureNAT機能を有効にする.仮想ホストのIPアドレスとかデフォルトゲートウェイとかもいい感じにしておく.DHCPは無くてもいい.少なくともこの中では使わない. エクストリーム適当にやってこんな感じ.ここまででいったんVPN Serverの作業は終わり.

/usr/local/vpnclientから./vpncmdして 2->空Enter,あとは

niccreate
accountcreate
accountpasswordset

をそれぞれやって仮想nic作って接続設定を作る.そしたらaccountconnectで接続できるか確認.Connectedになればおk.ならなかったら接続設定を再確認.あと起動時に自動接続したいならaccountstartup

そしたら仮想nicIPアドレスその他を設定する.なんかそのままだとnmcliで操作できないけどipでアドレス与えてやるとなんか勝手にconnectionが作られる

ip address add dev [仮想nic名] 192.168.30.2/24

こんな感じに.ipだと再起動したらアドレス消えちゃうので決して電源を落とさないでください()
あとnmcliとか使ってネットマスクとかdnsサーバを設定する.
アドレス設定出来たらAzure側での作業一旦終了.

自宅鯖側

Azure側と同じ感じでvpnclientを設定して接続.そしてアドレスその他設定.

ip address add dev [仮想nic名] 192.168.30.3/24

あとは動かしたいサービス起動したりポート開けたりそういう作業をやっておく.
ここまでやったら自宅鯖とAzureはVPNで繋がってるはずだからpingとか通じるか見ておく.
あとポートが開いているかとかの確認にはncコマンドが便利.

疎通確認にはncコマンドが使えるって話 - 工事現場備忘録

これで自宅鯖側終了.またAzureを操作する.

Azure側

通信を中継するためのnginxをセットアップする.そのためには--with-streamをつけてmakeしないといけない.

sudo yum install pcre-devel zlib-devel
wget http://nginx.org/download/nginx-1.21.6.tar.gz ※サイト見て更新日確認して一番新しいやつ選ぶ
tar zxvf nginx-1.21.6.tar.gz
cd nginx-1.21.6
./configure --with-stream --sbin-path=/usr/sbin/nginx --prefix=/etc/nginx ※error出たら都度対応
make && sudo make install

そしたらnginxもサービス化する.

vi /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/conf/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

そしたらnginx.confを色々する.

nginx -t
sudo rm /etc/nginx/conf/nginx.conf
sudo vi /etc/nginx/conf/nginx.conf
worker_processes  1;

pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}
stream {
    upstream mcserver {
        server 192.168.30.3:25565;
    }
    server {
        listen     25565;
        proxy_pass mcserver;
    }
}

そして動かす.

nginx -t
sudo systemctl daemon-reload
sudo systemctl enable nginx
sudo systemctl start nginx
sudo systemctl status nginx

これで動く.nginx -tで文句言われたらnginx.confを修正する.今回のnginx.confはJava版マイクラを想定してTCP25565番ポートに来た通信を192.168.30.3のTCP25565番ポートに転送している.これが統合版だとUDPの19132番になるから,

worker_processes  1;

pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}
stream {
    upstream mcserver {
        server 192.168.30.3:19132;
    }
    server {
        listen     19132 udp;
        proxy_pass mcserver;
    }
}

となる.
systemctl status nginx見るとFailed to parse PID from file /var/run/nginx.pid: Invalid argumentって出るけどなんか動いてるしヨシ!
ここまでやればAzureのVMで通信受けたらVPN通して自宅サーバに送って結果を返す動きはできるはず.
もしかするとデフォルトゲートウェイの設定がすこし変になっていると思うから必要に応じて確認&修正.(勝手に192.168.30.1がデフォルトになっててインターネットに繋がれなくなってたりする)
あとはまぁ頑張ってください.