自宅サーバ構築の手順　DDNSを使ってVPNを自宅に張る

# 自宅にサーバを作ってみた。
OS CentOS7

OSは入っていて、rootと自分用のアカウントを作った以外には何もしていない状態からサーバからプライベートIPをDDNSに公開して、どこからでもVPNできるようにするまでやる。

僕の記事はしょせん素人なので安心ならんという方向け
https://centossrv.com/
を参照してください。


## SSHDを立てる
https://qiita.com/sango/items/816136188387221f05b3

とりあえず、これでサーバの近くにいなくて済む。
## 時刻を合わせる
まず今の時刻を確認

```bash
$ timedatectl #現在のシステムクロックの確認
#Local time: 金 2018-05-25 23:58:44 JST
#  Universal time: 金 2018-05-25 14:58:44 UTC
#        RTC time: 金 2018-05-25 14:58:44
#       Time zone: Asia/Tokyo (JST, +0900)
#     NTP enabled: no
#NTP synchronized: no
# RTC in local TZ: no
#      DST active: n/a
```

時刻合わせる前は2日分くらいずれてた。よくわからん。

CentOS7 になってから時刻同期にはNTPではなくてChronyを使うようになったらしい。最初NTPを入れてかつ設定してしまって慌てたが、chronyと同時に建てるとNTPの方がDisbaleになるらしいので、放置する。

> NTPを入れたときの参照は[こちら](https://qiita.com/yuba/items/66d2d45a61b28737c098)。ちなみに参照先の

> ```bash
> # ntpd -p これは間違い
> ntpq -p #これが正しい
> ```
> コメントには違うという旨が書かれていたけど、見逃して少し時間を食いました。

話を戻して、chronyのために[ここ](https://centossrv.com/chrony.shtml)を参照。というか最初から[https://centossrv.com/](https://centossrv.com/)を参照していれば何も問題なかった。

最後に、ちゃんとchronyが動いているかを確認するために

```bash
systemctl status chronyd
● chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
   Active: active (running) since 土 2018-05-26 00:20:49 JST; 3min 5s ago
     Docs: man:chronyd(8)
           man:chrony.conf(5)
  Process: 874 ExecStartPost=/usr/libexec/chrony-helper update-daemon (code=exited, status=0/SUCCESS)
  Process: 822 ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 831 (chronyd)
   CGroup: /system.slice/chronyd.service
           └─831 /usr/sbin/chronyd

 5月 26 00:20:49 localhost.localdomain chronyd[831]: chronyd version 3.2 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SECHASH +SIGND +ASYNCDNS +IPV6 +DEBUG)
 5月 26 00:20:49 localhost.localdomain chronyd[831]: Could not change ownership of /var/run/chrony : Operation not permitted
 5月 26 00:20:49 localhost.localdomain chronyd[831]: Could not access /var/run/chrony : No such file or directory
 5月 26 00:20:49 localhost.localdomain chronyd[831]: Disabled command socket /var/run/chrony/chronyd.sock
 5月 26 00:20:49 localhost.localdomain chronyd[831]: Frequency 0.000 +/- 1000000.000 ppm read from /var/lib/chrony/drift
 5月 26 00:20:49 localhost.localdomain systemd[1]: Started NTP client/server.
 5月 26 00:21:23 localhost.localdomain chronyd[831]: Selected source 133.243.238.244
 5月 26 00:21:24 localhost.localdomain chronyd[831]: Source 139.162.66.25 replaced with 108.61.223.189
 5月 26 00:22:29 localhost.localdomain chronyd[831]: Selected source 172.105.231.23
 5月 26 00:23:34 localhost.localdomain chronyd[831]: Selected source 133.243.238.244

```
「Could not ...」言っていて心配になった。ググっても難しそうなところしかでない。[https://qiita.com/Pirlo/items/c4c23cc1ba2b1d3c0673](https://qiita.com/Pirlo/items/c4c23cc1ba2b1d3c0673)を参照。SELinuxをdisableにすれば良いとのこと。その予定だったので、無視する。

### ハードウェアクロックの更新

[ここ](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-configuring_the_date_and_time-hwclock)を参照して

```bash
~]# hwclock --systohc --utc
#次の命令でも同様の効果が得られるらしい
#timedatectl set-local-rtc false #これで上のRTC in local TZをnoにできる。trueならyes
```
とした。これで、ハードウェアクロックはUTCとして、システムクロックに同期した。定期更新されるか心配だけど、[ここ](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-configuring_the_date_and_time-hwclock)には「NTP を使用する場合、ハードウェアクロックは 11 分ごとにシステムクロックに自動的に同期され…」という文があり、これでいいかなという感じ。ずれたらまた手動で直す。

また確認。

```bash
$ timedatectl
      Local time: 土 2018-05-26 00:35:19 JST
  Universal time: 金 2018-05-25 15:35:19 UTC
        RTC time: 金 2018-05-25 15:35:19
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
```


## CentOS7初期設定
- rootになれるユーザーを管理者のみにする
- パッケージ管理システム設定
- root宛メールを転送する
- SELinuxの無効化

https://centossrv.com/centos7-init.shtml
を参考にして、上の内容をこなす。

root宛てにメールを転送してもできない問題。いくら調べてもわからないので放置


## EPELレポジトリを導入
https://centossrv.com/epel.shtml

## セキュリティ系
結局、tripwireもrootkitも定期実行まではしないことにした。悪意のあるユーザに入られたら終了という考え方。
rootkitに至ってはコマンドの退避もしていないので、多分意味がない。
### ファイル改竄検知システム導入(Tripwire)
結局これいらない気がしてきた。

https://centossrv.com/tripwire.shtml

installするときに明示的にepelを指定する必要があった。

```
yum install tripwire --enablerepo=epel
```

ここも参照
http://think-t.hatenablog.com/entry/20140113/p1

### rootkit導入
インストール部分は
https://qiita.com/bezeklik/items/7964ce67f1a1363b694e
参照

以降は
https://centossrv.com/chkrootkit.shtml

### iptables導入
https://centossrv.com/iptables.shtml

## sshの公開鍵認証のみの受付
パスワードによる管理は弱いので、公開するにあたり最小限ここは押さえたい。
https://qiita.com/uhooi/items/137de4578534c8e7e7f2

## DDNSの設定
https://centossrv.com/domain-ieserver.shtml

```bash
#参照先では
#setarch `uname -m` /usr/local/bin/DiCE/diced
#と書かれているが
/usr/local/bin/DiCE/diced
#これで問題なかった
```

また、DiCEをPC起動時に起動するためのコードとして`etc/rc.d/rc.local`にDiCEの起動コマンドを書く箇所があるが、それだけでは起動時には起動してくれないようだ。というのも初期の状態では`etc/rc.d/rc.local`に実行権限がないからだ。だから、

```bash
chmod +x /etc/rc.d/rc.local
```

を実行しようと`etc/rc.d/rc.local`の中に書いてある。

```bash
top | grep diced　#これで実行しているかを確認できる
```
## VPNの設定
最初はサーバそのものにVPNサーバを立てて、直接入ってVPNを張ろうと画策していたが、よくよく見てみれば、うちのNAT兼ルータ君がVPNの機能を持っていた。既にDDNSにIPはさらしているので、本当にVPNの設定をルータに設定するだけだった。

### VPNの設定を終えた後の注意点

- VPNを張る先と同一のLAN内でVPNは張れないみたい
    - 検査時、スマホでテザリングして一旦外部に出てから繋いでみた
- VPNの設定で設定できない項目があり詰まった
    - Windows10の場合、設定->ネットワークとインターネット->VPNのように簡単にVPNの設定ができるが、さらに込み入ったプロパティを指定したい場合はコントロールパネル->ネットワークとインターネット->ネットワークと共有センター->アダプターの設定の変更で所望のVPNを右クリックして、プロパティを弄れば良い