アパート回線でも自宅サーバを外部公開したい
なにこれ?
グローバル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
ですら普通にメモリ不足で死ぬのでスワップを確保すること.
yum updateだのなんだのかんだのって感じのテンプレ初期設定を済ませる.
したらばSoftEtherのセットアップ
基本的に↓これ準拠になる.若干違うけど.
7.3 Linux へのインストールと初期設定 - SoftEther VPN プロジェクト
SoftEther VPN Server → Linux → Intel x64 / AMD64 (64bit)
でVPNServerを落としておく.ついでに SoftEther VPN Client も同様に.あとSoftEther VPN Server Manager for Windowsも.
したら/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 vpnserver
とsystemctl 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
そしたら仮想nicにIPアドレスその他を設定する.なんかそのままだと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コマンドが便利.
これで自宅鯖側終了.また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がデフォルトになっててインターネットに繋がれなくなってたりする)
あとはまぁ頑張ってください.