nkmさんよりバトンを受け取りました!
株式会社iimonにてフロントエンドエンジニアをしております、まつむらです!エンジニア人生で初めてのアドベントカレンダー参加です!
いつもの勉強会とは違って、変なことを書いても良いと言われたような気がしたので、今回は完全に趣味に振り切ろうかなと思います!
本記事はiimonアドベントカレンダー3日目の記事となります!
はじめに
さて、前回の記事で申し訳程度に伏線を忍ばせておいたのですが、お気付きになられた方はいらっしゃいますかね?
なんでこいつはフロントエンドなのにサーバの排熱で暖をとっているのかと。
自宅サーバを始めた理由に関しては、ローカルマシンで開発が完成したとしても、実際に動かす環境はローカルマシン上ではなく本番環境になるので、本番環境の知識も必要なのでは??という好奇心からでした。
本音としては買い替えで不要になったPCの再利用をしてゲーム用のサーバを作りたかっただけ
気軽に本番環境でアプリを動かすためには、自宅サーバを動かすしかない。
自宅サーバを動かすにはサーバを構築するしかない。
サーバを構築して、公開するにはネットワークを構築するしかない。
といった連想ゲームですね(?)
……まあ、経緯について細かいところまで話していたらとんでもなく長くなるので割愛しますが、代わりにサーバの構築からネットワーク周りの設定までを話そうかなと思います!
自宅でのオンプレ運用に必要な物
今回は、あくまでも一般向けの環境なので、ヤマハのルータを用意したりはしません。
※逸般の誤家庭向けではない。
業務用ではなく、一般的な家電量販店で調達できるものをベースに環境を構築します!
必要なもの
- 光回線契約(マンション備え付けなどの共用ネットワークを除く)
- 家電量販店でよく見かけるWi-Fiルータ:2台
一般的な物、今回はNEC社の物で統一
CTOへの謀反ではないです本当なんです - サーバにする予定のマシン:1台
※本稿では自分への早めのクリスマスプレゼントとして購入したRaspberry Pi 5 4GBモデルを使用 - 32GB以上のmicroSD :1個(Ubuntu Server書き込み用、メインストレージになるので大きめのサイズ推奨)
- LAN ケーブル:7本ほど
cat5E 以上、適当な長さのもの - L2スイッチ(スイッチングハブ):2台
あれば嬉しい物
どこまでを自作していくのか
改めてどのような手順でネットワークが構成されているのかを話しておこうかなと思います!
ネットワークはOSI参照モデルという国際標準化機構が定めた7つのレイヤーに分類されます。
必要なものにもあるL2スイッチ(スイッチングハブ)は、レイヤーの2番目に該当しています。
レイヤーの数字が小さくなるほど、ソフトウェアではなく物理的なものが必要になってきます。コネクターとかケーブルとか。
ちなみにトラフィックを捌くルータ(Wi-Fiルータ)はL3スイッチに相当するもので、ここまでは物理的なものが必要になります。
L3スイッチも自作できるそうですが、今回のスコープからは外れるので触れないでおこうかなと思います。
買った方がタイパいいし、確実に欲しいものが手に入るし。。
今回は以下のレイヤーについて構築するものとします。
- L6(プレゼンテーション層)
公開するWebアプリ(本稿では作成しないので、適当なものを用意すること) - L4(トランスポート層)
サーバ側の設定(TCP) - L3(ネットワーク層)
ルータの設定 - L2(データリンク層)
スイッチングハブの接続 - L1(物理層) LANケーブルの接続
詳しいことをここに記すには余白が狭すぎるので、気になった方は調べてみてください!
情報試験を受けるよって方は特に!!!正直、合ってるか自信ないです!!!!
ネットワーク構成について
一般的なネットワーク構成図
前置きが長くなりました。
さて、皆さんのご家庭のネットワーク構成図はどのようになっているでしょうか?
壁から出ているLANのコネクターに差し込んで、店で買ったWi-Fiルータに接続したらなんか使えた!
みたいな感じで、厳密に把握している人は少ないのではないでしょうか?
大まかな図にすると、こんな感じですかね?
スッキリしてていいなって思いました(小並感)
今回はこのブッ刺せば動く!から、ネットワークを切り分けて、かなり面倒な構成にしていきます!
今回目指すネットワーク構成図
さて、今回のサーバを公開するにあたって面倒になった構成はこちらになります。
我が家のネットワークの簡易版なのですが、何が何だかさっぱりだと思うので、解説していきます!
ルータが2台ある理由
このネットワークにはルータが2台存在しています。
それぞれの役割としては、
となっております。
一度、それぞれで設定を行い、その後に回線を油そばのように混ぜ混ぜして美味しくいただく、と言った感じです!
一台で完結する製品もあるのですが、製品の都合上、メッシュWi-Fiを組むと一台で完結できないようなので、このような構成になっています。
ipv4 と ipv6 について
2台のルータに分離して設定した理由として大きいのが、通信規格の違いです。
ipv4とはPPPoEという昔からの通信規格のことで、2進法で32桁、約43億個のIPアドレスが存在できます。
127.0.0.1のような開発現場でもよく見るやつですね。
ただ、この規格はご自宅の終端装置からプロバイダーの終端装置まで律儀にトラフィックを通るため、速度低下につながっています。
それだけでなく、世界人口が80億人ほどなので、それと比べてもIPアドレスの数が不足していることが分かるかと思います。
スマホ2台持ちの人とかもいますしお寿司。
一方のipv6は、IPoE(transixやv6プラス、v6コネクト、DS-Lite方式など)と呼ばれるという新しい規格に対応しており、こちらも同じく2進法ですが、128桁まで対応しているので、約340澗個(5000兆が霞んで見える……)のIPアドレスが存在できます!実質無限!
また、プロバイダーの終端装置を通ることなく、代わりにゲートウェイルータというものを直接通ることで、速度を担保しています。
じゃあipv6だけでいいじゃんね♪と思うかもしれませんが、残念ながらプロバイダー側からポート開放などの制限をかけられてるため、融通か効かないという弱点もあります。
そのため、今回は、面倒くさい設定を省くためにも物理的に2台用意し、通常の通信用・サーバ用でネットワークを切り分けることにしました。
ipv4とipv6について詳しいことは皆さんお世話になりっぱなしであろう"みかかさん"こと"NTTさん"が解説してくれています!(漂うインターネット老人会感)
ルータ側の設定
ではいよいよルータの設定を行なっていきます。
壁から生えているLANのコネクタからスイッチングハブに繋いで、そこから更に2本、ルータ2台に繋いで行きます。
無事に繋ぐことはできましたかね?
そうしたら、ルータのIPアドレスを固定していこうと思います!
IP アドレスの固定
サーバを公開するためのネットワークを構築する上で大事なのが、IPアドレスの固定です。
ルータには自動でIPアドレスを振ってくれるDHCPサーバ機能という便利機能があります。
しかし、アクセスする度にIPアドレスが変わってしまうので、どこにアクセスすればいいの?という事態に陥ります。
DHCPサーバ機能を切って接続するマシンから都度、個別に設定するという方法もありますが、、ガジェットおじさん的にはガジェットと共に面倒も増える……
そのため、IPアドレスを固定する必要性があるのですが、今回は、サーバだけでなく通常の通信も含むので、同一セグメント化に配置してやる必要性が出てきます。
同一セグメントとはIPアドレスの3つ目までが同じ状態を意味します。
129.168.XXX.YYYのXXXまでが同じような状態です。
なので、以下のように設定していきます。
- 192.168.10.100:ipv4用のルータ(物理層・有線のみ使用するのでWi-Fi機能OFF)
- 192.168.10.1:ipv6用のルータ(スマホなどで速い通信をしたいのでWi-Fi機能ON)
※ルータによってIPアドレスの固定、ルータの設定方法は異なるので、説明書を確認してください。
IPアドレスの固定と、それぞれの設定を行なったものがこちらになります。
for-serverにはPPPoEの設定をし、192.168.10.100で固定、WX1800HPにはv6コネクト(IPoE)の設定をし、192.168.10.1で固定されているのが分かるかと思います。
同一セグメントの設定での注意点として、お互いの枠に干渉しないようにする必要性があります。
例えば、ipv6用のルータで割り当てに制限がないとして、DHCPサーバ機能で192.168.10.101にIPアドレスが自動で振られた際に、これはipv4用のルータの管轄?それともipv6用のルータの管轄?と混乱してしまいます。
最近はルータが優秀なのでうまいことやってくれるかもしれませんが、ルータ毎に使用するIPアドレスを明確にする意味でも割り当て個数の設定をしておきましょう。
ポートマッピング(NAT エントリー)の設定
さて、設定ができたところで、外部に公開するためにルータに穴を開けていきます。
穴と言っても物理的にではなく、通信を許可するための経路です。dockerのポート云々に近いかもしれません。
今回、公開するサーバーは192.168.10.254でIPアドレスを固定し、Apacheでの公開を想定しているため、ポートは80番を設定しておきます。
TCPとはコネクション指向のプロトコルで、信頼性のあるデータ通信を提供することが可能です。
一方、UDP (User Datagram Protocol)とはコネクションレスのプロトコルで、非常に軽量な通信を提供することが可能です。
今回は以下に該当する単なるWebページのため、TCP(TransmissionControlProtocol)を開放!
- リアルタイム性のある通信は求められてない
- データの信頼性や順序が優先されるため
詳しくは以下のページを参照してください。
……ようやく中盤といったところですかね。
みなさん無事に着いて来れていますでしょうか?
筆者は正直、息が切れてきました()
とはいえ最後までこの勢いで駆け抜けていかねば!次へ!!バトンを!!!渡せないっっ!!!!
ということなので、もう暫くお付き合いください!!!!!
サーバ側の設定もといセットアップ
いよいよやってきました、サーバー構築の時間です!
ちなみに筆者のメインサーバー構成は次のようになっております。
OS | CPU | memory | storage |
---|---|---|---|
Ubuntu Server Ubuntu 22.04.2 LTS | intel core i7 8800 | DDR4 2666 32GB | 1TB HDD * 8台(RAID6) |
RAID構成を除いて一般的ですね!(?)
ここまでやるかどうかは人によると思うので、ひとまず一足早いクリスマスプレゼントを使って最小構成で構築していきます!
……と意気込んでいたはいいものの、いつものOSなしデスクトップPCにインストールする時よりクセがあったため、先人の知恵を借りていきます。
まずは、ubuntu公式よりイメージをダウンロード
続いてbalenaEtcherをインストール
brew install --cask balenaetcher
起動したらFlash from fileを選択。
microSDを対象にインストール!
※それなりに時間がかかるので注意!
インストールが完了したらmicroSDをRaspberry Pi 5 に挿して電源をON!
初期のrootユーザーとパスワードはデスクトップPCにインストールする場合と異なり、次が設定されているみたいです。
ubuntu login: ubuntu password: ubuntu
初期パスワードを入力し終わると、新しいパスワードを設定するように要求されるので、設定します。
晴れてログインできました!見慣れた光景!!
SSH 設定
ひとまずログインができたのでsshの設定を行っていこうかなと思ったのですが、インストール時点で既に入っていたので、有効にしてあげるだけで済みました。
そう思っていた頃が私にもありました。
実はデフォルトでsshのパスワードログインが無効化されているようでして……
次の設定で強引にパスワード方式でのsshに切り替えることができました。
/etc/ssh/sshd_config
のPasswordAuthentication
をyesにしてコメントアウトを外す/etc/ssh/sshd_config.d/
に00-custom.conf
を作成、PasswordAuthentication yes
の一行を記載しオーバーライド
これで強引にパスワード方式でのログインに切り替えができました。
※非推奨かつこれだけ面倒臭い設定になっているので、基本的には鍵認証方式を使いましょう。今回はあくまで検証なので。。。
ファイアウォール設定
ポートマッピング(NAT エントリー)の設定でもやりましたが、今度はマシン側でも穴を開けます!
sudo ufw allow 22 sudo ufw allow 80/tcp
適用できたか確認
sudo ufw status
もしここで無効化されているのであれば有効化します。
sudo ufw enable
コマンドを実行した結果がこちら!
大丈夫そうですかね?
おっと、再読み込みをお忘れなく!
sudo ufw reload
再びのネットワーク設定とIPアドレスの固定
記事のためとはいえキャプチャーボードで強引にスクリーンショットを撮るのも無理があるので、ちゃっちゃとネットワークの設定とIPアドレスの固定を行っていきたいと思います!sshで楽したい!
ネットワークの設定は/etc/netplan/50-cloud-init.yaml
が適用されているので、これを複製。
sudo cp /etc/netplan/50-cloud-init.yaml /etc/netplan/99_config.yaml
複製した99_config.yaml
を次のように書き換えていきます!
network: ethernets: eno1: addresses: - 192.168.10.254/24 routes: - to: default via: 192.168.10.100 nameservers: addresses: [] search: [] version: 2
注意点として、元々あった50-cloud-init.yamlは書き換えないようにしてください。
99〜で設定していればこちらが優先(上書き)されるので問題はないです。
書き換えNGの理由についてはこちらの方が詳しく解説してくれています。
書き換えが完了したらsudo netplan apply
で適用!
無事にできましたかね?
ssh接続できれば完了です!
Apacheの導入と起動
Webサーバ(物理)ができたとしても公開用のソフトウェアがないことには始まらないので、LAMP環境でお馴染みのApacheを入れていきます。
sudo apt install apache2
sudo systemctl status apache2
ステータスの確認が取れたら完了!
DDNSの導入
さて、サーバー公開までの設定はあらかた終わりました!次で最後の設定です!
何故、個別に回線を引く必要性があるのか、ipv4 と ipv6 についてでも述べましたが、個人の特定をするためのIPアドレスがないと個人のサーバーとして公開できないからです。
マンション備え付けの共用ネットワークだと、個人のものではなく、大家さんのものなので無理なのです。
ということで、早速このIPアドレスを使って……といきたいところですが、3桁x4つで構成されている数字の羅列を言われて覚えられる人っていますかね?
A「お前ん家どこ?」
B「座標で言ったらここかな。」
A「いや、住所を教えてくれよ!!」
というのと同義なんじゃないかなと。A君嫌われているんですかね??
じゃあどうすりゃええねん!となってしまいますが、IPアドレスによるアクセス以外にドメイン名やホスト名でも同様にサーバーへアクセスすることができます!
皆さんご利用中のamazonやヨドバシ.comなんかも分かりやすいアドレスになっていますよね!
これらの企業は独自でドメインを取得しているのでこのような芸当ができるのですが、一般人、ましてや検証がメインとなるとわざわざ取得するのもなぁ……というのが人の常というやつです。
かなり説明を省きますが、DDNSの仕組みを使えば、固定IPアドレスやドメインを持っていなくても、一定の制約下の中でドメインを保有することができます!しかも無料! あらやだお得じゃないですか奥さん!(cv.隣のおばちゃん)
そしてDDNSで有名なものとしてMy DNSというものがございまして、今回はこれを使用して分かりやすい名前をつけていきます!
MyDNSの設定について
MyDNSの仕組みとしては、アクセス(ログイン)を行った場所のIPアドレスをドメインと紐付けるようになっています。
そのため、サーバー側でcronにて定期的にアクセスしてやることで、常に適用できるようになります。
MyDNSにて初回登録を済ませると、次のようなメールが送信されます。
MasterIDとPasswordでログインします。
ログインしたら、Domain Infoのタブに移動し、画面下部の情報に以下の情報を入力します。
Domain:好きなもの HostnameとType:TypeをAとAAAAに変更し、Hostnameに*を入力。
次のようになっていればおkです!
このままだとドメインとグローバルIPアドレスの紐付けがされていないので実際にwgetでアクセスしにいきます!
無事にできていれば最後のcron設定といきましょうか!
今回は使い慣れてるというのと、社内にてユーザー数が伸び悩んでいることからvimを使おうかなと思います!
*/5 * * * * /usr/bin/wget -o - "https://MasterID:Password@ipv4.mydns.jp/login.html */5 * * * * rm -r ./login.html*
上記のcronは5分ごとにMyDNSへログインを行い、login.html関連のファイルを一掃するように設定してあります。
ログインする度にログインの残骸となったhtmlファイルが溜まり続けるのもアレなので。
いよいよ公開!
と心の中で思ったならッ!その時スデに行動は終わっているんだッ!
というのも、Apacheを入れた地点で/var/www/html/index.html
が作成されるので、見ようと思えば見れてしまうのです。
なので、このindex.htmlを好きにいじれば良い感じになるかも?
と、ちょっと呆気ない終わり方かもですが、無事に公開できたのでヨシ!
※検証用でセキュリティにも不安要素があったので、速攻でサーバーを潰しました。
そのため上記ドメインへアクセスしても記事を公開した今は何も見れません。
総評
正直、セキュリティに難ありな形での実装なので、運用自体は不可能かなと思います。
セキュリティの穴としては以下が挙げられます。
脆弱性しかないという中々スリリングな感じにはなりましたが、作った!動いた!といった入門編・検証実験としてはアリなのかな?
ネットワーク構成自体も正直、ONUからルータ2台に繋ぐことで故障部品の削減もできそうですし、まだまだ改善点があるといった感じですかねぇ……
本業じゃないし……と一言で片付けるのが一番楽ですが、領域を広げて視野を広く持ち、出来ることを増やすのも時には大事なんじゃないかな〜と思ったフロントエンドエンジニアなのであった!
おわりに
さてさて、趣味に走ったが故に長文早口オタクになりましたが、これで自宅サーバーについての記事は以上になります!
みなさんの自分へのクリスマスプレゼントはもう決まったようなもんですね!(?)
これを機に通信周りの勉強をするのもありなのかなと思いませんか?もし思っていただけたなら幸いです。
各種情報試験にも通信の問題は絡んでくるので、試験が近い方は追い込みファイトです!
弊社ではエンジニアを募集しております。まずはカジュアル面談でお話ししましょう!
ご興味ありましたら、ぜひご応募ください!
iimon採用サイト / Wantedly / Green
次回は、ネットワーク・サーバーサイドが本業、SREの「須藤」さんです! お楽しみに!