月額6ドルから始める簡単AnyCastなGSLB

# はじめに
備忘録のようなものです。[BuyVM](https://buyvm.net)は3ロケーションにVPSがあればAnycast IPを無料でAssignしてくれるのでそれを大いに活用して自前で実装してみます。

# AnyCastとは?
[エニーキャストアドレス(Anycast Address)とは ~ JPNIC](https://www.nic.ad.jp/ja/basics/terms/anycast-address.html)
> IPアドレスは、一般的に特定のインタフェースへ一意に割り当てて利用します。 この利用形態のIPアドレスをユニキャストアドレスと呼んでいます。
それに対して、エニーキャストアドレスは、 複数のインタフェースに割り当てられたIPアドレスです。

通常、ネットワークに接続されたデバイス間の通信は1対1ですが、AnyCastを用いることで、ネットワーク上の複数のサーバーが同じIPアドレスを使用できます。つまり、クライアントから一番近いサーバーから応答できたりします。最近ではDNSやCDN等で使われてるのをよく見かけます、というか大体これです。トラフィックを分散できるので、DDoS攻撃の対策にもなり得ますし、各国から来るユーザーに対して遅延を減らすなどできます。今回はAnycast IPをDNS(GSLB)にします。

# やってみる
## 1,BuyVMを用意する

https://buyvm.net/kvm-dedicated-server-slices/

上記のサイトからVPSを調達します、2021年10月現在ではLas Vegas,New York,Luxembourg,Miamiのロケーションがありますが、MiamiだけはAnycastを有効化できないので、**Miami以外の3つ(LV,NY,LU)だけ調達します**。人気の高いVPSなので、在庫切れが多い + スタッフが手動でVPSを有効化するので少し時間がかかる場合があります。

## 2,Anycastを有効化してみる
3つのロケーションにVPSを持っていると、自動的に"Assign Anycast IP Address"というボタンが表示されるので、これで有効化します。
![4a1gc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216591/fac7264b-153d-b3c8-e9ca-db68c85e1149.png)
有効化後↓
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f323231363539312f35613562376630392d376331392d313238382d366265362d6131396565646436323137352e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216591/51166536-0041-50f5-a955-e0c2eab4f9ba.png)


各VMでもAnycastが有効化されているかNetworkingタブから確認しましょう。

####VPS側
公式のDocumentがあるので、それを参考にします↓
[Frantech/BuyVM Wiki | Anycast IP VPS FREE How-to](https://wiki.buyvm.net/doku.php/anycast_vps)

基本的にというか普通にAnyCastで割り当てられたIPを各VPSに追加するだけなので、簡単です。
今回はCentOS7を使用するので、nmtuiを使って設定します。

ターミナルに`nmtui`と入力し、Edit a connectionを選択します。
![6a46h.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216591/dd9377de-d42b-5b1f-1a13-cb568d36dd1f.png)

`eth0`をEditします
![rqjze.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216591/9255041a-a402-c575-c71f-323079758aff.png)

IPv4 CONFIGURATIONをManualに設定し、VPSのIPアドレスとAnyCast用に割り当てられたIPを設定します。
![uz6aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216591/962d675b-1117-20c3-82a9-8479a9e3613e.png)
GatewayとDNS serversですが、各VMのNetworkingからNetwork Settingを開くことで下の画像のようにInformationが出てくるので、それを設定します。
![3qixb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216591/0116d220-0d50-6544-23ba-4b4bcbb079a3.png)

これを同様に残りのロケーションにあるVPSでも設定します。
`systemctl restart network` して設定を反映させます。
試しにAnyCastのIPにPingしてみます。
![8ann7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216591/a2e085bb-6e88-9c00-8c17-41d38f046422.png)
ちゃんと応答できていれば成功です。日本からPingするとラスベガスからの応答になるので、他のロケーションからの接続を確認したいときには[check-host.net](https://check-host.net/)や、[ping.pe](https://ping.pe)を使うとわかりやすいです。

## 3,GSLBを実装してみる(gdnsd)

* [gdnsdでかんたんGSLB(その1)](https://qiita.com/jh1vxw/items/7ce5d14e9f964f001257)
* [gdnsdでかんたんGSLB(その2)](https://qiita.com/jh1vxw/items/2aa418fde6915e3ab5c3)
* [gdnsdでかんたんGSLB(その3)](https://qiita.com/jh1vxw/items/2120256a56087293532a)

今回はTCP/22番のヘルスチェックで設定しますが、↑の記事にてDNSレスポンスの違いやソーリーサーバーの設定などを説明されているので、詳しく知りたい方はベテランさんの記事を参考にすることをおすすめします。私はド初心者ド素人なので。

####gdnsdをインストールする

この内容については、[gdnsdでかんたんGSLB(その1)](https://qiita.com/jh1vxw/items/7ce5d14e9f964f001257)で以下のように説明されています。
> まず、コンパイルに必要なパッケージをインストールします。

```
$ yum install libev-devel libtool
$ yum localinstall http://netix.dl.sourceforge.net/project/kenzy/special/C7/x86_64/ragel-6.8-3.el7.centos.x86_64.rpm
```
> gdnsdのソースコードを取得し、展開します。

```
$ wget https://github.com/gdnsd/gdnsd/archive/v2.1.3.tar.gz
$ tar xvfz v2.1.3.tar.gz
```
> コンパイルしてインストールします。

```
$ cd gdnsd-2.1.3
$ libtoolize
$ aclocal
$ autoheader
$ automake -a -c
$ autoconf
$ ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var
$ make
$ make install
$ useradd -s /sbin/nologin -r -d /usr/var/run/gdnsd gdnsd
```

####設定ファイルを作る

`1.1.1.a ~ 1.1.1.j` を22番のTCPでヘルスチェックする設定です。自分の環境用に書き換えましょう。
listen は AnyCastで割り当てられたIPを書いておきます。
/etc/gdnsd/config

```
options = {
  listen = [AnyCastのIP]
}
plugins = {
  weighted = {
    test = {
      up_thresh = 0.00000001
      service_types = ssh
      test1 = [1.1.1.a,1]
      test2 = [1.1.1.b,1]
      test3 = [1.1.1.c,1]
      test4 = [1.1.1.d,1]
      test5 = [1.1.1.e,1]
      test6 = [1.1.1.f,1]
      test7 = [1.1.1.g,1]
      test8 = [1.1.1.h,1]
      test9 = [1.1.1.i,1]
      test10 = [1.1.1.j,1]
    }
  }
}
service_types = {
  ssh = {
    plugin = tcp_connect
    port = 22
    interval = 10
    timeout = 5
    up_thresh = 5
    ok_thresh = 3
    down_thresh = 2
  }
}
```

自分のに置き換える。あらかじめ`ns1.example.com`にはAnyCastのIPを設定しておきます。
/etc/gdnsd/zones/example.com

```
$TTL   86400

@      IN      SOA ns1.example.com mail.example.com (
                    2016030303    ; serial
                    7200   ; refresh
                    30M    ; retry
                    3D     ; expire
                    10    ; ncache
)

       IN     NS     ns1.example.com.

test  10     DYNA      weighted!test

```

これを各VPSに設定します。

####動作確認
`$ /usr/sbin/gdnsd start` でgdnsdを起動します。

`各VPSのIP:3506` でWebブラウザからgdnsdの動作を確認できます。もちろんAnycastのIPからでも確認できますが、自分から一番近いサーバーのものが表示されてしまうので、各VPSにてちゃんと動作しているか確認します。
![b8min.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216591/b61f943b-4adc-1c17-558c-86d70696541d.png)

NSレコードをこのように設定して
![xfgj4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216591/d8a0cd7b-2834-032c-7617-ccec2854047a.png)

[check-host.net](https://check-host.net)等でDNSが引けるか確認してみます。
![06p32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216591/562595d4-dcc8-9818-85f4-d4be1345b9ea.png)

うまく引けてれば成功です。
Minecraftサーバーを運営しており、DDoS対策の一環としてHaproxyやNginx等でリバースプロキシを行う予定です。
このconfigではweightedプラグインを使用して適当にダウン検知してやっていますが、もうちょっと凝った設定がしたい方はgdnsdのDocumentなどを見て書いてみることをお勧めします。

# まとめ
さくらのGSLBは登録可能なサーバー数が最大12個だったり、レコードごとに料金がかかったりして、20個以上ある自分にとっては自作する必要がありましたが、特に必要でない限りさくらのGSLBやRoute 53を使った方が安いし安定していると思います。BuyVMがAnycast IPを無料で割り当ててくれましたが、希望すればDDoS ProtectedなAnycast IPも月5ドルでゲットできるので、是非使ってみてください。回し者ではないです。



# 参考文献

この記事は以下の情報を参考にして執筆しました。

- [gdnsdでかんたんGSLB(その1)](https://qiita.com/jh1vxw/items/7ce5d14e9f964f001257)
- [gdnsdでかんたんGSLB(その2)](https://qiita.com/jh1vxw/items/2aa418fde6915e3ab5c3)
- [gdnsdでかんたんGSLB(その3)](https://qiita.com/jh1vxw/items/2120256a56087293532a)
- [Frantech/BuyVM Wiki | Anycast IP VPS FREE How-to](https://wiki.buyvm.net/doku.php/anycast_vps)