はじめに
備忘録のようなものです。BuyVMは3ロケーションにVPSがあればAnycast IPを無料でAssignしてくれるのでそれを大いに活用して自前で実装してみます。
AnyCastとは?
エニーキャストアドレス(Anycast Address)とは ~ JPNIC
IPアドレスは、一般的に特定のインタフェースへ一意に割り当てて利用します。 この利用形態のIPアドレスをユニキャストアドレスと呼んでいます。
それに対して、エニーキャストアドレスは、 複数のインタフェースに割り当てられたIPアドレスです。
通常、ネットワークに接続されたデバイス間の通信は1対1ですが、AnyCastを用いることで、ネットワーク上の複数のサーバーが同じIPアドレスを使用できます。つまり、クライアントから一番近いサーバーから応答できたりします。最近ではDNSやCDN等で使われてるのをよく見かけます、というか大体これです。トラフィックを分散できるので、DDoS攻撃の対策にもなり得ますし、各国から来るユーザーに対して遅延を減らすなどできます。今回はAnycast IPをDNS(GSLB)にします。
やってみる
1,BuyVMを用意する
上記のサイトから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"というボタンが表示されるので、これで有効化します。
有効化後↓
各VMでもAnycastが有効化されているかNetworkingタブから確認しましょう。
####VPS側
公式のDocumentがあるので、それを参考にします↓
Frantech/BuyVM Wiki | Anycast IP VPS FREE How-to
基本的にというか普通にAnyCastで割り当てられたIPを各VPSに追加するだけなので、簡単です。
今回はCentOS7を使用するので、nmtuiを使って設定します。
ターミナルにnmtui
と入力し、Edit a connectionを選択します。
IPv4 CONFIGURATIONをManualに設定し、VPSのIPアドレスとAnyCast用に割り当てられたIPを設定します。
GatewayとDNS serversですが、各VMのNetworkingからNetwork Settingを開くことで下の画像のようにInformationが出てくるので、それを設定します。
これを同様に残りのロケーションにあるVPSでも設定します。
systemctl restart network
して設定を反映させます。
試しにAnyCastのIPにPingしてみます。
ちゃんと応答できていれば成功です。日本からPingするとラスベガスからの応答になるので、他のロケーションからの接続を確認したいときにはcheck-host.netや、ping.peを使うとわかりやすいです。
3,GSLBを実装してみる(gdnsd)
今回はTCP/22番のヘルスチェックで設定しますが、↑の記事にてDNSレスポンスの違いやソーリーサーバーの設定などを説明されているので、詳しく知りたい方はベテランさんの記事を参考にすることをおすすめします。私はド初心者ド素人なので。
####gdnsdをインストールする
この内容については、gdnsdでかんたんGSLB(その1)で以下のように説明されています。
まず、コンパイルに必要なパッケージをインストールします。
$ 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にてちゃんと動作しているか確認します。
check-host.net等でDNSが引けるか確認してみます。
うまく引けてれば成功です。
Minecraftサーバーを運営しており、DDoS対策の一環としてHaproxyやNginx等でリバースプロキシを行う予定です。
このconfigではweightedプラグインを使用して適当にダウン検知してやっていますが、もうちょっと凝った設定がしたい方はgdnsdのDocumentなどを見て書いてみることをお勧めします。
まとめ
さくらのGSLBは登録可能なサーバー数が最大12個だったり、レコードごとに料金がかかったりして、20個以上ある自分にとっては自作する必要がありましたが、特に必要でない限りさくらのGSLBやRoute 53を使った方が安いし安定していると思います。BuyVMがAnycast IPを無料で割り当ててくれましたが、希望すればDDoS ProtectedなAnycast IPも月5ドルでゲットできるので、是非使ってみてください。回し者ではないです。
参考文献
この記事は以下の情報を参考にして執筆しました。