AntiDDoS Premiumと特殊機能TOAについて

#1.はじめに
　サーバーと通信するゲームはいつもネットワークからの攻撃にさらされます。中でも一番やっかいなものにDDoS攻撃という攻撃があります。本記事では、Alibaba Cloudで契約することで、

- Alibaba Cloud以外で稼働しているシステムを防御できるAntiDDoS Premiumの紹介と、
- AntiDDoS Premiumが持つ特殊機能TOAについて

紹介します。

#2.DDoS攻撃とは

　DDoS攻撃とは、世界中にある大量のIT機材を利用して、特定のサービスに対し大量の通信を浴びせることでサービスを妨害する攻撃です。攻撃に使われる通信は、

- 電文そのものがサービスの不具合を誘発させるものを使ったり、
- 通常は無害な通信あるいは、無効な通信を数100Gbpsもサービスの回線に浴びせることで回線を飽和させてサービス停止に追い込むもの

があります。

　攻撃を受けている側は、どこのIPアドレスから来るかもわからない大量の通信を浴びせられつづけるため、IPアドレスを使って適切に防御することもできず、また、あまりに多い無効のパケットで回線設備（ファイヤーウォール、ルータ等）を過負荷にさせられてしまうので本来のサービスは全く提供できなくなってしまいます。

![adv-ddos-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545419/374c6844-970f-63ad-f62c-45dbc68a2580.png)

 
#3.Alibaba Cloudの持つDDoS攻撃防御サービス
　Alibaba Cloudで使えるDDoS攻撃防御のサービスは複数あります。こちらを表に載せます。

| サービス名       | 概要 | 
|:----------------|:------------------|
|Anti DDoS Basic | Alibaba Cloud上にあるシステムをDDoS防御するサービス。|
|Anti DDoS Premium | Alibaba Cloud外に設置しているシステムをDDoS防御することができるサービス |
|Anti DDoS Pro |中国国内にサーバを用意しているものを対象として利用できるDDoS防御サービス|
|Game Shield | ゲームアプリケーションに特化した様々な攻撃を防御できる。DDoS防御も含まれる。　（但しアプリケーションと連動必須）|

今回は Anti DDoS Premiumについて紹介します。

#4. Anti DDoS Premiumはどういう形で利用するか？

Anti DDoS Premiumは、Alibaba Cloud外で稼働しているシステムのDDoS攻撃防御を行うことができるというサービスです。他のクラウドサービスのように、サービスを提供しているクラウドのシステムしかDDoS攻撃から守れないという度量の狭いサービスではありません。外部のシステムまで十分に守れるということからDDoS防御については自信の程が伺えますね。

　守られるシステム側から見たAnti DDoS Premiumの入り方を図にしてみます。
![adv-ddos-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545419/ac4ed357-43bb-6433-dbf8-7f1328f3e281.png)


　図の通り、システムの前段にProxyサーバとして入る形で防御対象のシステムを防御します。

　また、クライアントのIPアドレスは以下の表のようにして保存されます。HTTP/HTTPSについては、WebSocketももちろん対応しています。なお、残念ですが、UDPは現状クライアントのIPアドレスをそのままでは知る方法はありません。UDPにおいてクライアントのIPアドレスを知るには、クライアントアプリケーションがUDPの電文にクライアントのIPアドレスを含めるような動作をさせるしかありません。

| プロトコル |種別(※1)| クライアントのIPアドレスはどこに保存されるか？|
|:---------|:------|:---------------------------------------|
|HTTP/WebSocket（※2) | Website |X-Forwarded-Forヘッダ |
|HTTPS(TLS1.2等）/HTTP/2/WebSockets（※2) | Website | X-Forwaded-Forヘッダ |
|任意のTCP| Non-Website |TCP Optionフィールドに格納。TOA機能を有効にした特定のLinux Kernelなら復元できる。|
|任意のUDP(※2)| Non-Website |現状記録されない。（知りたい場合はクライアントのアプリケーションでUDP電文にIPアドレス情報の埋め込みが必要）|

※1. Anti DDoS Premiumの設定画面で、「Website」か、「Non-Website」の設定画面が分けられています。
※2. HTTP/HTTPSプロトコルであっても指定できるポート番号が限られています。詳しくは
　　　Protection of non-standard ports
　　　https://www.alibabacloud.com/help/doc-detail/127448.htm

HTTP/HTTPSに限り、Anti DDoS Premium側で、クライアントのIPアドレスをX-Forwarded-Forヘッダに記録してくれます。任意のTCP通信は、後述するAnti DDoS Premiumのもつ特殊機能であるTOAを用いることで、クライアントのIPアドレスをサーバ側で知ることができます。UDPは残念ですが、クライアントのIPアドレスを知る方法はありません。

#5. Anti DDoS Premiumを使う

　では早速使ってみましょう。
　Step1. まずAnti DDoS Premiumのメニューを選び、購入操作をします。購入はボタンを押すだけですから簡単ですね！
![adv-ddos-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545419/752a8027-85d8-477f-4f91-8ea23ad8b9b2.png)

　Step2. 次に守りたいHTTP/HTTPSの通信を設定します。DDoSから守るべきHTTP/HTTPS通信がある場合はこちらに設定していきます。設定の仕方は図のような操作をして設定します。
![adv-ddos-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545419/91dda759-0a86-1454-9169-1f5062a2f050.png)
　
　Step3. 次に守りたいHTTP/HTTPSではない通信を設定していきます。設定の仕方は図のような操作をして設定します。
![adv-ddos-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545419/13a6d2e2-ae2c-dbe4-2476-32835762d90b.png)

以上で、あっという間にシステムがDDoS防御されるようになります。

#5.1. 通信設定が沢山あるとき

実際に通信設定をするとわかるのですが、守りたい通信１つ１つを設定するのは骨が折れます。ここで設定のXMLファイルを入手して好きなエディタで加工して一気に指定する方法があります。図に紹介します。とても簡単ですね！
![adv-ddos-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545419/55f15008-887e-261d-7f61-5e3f89395aa0.png)

#6. 特殊機能TOAについて

 Alibaba CloudのAnti DDoS Premiumのマニュアルを読んでも、実は使えるのに記載が無い機能としてTOAがあります。ここではTOAについて記載します。

　TOAとは、TCP Option Addressという機能の略となります。TCPパケットのOptionフィールドに特殊なIDとクライアントのIPアドレスが入っており、特殊なLinuxカーネルのtoaモジュールで復元して、システムコールの結果として返却するというものとなります。実はAnti DDoS PremiumのNon-Websiteで指定したTCP通信はデフォルトで本機能が利用できるようになっています。

本機能のメリット・デメリットをあげると以下のとおりです。

- メリット：

  1. 通常のSocketプログラムなら、クライアントのIPアドレスが通常の手続きで入手できる。間にAnti DDoS Premiumが入っていることを気にする必要が無い。
 
  2. iptablesはtoaの処理よりも先に処理されるため、TCPヘッダの送信元IPアドレスで処理される。なので、TOAとして指定されているクライアントIPアドレスの影響を受けない。

 - デメリット：
 
  1. 現状Linuxカーネルが特殊なものが必要なので、特殊なカーネルで起動できない環境（一部のクラウドサービス）ではそもそも利用ができない。
　
  2. TOAを悪用したパケットをサーバに直接流し込まれると、サーバ側のプログラムはクライアントのIPアドレスが偽装されたものを手にしてしまう。

#6.1.TOAを使うのに必要な環境

TOAを使うには、現状のシステムが以下の環境で稼働していなければなりません。

 - RHEL/Centos 6系列の64Bit x86カーネルが動くサーバであること。
 - OS非標準のカーネルをインストールして起動できる環境であること。

　（DDoS防御したいシステムがオンプレミスな環境だと問題ありませんね！）

#6.2. TOAの使い方　

　基本的にはAnti DDoS Pro側に記載されているマニュアルに従います。カーネルもこのマニュアルに掲載されている先からRPMをダウンロードできます。

How can origins outside Alibaba Cloud get clients’ real IP addresses?
https://www.alibabacloud.com/help/doc-detail/52477.htm

　Step1.以下のカーネルパッケージを入手

```
$ wget http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/52477/cn_zh/1491917761209/kernel-2.6.32-220.23.2.ali_github.el6.x86_64.rpm
```

　Step2. rpm コマンドで導入。

```
$ sudo rpm -ivh kernel-2.6.32-220.23.2.ali_github.el6.x86_64.rpm
```

　Step3. そのままリブート

```
$ sudo reboot
```

　Step4. unameを確認

```
$ uname –r
  2.6.32-220.23.2.ali_github.el6.x86_64
```
と出ることを確認

　Step5. TOAを有効化

```
$ sudo modprobe toa 
```

補足：なお、TOAを無効化したければ

```
$ sudo modprobe -r toa
```

で無効化できます。

#6.3. TOAの結果

以下の図にTOAが無効のときと、有効の時の、ncコマンドの結果の違いを示します。あら不思議、TOAが有効の時はクライアントのIPアドレスをncコマンドが入手していることがわかります。

![adv-ddos-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545419/5441710d-b38c-bd61-0aa6-2a08da5e3f0a.png)

#6.4. TOAはどういう通信なのか？

実際のTOAの通信を図に示します。通信そのものは普通のTCP通信ですが、TCP のOptionフィールドにTOAの情報が隠れています。

![adv-ddos-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545419/adfb34f5-4467-f587-7eda-860e6495f30c.png)

では、実際にtcpdumpコマンドを使って見てみましょう。

![adv-ddos-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545419/7412dcac-bb09-579f-6af6-98d223d4160b.png)

上図にて赤で囲った部分と、青で囲った部分がTOAの値となります。以下に説明をします。

![adv-ddos-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545419/9a110d47-2670-d9c1-c77c-4ac0f9fdf24d.png)

![adv-ddos-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545419/94bb3c74-97b1-35a6-b2a6-9eedfcd80115.png)

#6.5. カーネルとtoaモジュールの構造

カーネルとtoaモジュールの構造を図示すると次のとおりです。パケットの情報がシステムコールに渡る前にTOAに含まれる情報をもとに書き換えていることがわかります。

![adv-ddos-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545419/ebb1a757-7ff1-409a-288c-66d4952fe098.png)

#6.6. /proc/net/toa_statusの説明

TOAが有効になっているカーネルは/proc/net/toa_statusに統計情報が表示されるようになります。図に内容と意味を載せます。

![adv-ddos-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545419/aec36682-81db-2bf3-d30c-5f9029becbde.png)

これでTOAでトラブルに見舞われても怖くない！:laughing:

#7. まとめ

これだけ覚えておけばDDoSも怖くありません！

- Alibaba CloudのAnti-DDoS Premiumは使い方は簡単だし、Alibaba Cloud以外のインフラも頑強にDDoSから守ってくれる。設定もすぐにできるので簡単！
- Alibaba CloudのAnti-DDoS PremiumのNon-Websiteは、TOA機能により、クライアント側のIPアドレスをsocket apiそのままつかって入手できるので便利！

以上。