iku8log

Webエンジニア、SEO、Web解析等々しております。タダのメモ。

固定IPが取れないアパートで自宅サーバを公開してみた!

現在住んでるアパートは集合回線で、globalなIPが一つありそこからプライベートIPを振り出されている状況です。 よくあるやつですね。

ネット回線も遅く、自前で個人回線ひこうと思ったのですが、管理会社にダメ!って言われてので諦めました。 引ければ固定IPとって自宅サーバ立ててみるかと思ってたんですが。

とにかく、こんな環境でも無理やり自宅サーバを立て、HPを公開することができたのでメモしておきます。 VPSによる自宅サーバ公開方法があったので、参考にしました。 ちょうどさくらのVPSを2つかりてて、1つは全く使ってなかったので今回利用してやりました。

※HPを公開したかった訳ではありません。 自分のモチベーションとしては勉強目的です。今回の設定で色々と勉強できました。

必要な技術

  • VPS
  • VPN
  • Linuxルータ(iptablesによるnat)

この2つぐらいかなと思います。VPNの中で公開鍵だとかCAとかSSLといったキーワードが出てきます。

流れ

設定の流れはこうです。 まず公開したい自宅サーバ(CentOS7をインストールしている)あります。Apache等をテキトーに起動でもしときましょう。 次にVPSにVPNサーバを構築していきます。

VPNサーバで鍵とか証明書とか発行するので、それらをコピって自宅サーバに配置します。 自宅サーバからVPNサーバにVPN接続します。

VPSはLinuxルータとしても使用します。iptablesで自宅サーバにリクエストを飛ばしてやります。

これにより、VPSでリクエストを受け取り、VPNを通って自宅サーバまで到達。世界に自宅サーバを公開する事ができました、となるわけですね。

設定中はよく分かりませんでしたが、やはり手を動かしてトライ&エラー繰り返すと見えてくるものがありますね。 では、設定していきましょう。

以下、記述中なので、少々お待ちを....。コメントで早くしろってもらえると早くします。

VPSにOpenVPNでVPNサーバを構築

自宅サーバからVPNサーバにVPN接続

Linuxルータによるリクエスト転送

Vagrantで作成した仮想マシンで、BIND9を使ってDNSを作成してみた

DNSの勉強がてら、VMにDNSを作成して、名前解決できるようにしてみました。 やはりこの辺の知識は、実践して初めて定着しますね。

※触りの設定だけしているので、あまり踏み込んでいません。 ※実行OSはCentOS7です。

全体の流れ

  • bind9をインストール&起動
  • DNSの設定ファイルを記述
  • IPとドメインの対応表(ゾーンファイル)を作成
  • サーバ使用するDNSを指定
  • bind9の設定反映(再起動)
  • 名前解決出来るかテスト

BIND9をインストール

まずはbind9をインストールします。bind9はDNSサーバになります。

sudo yum install -y named

named-chrootというディレクトリをマウントしてくれるものがあるのですが、今回はなしです。 chrootを使うと、セキュリティ的に何かと良いらしいので、実際に稼働するDNSでは必須ですね。

namedがインストールできたら、サービスを起動しておきます。

sudo systemctl start named

DNSファイルの設定

bind9の設定ファイルは /etc/named.confにあります。 ここからは、root権限のファイルしか編集しないので、rootになっておきましょう。

sudo su

以下、必要なところだけ書くので、適宜設定してみてください。

listen-on port 53 { 172.0.0.1; };
allow-query     { localhost; };

zone "local.net" IN {
       type master;
       file "local.net.zone";
};

listen-onは「問い合わせを受け付けるインターフェースのIP」らしいのですが...。はて? とにかく、このDNSを使うことのできるサーバのIPを記述しておくのかな。

allow-queryは「DNSへの問い合わせを許可するIP」だそうですが...。listen-onと何が違うのかw とにかく、これもDNSを使うことのできるサーバのIPを記述しておきましょう。

今回はDNSサーバのみしか使わないので、自分自身をさせばOKです。(listen-onで他サーバのIPを記述するとうまくいかないので、ネットワークを記述しましょう。192.168.33.0/24とか)

ゾーンファイルですが、今回はlocal.net.zoneという名前のファイルを用意し、そこに記述していくようにしました。 ゾーンファイルはIPアドレスとドメインの対応表ですね。

ゾーンファイルの設定

ゾーンファイルは/var/namad/local.net.zoneで作成しました。

$TTL 86400

@ IN SOA local.net root.local.net (
  2017121408     ; Serial
  3600           ; Refresh
  900            ; Retry
  604800         ; Expire
  86400          ; Minimum
)

@            IN NS ns
ns IN A  192.168.33.10

細かい設定は割愛します(まだ詳しくないので)。 nsをDNSサーバに割り当てます。 言い忘れていましたが、DNSサーバのIPは192.168.33.10です。Vagrantの初期設定のまま。

ns IN A  192.168.33.10

の部分が一番重要ですね。他サーバの名前解決をしたい場合は、この行を複製し、適宜IP等変えていってください。

サーバにDNSを設定

DNSの設定は終わりですが、DNSが乗っているサーバ自体、どのDNSで名前解決をするのか分からないのでその設定をします。(自分自身で解決するのですが)

/etc/resolv.confを利用します。

search local.net
nameserver 127.0.0.1

ここで注意するのが、192.168.33.10ではなく127.0.0.1であることです。 192..ではlisten-onで許可していないからです。listen-onでlocalhost(または192.168.33.10)と記述していれば通るようです。

また、search local.netの部分ですが、 これは、例えばping ns.local.netといちいち書かなくても、 ping nsとするとlocal.netを探しに行って、pingが通るようになります。

超余談ですが、僕はpingをピングと呼んでましたが、最近ピンと呼ぶようになりましたとさ。

名前解決テスト

では、実際にDNSがちゃんと動作しているか確認してみましょう。 と、その前に、今回設定したファイルの内容をDNSに反映するため、BIND9を再起動しましょう

sudo systemctl restart named

ではping飛ばしてみます。

ping ns

これで応答が帰ってくるようになっているはずです!

まとめ

今回は、DNSサーバ自体で名前解決を行いました。 せっかくDNSを立てているので、複数VM作って、それぞれに名前振って名前解決するほうが楽しいと思います(VMのresolv.confの設定は忘れずに)。

最後に今回の内容をまとめます。

  1. まず、BIND9をインストールしました
  2. DNSの設定ファイルで問い合わせ可能なIP設定、ゾーンファイルの指定をしました
  3. ゾーンファイルでIPとドメインの結びつけを行いました
  4. resolv.confにてそのサーバで使用するDNSを指定しました(今回は自サーバ)
  5. BIND9を再起動
  6. pingで名前解決テスト

ぱぱっとしたメモなので、軽い参考程度に。

スイッチ周り入門してみた

ただの備忘です。

キーワード

スイッチ周りについて

スイッチというのは、複数のPCをつなぐためのものです。 ハブ(リピータハブ)で良くね?と思いますが、それではダメなんですね。

スイッチとリピータハブではコリジョンドメインが違う?

まずリピータハブですが、これにA、B、CというPCがつながっているとします。

リピータハブでつながれたPC同士の通信は1対1のものしか許可されません。

例えば、AがBに話しかけます。Bが「なんだい?」とA、Bはお話(通信)を初めます。 AとBがお話(通信)している時、CがどんなにAと話したくても、「ダメ」と言われちゃうんですね。なるほど。

ここで、AとBが互いに話しかけようとした時、両者がぶつかって、うまく話すことができません。これを検知するのが「CD」

これら上記のことをまとめて「CSMA/CD方式」というらしいです。ざっくりしてますが..。 CS「だれか話ししてないかなと聞き耳を立てる」、MA「誰でも話かけられる」、CD「両者が互いに話しかけた時、衝突を検知する」

↑こんなことをしてうまく、話せるようにしてくれるんですね。 ここまでがリピータハブ。

じゃリピータハブじゃ何故ダメなのか? ABCにDも追加したとしましょう。 AとBは話をしている。 CはDと話がしたいけど、AとBが話をしているので話せない。

なんか変な光景じゃないですか?そこで、AとBのグループ、CとDのグループに分けてやります。よく話す者同士でね。

するとAとBで話が盛り上がっていても、CとDで話ができちゃうんですね。 この分けることの出来るものが、スイッチです。

スイッチにはポートが1〜4あり、1にA、2にB、3にC、4にDと指します。で、スイッチの設定でポート1と2は一つのグループ、3と4はもう一つ別のグループにします。 これでめでたしとなるわけです。

この会話でき、衝突が起こる可能性がある範囲をコリジョンドメインといいます。このコリジョンドメインを超えて話す場合はスイッチにMACアドレステーブルがあるのでそれを使います。このことをフィルタリング処理といいます。

リピータハブではAがBに話始めようとすると、CとDにも届くのですが、スイッチを使うことで届かなくなります。無駄なことはしないってことですね。

コリジョンドメインとブロードキャストドメイン

スイッチを使っていて、衝突が起こりうる範囲のことをコリジョンドメインと言いました。

ブロードキャストドメインはスイッチまたがって、繋がっているもの全てが対象になります。たぶん。 ブロードキャストドメインコリジョンドメインの範囲に抑えるなら、ルータが必要なようですね。

ルータの入門はまた今度。

Vagrantで作成した仮想マシンにVirtualHostの設定を行う

ホストOS: MacOSX ゲストOS: CentOS7 192.168.33.10

ゲストOSのApacheにバーチャルホストの設定を行う。バーチャルホスト名をmytestとする。

httpd.confファイルに以下を追記(ゲストOS)

<VirtualHost *:80>
    DocumentRoot "/home/vagrant"
    ServerName mytest
</VirtualHost>

/home/vagrantの権限を755とかにしておく。 Apache リスタート

ホストOS(Mac)でhostsファイルの設定

/etc/hostsに以下を追記(ホストOS)

192.168.33.10 mytest

CentOS7で「Apache2.4」と「PHP7」をソースからインストールしphp-fpm経由で起動する

現在時点で最新のバージョンを使うことにします。

環境・各種バージョン

  • CentOS7
  • Apache2.4.29
  • APR 1.6.3
  • apr-util-1.6.1
  • PHP7.1.10

インストール・ソース置き場所

インストール場所は→/opt/app/local ソースは→/opt/app/local/src

Apacheのインストール

apr, apr-util,pcre等々インストールしておかなくてはなりません。そのうち追記します。

上記インストール後Apacheのソースをダウンロードして回答してインストールを実行します。

PHPのインストール

事前に必要なものをインストール

sudo yum install libxml2-devel

sudo yum install bzip2-devel

sudo yum install curl-devel

sudo yum install libjpeg-devel

sudo yum install libpng-devel

sudo yum install libXpm-devel

sudo yum install -y freetype-devel

sudo yum install gmp-devel -y

yum install epel-release

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm


sudo yum install libmcrypt

sudo yum install libmcrypt-devel

sudo yum install aspell-devel

sudo yum install aspell-devel.x86_64

sudo yum install recode-devel

ソース取得

sudo wget -O php-7.1.10.bz2 http://jp2.php.net/get/php-7.1.10.tar.bz2/from/this/mirror

インストールの準備

./configure \
    --prefix=/opt/app/local/php-7.1.10 \
    --enable-mbstring \
    --enable-zip \
    --enable-bcmath \
    --enable-pcntl \
    --enable-ftp \
    --enable-exif \
    --enable-calendar \
    --enable-sysvmsg \
    --enable-sysvsem \
    --enable-sysvshm \
    --enable-wddx \
    --with-curl \
    --with-mcrypt \
    --with-iconv \
    --with-gmp \
    --with-pspell \
    --with-gd \
    --with-jpeg-dir=/usr \
    --with-png-dir=/usr \
    --with-zlib-dir=/usr \
    --with-xpm-dir=/usr \
    --with-freetype-dir=/usr \
    --enable-gd-native-ttf \
    --enable-gd-jis-conv \
    --with-openssl \
    --with-gettext=/usr \
    --with-zlib=/usr \
    --with-bz2=/usr \
    --with-recode=/usr \
    --with-mysqli=mysqlnd \
    --enable-mysqlnd \
    --with-pdo-mysql=mysqlnd \
    --with-readline \
    --enable-fpm

php.ini設定

/opt/app/local/src/php-7.1.10/php.ini-productionをコピー↓

/opt/app/local/php-7.1.10/lib/php.ini

php-fpm設定

php-fpm.conf.defaultをコピー↓

/opt/app/local/php-7.1.10/etc/php-fpm.conf

[global]
pid = /opt/app/local/php-7.1.10/var/run/php-fpm.pid



include=/opt/app/local/php-7.1.10/etc/php-fpm.d/*.conf

/opt/app/local/php-7.1.10/etc/php-fpm.d/www.conf


user = nobody
group = nobody

listen = 127.0.0.1:9000

listen.allowed_clients = 127.0.0.1
pm = static

pm.max_children = 5

pm.start_servers = 2

pm.min_spare_servers = 1

pm.max_spare_servers = 3

composerインストール

sudo /opt/app/local/php-7.1.10/bin/php php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
sudo /opt/app/local/php-7.1.10/bin/php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
sudo /opt/app/local/php-7.1.10/bin/php composer-setup.php
sudo /opt/app/local/php-7.1.10/bin/php ./composer.phar --version

phpとパスをとうしておくと、sudo /opt/app/local/php-7.1.10/bin/php 指定しなくて良い(最後の行)

Laravelでもインストールしてみる

sudo /opt/app/local/php-7.1.10/bin/php create-project --prefer-dist laravel/laravel=5.5 myApp

バーチャルホスト設定

以下のように設定してみた。php-fpmを使うと*.phpにマッチするまで見てくれないので、index.phpを指定した。

<VirtualHost *:80>
    DocumentRoot "/home/vagrant/myAp/public"
    ServerName myapp
    DirectoryIndex index.php

    <Directory "/home/vagrant/myAp/public">
        AllowOverride All
    </Directory>
</VirtualHost>