iimon TECH BLOG

iimonエンジニアが得られた経験や知識を共有して世の中をイイモンにしていくためのブログです

師走だし自宅サーバを構築した話をしてもいいんじゃないかな

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スイッチも自作できるそうですが、今回のスコープからは外れるので触れないでおこうかなと思います。

買った方がタイパいいし、確実に欲しいものが手に入るし。。

今回は以下のレイヤーについて構築するものとします。

詳しいことをここに記すには余白が狭すぎるので、気になった方は調べてみてください!

情報試験を受けるよって方は特に!!!正直、合ってるか自信ないです!!!!

eset-info.canon-its.jp

ネットワーク構成について

一般的なネットワーク構成図

前置きが長くなりました。

さて、皆さんのご家庭のネットワーク構成図はどのようになっているでしょうか?

壁から出ているLANのコネクターに差し込んで、店で買ったWi-Fiルータに接続したらなんか使えた!

みたいな感じで、厳密に把握している人は少ないのではないでしょうか?

大まかな図にすると、こんな感じですかね?

一般家庭のネットワーク構成図

スッキリしてていいなって思いました(小並感)

今回はこのブッ刺せば動く!から、ネットワークを切り分けて、かなり面倒な構成にしていきます!

今回目指すネットワーク構成図

さて、今回のサーバを公開するにあたって面倒になった構成はこちらになります。

逸般家庭のネットワーク構成図

我が家のネットワークの簡易版なのですが、何が何だかさっぱりだと思うので、解説していきます!

ルータが2台ある理由

このネットワークにはルータが2台存在しています。

それぞれの役割としては、

  • ①:ipv6による高速ネットワーク設定
  • ②:ipv4によるサーバ公開用のネットワーク設定

となっております。

一度、それぞれで設定を行い、その後に回線を油そばのように混ぜ混ぜして美味しくいただく、と言った感じです!

一台で完結する製品もあるのですが、製品の都合上、メッシュWi-Fiを組むと一台で完結できないようなので、このような構成になっています。

ipv4ipv6 について

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台用意し、通常の通信用・サーバ用でネットワークを切り分けることにしました。

ipv4ipv6について詳しいことは皆さんお世話になりっぱなしであろう"みかかさん"こと"NTTさん"が解説してくれています!(漂うインターネット老人会感)

www.ntt.com

ルータ側の設定

ではいよいよルータの設定を行なっていきます。

壁から生えているLANのコネクタからスイッチングハブに繋いで、そこから更に2本、ルータ2台に繋いで行きます。

無事に繋ぐことはできましたかね?

そうしたら、ルータのIPアドレスを固定していこうと思います!

IP アドレスの固定

サーバを公開するためのネットワークを構築する上で大事なのが、IPアドレスの固定です。

mvno.freebit.com

ルータには自動でIPアドレスを振ってくれるDHCPサーバ機能という便利機能があります。

しかし、アクセスする度にIPアドレスが変わってしまうので、どこにアクセスすればいいの?という事態に陥ります。

DHCPサーバ機能を切って接続するマシンから都度、個別に設定するという方法もありますが、、ガジェットおじさん的にはガジェットと共に面倒も増える……

そのため、IPアドレスを固定する必要性があるのですが、今回は、サーバだけでなく通常の通信も含むので、同一セグメント化に配置してやる必要性が出てきます。

同一セグメントとはIPアドレスの3つ目までが同じ状態を意味します。

129.168.XXX.YYYのXXXまでが同じような状態です。

www.iodata.jp

なので、以下のように設定していきます。

  • 192.168.10.100:ipv4用のルータ(物理層・有線のみ使用するのでWi-Fi機能OFF)
  • 192.168.10.1:ipv6用のルータ(スマホなどで速い通信をしたいのでWi-Fi機能ON)

※ルータによってIPアドレスの固定、ルータの設定方法は異なるので、説明書を確認してください。

IPアドレスの固定と、それぞれの設定を行なったものがこちらになります。

ipv4用ルータ設定
ipv4用ルータ設定

ipv6用ルータ設定
ipv6用ルータ設定

for-serverにはPPPoEの設定をし、192.168.10.100で固定、WX1800HPにはv6コネクト(IPoE)の設定をし、192.168.10.1で固定されているのが分かるかと思います。

同一セグメントの設定での注意点として、お互いの枠に干渉しないようにする必要性があります。

例えば、ipv6用のルータで割り当てに制限がないとして、DHCPサーバ機能で192.168.10.101にIPアドレスが自動で振られた際に、これはipv4用のルータの管轄?それともipv6用のルータの管轄?と混乱してしまいます。

最近はルータが優秀なのでうまいことやってくれるかもしれませんが、ルータ毎に使用するIPアドレスを明確にする意味でも割り当て個数の設定をしておきましょう。

ipv4用ルータ割り当て設定
ipv4用ルータ割り当て設定

ipv6用ルータ割り当て設定
ipv6用ルータ割り当て設定

ポートマッピング(NAT エントリー)の設定

さて、設定ができたところで、外部に公開するためにルータに穴を開けていきます。

穴と言っても物理的にではなく、通信を許可するための経路です。dockerのポート云々に近いかもしれません。

今回、公開するサーバーは192.168.10.254でIPアドレスを固定し、Apacheでの公開を想定しているため、ポートは80番を設定しておきます。

ipv4ルータNATエントリー設定
ipv4ルータNATエントリー設定

設定項目にTCPUDPか選択を求められるかと思います。

TCPとはコネクション指向のプロトコルで、信頼性のあるデータ通信を提供することが可能です。

一方、UDP (User Datagram Protocol)とはコネクションレスプロトコルで、非常に軽量な通信を提供することが可能です。

今回は以下に該当する単なるWebページのため、TCP(TransmissionControlProtocol)を開放!

  • リアルタイム性のある通信は求められてない
  • データの信頼性や順序が優先されるため

詳しくは以下のページを参照してください。

qiita.com

……ようやく中盤といったところですかね。

みなさん無事に着いて来れていますでしょうか?

筆者は正直、息が切れてきました()

とはいえ最後までこの勢いで駆け抜けていかねば!次へ!!バトンを!!!渡せないっっ!!!!

ということなので、もう暫くお付き合いください!!!!!

サーバ側の設定もといセットアップ

いよいよやってきました、サーバー構築の時間です!

ちなみに筆者のメインサーバー構成は次のようになっております。

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にインストールする時よりクセがあったため、先人の知恵を借りていきます。

aquasoftware.net

まずは、ubuntu公式よりイメージをダウンロード

Preinstalled server imageの欄よりRaspberry Pi Generic (64-bit ARM) preinstalled server imageでリンクが貼られています
Preinstalled server imageの欄よりRaspberry Pi Generic (64-bit ARM) preinstalled server imageでリンクが貼られています

続いてbalenaEtcherをインストール

brew install --cask balenaetcher

起動したらFlash from fileを選択。

balenaEtcherメイン画面
balenaEtcherメイン画面

microSDを対象にインストール!

balenaEtcher書き込み選択画面
balenaEtcher書き込み選択画面

※それなりに時間がかかるので注意!

インストールが完了したらmicroSDRaspberry Pi 5 に挿して電源をON!

初期のrootユーザーとパスワードはデスクトップPCにインストールする場合と異なり、次が設定されているみたいです。

ubuntu login: ubuntu
password: ubuntu

初期パスワードを入力し終わると、新しいパスワードを設定するように要求されるので、設定します。

晴れてログインできました!見慣れた光景!!

ubuntu server ログイン画面
ubuntu server ログイン画面

SSH 設定

ひとまずログインができたのでsshの設定を行っていこうかなと思ったのですが、インストール時点で既に入っていたので、有効にしてあげるだけで済みました。

ubuntu server ssh設定
ubuntu server ssh設定

そう思っていた頃が私にもありました。

実はデフォルトでsshのパスワードログインが無効化されているようでして……

次の設定で強引にパスワード方式でのsshに切り替えることができました。

  • /etc/ssh/sshd_configPasswordAuthenticationをyesにしてコメントアウトを外す
    sshd_config
    sshd_config
  • /etc/ssh/sshd_config.d/00-custom.confを作成、PasswordAuthentication yesの一行を記載しオーバーライド

これで強引にパスワード方式でのログインに切り替えができました。

※非推奨かつこれだけ面倒臭い設定になっているので、基本的には鍵認証方式を使いましょう。今回はあくまで検証なので。。。

ファイアウォール設定

ポートマッピング(NAT エントリー)の設定でもやりましたが、今度はマシン側でも穴を開けます!

今回はsshApache:80が対象です!

sudo ufw allow 22
sudo ufw allow 80/tcp

適用できたか確認

sudo ufw status

もしここで無効化されているのであれば有効化します。

sudo ufw enable

コマンドを実行した結果がこちら!

ubuntu画面 ufw
ubuntu画面 ufw

大丈夫そうですかね?

おっと、再読み込みをお忘れなく!

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の理由についてはこちらの方が詳しく解説してくれています。

qiita.com

書き換えが完了したらsudo netplan applyで適用!

無事にできましたかね?

ssh接続できれば完了です!

Apacheの導入と起動

Webサーバ(物理)ができたとしても公開用のソフトウェアがないことには始まらないので、LAMP環境でお馴染みのApacheを入れていきます。

sudo apt install apache2
sudo systemctl status apache2

ステータスの確認が取れたら完了!

ubuntu画面 Apache
ubuntu画面 Apache

DDNSの導入

さて、サーバー公開までの設定はあらかた終わりました!次で最後の設定です!

何故、個別に回線を引く必要性があるのか、ipv4 と ipv6 についてでも述べましたが、個人の特定をするためのIPアドレスがないと個人のサーバーとして公開できないからです。

マンション備え付けの共用ネットワークだと、個人のものではなく、大家さんのものなので無理なのです。

ということで、早速このIPアドレスを使って……といきたいところですが、3桁x4つで構成されている数字の羅列を言われて覚えられる人っていますかね?

A「お前ん家どこ?」

B「座標で言ったらここかな。」

A「いや、住所を教えてくれよ!!」

というのと同義なんじゃないかなと。A君嫌われているんですかね??

じゃあどうすりゃええねん!となってしまいますが、IPアドレスによるアクセス以外にドメイン名やホスト名でも同様にサーバーへアクセスすることができます!

皆さんご利用中のamazonやヨドバシ.comなんかも分かりやすいアドレスになっていますよね!

これらの企業は独自でドメインを取得しているのでこのような芸当ができるのですが、一般人、ましてや検証がメインとなるとわざわざ取得するのもなぁ……というのが人の常というやつです。

そこで使用するものが、DDNSことダイナミックDNSです!

www.iodata.jp

かなり説明を省きますが、DDNSの仕組みを使えば、固定IPアドレスドメインを持っていなくても、一定の制約下の中でドメイン保有することができます!しかも無料! あらやだお得じゃないですか奥さん!(cv.隣のおばちゃん)

そしてDDNSで有名なものとしてMy DNSというものがございまして、今回はこれを使用して分かりやすい名前をつけていきます!

www.mydns.jp

MyDNSの設定について

MyDNSの仕組みとしては、アクセス(ログイン)を行った場所のIPアドレスドメインと紐付けるようになっています。

そのため、サーバー側でcronにて定期的にアクセスしてやることで、常に適用できるようになります。

MyDNSにて初回登録を済ませると、次のようなメールが送信されます。

MyDNS送信メール
MyDNS送信メール

MasterIDとPasswordでログインします。

ログインしたら、Domain Infoのタブに移動し、画面下部の情報に以下の情報を入力します。

Domain:好きなもの
HostnameとType:TypeをAとAAAAに変更し、Hostnameに*を入力。

次のようになっていればおkです!

MyDNS Domain Info設定
MyDNS Domain Info設定

このままだとドメイングローバルIPアドレスの紐付けがされていないので実際にwgetでアクセスしにいきます!

MyDNSへwgetでアクセス
MyDNSへwgetでアクセス

無事にできていれば最後のcron設定といきましょうか!

今回は使い慣れてるというのと、社内にてユーザー数が伸び悩んでいることからvimを使おうかなと思います!

cron設定にてvimを使用
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が作成されるので、見ようと思えば見れてしまうのです。

webページが公開できた!
webページが公開できた!

なので、このindex.htmlを好きにいじれば良い感じになるかも?

と、ちょっと呆気ない終わり方かもですが、無事に公開できたのでヨシ!

※検証用でセキュリティにも不安要素があったので、速攻でサーバーを潰しました。

そのため上記ドメインへアクセスしても記事を公開した今は何も見れません。

総評

正直、セキュリティに難ありな形での実装なので、運用自体は不可能かなと思います。

セキュリティの穴としては以下が挙げられます。

  • サーバーがrootユーザーのまま
  • sshのポートが22番のまま
  • sshに鍵認証を使わず強引にパスワード方式を適用
  • Apacheの制限が一切ない
  • etc…

脆弱性しかないという中々スリリングな感じにはなりましたが、作った!動いた!といった入門編・検証実験としてはアリなのかな?

ネットワーク構成自体も正直、ONUからルータ2台に繋ぐことで故障部品の削減もできそうですし、まだまだ改善点があるといった感じですかねぇ……

本業じゃないし……と一言で片付けるのが一番楽ですが、領域を広げて視野を広く持ち、出来ることを増やすのも時には大事なんじゃないかな〜と思ったフロントエンドエンジニアなのであった!

おわりに

さてさて、趣味に走ったが故に長文早口オタクになりましたが、これで自宅サーバーについての記事は以上になります!

みなさんの自分へのクリスマスプレゼントはもう決まったようなもんですね!(?)

これを機に通信周りの勉強をするのもありなのかなと思いませんか?もし思っていただけたなら幸いです。

各種情報試験にも通信の問題は絡んでくるので、試験が近い方は追い込みファイトです!

弊社ではエンジニアを募集しております。まずはカジュアル面談でお話ししましょう!

ご興味ありましたら、ぜひご応募ください!

iimon採用サイト / Wantedly / Green

次回は、ネットワーク・サーバーサイドが本業、SREの「須藤」さんです! お楽しみに!