VPCのSNATゲートウェイの作成手順

## はじめに

Alibaba CloudのECSを購入するときに、帯域幅を1Mbps以上に設定すると、ElasticIP (グローバルIP)が自動的に付与されます。このIPを経由でサーバーをアクセスし操作することができるのに便利です。その一方、役割により外部からのアクセスが許可しないけれども、外部へアクセスしたい場合があります。例えば、[Server Load Balancer](https://jp.aliyun.com/product/server-load-balancer) 配下のECSサーバーの場合、外部へアクセスしパッケージを更新したいですが、セキュリティ担保のため外部から直接にECSサーバーへアクセスを拒否したい。こういう場合には、ECSサーバーをゲートウェイとして設定すればよいでしょう。

この記事はタイトル通りにSNATゲートウェイの設定手順について書きます。

## 設定構成

![image](https://qiita-image-store.s3.amazonaws.com/0/74420/27789409-bbdb-8fb3-59d4-61cc6c262cfb.png)

設定しようとする構成は上記の図となります。ECS1インスタンスはエラスティックIPを持ち、そのIPを経由しインターネットをアクセスできます。ECS2インスタンスはグローバルIPを持たずに、インターネットへ出たいときには、ECS1経由しなければなりません。ECS2からのパッケージはSNATされてからインターネットをでます。ECS1とECS2は同じVPCネットワークに所属します。

## 設定手順

前提条件

* 動作OS: CentOS 7
* 同じVPCネットワークに所属するサーバー
* root権限を持つ

#### ECS2から外部へアクセスできないことを確認

```
# google ping してみる
$ ping google.com
PING google.com (172.217.25.110) 56(84) bytes of data.

# 疎通が不可能なことを確認
```

#### ECS1の設定

この例だと、ECS1のプライベートIPが `10.2.219.106/16`となります

```
# ECSのプライベートIP / インタフェースを確認
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:16:3e:00:0a:ef brd ff:ff:ff:ff:ff:ff
    inet 10.2.219.106/16 brd 10.2.255.255 scope global eth0
       valid_lft forever preferred_lft forever
$


# IP Forwardingの設定
$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
$ vim /etc/sysctl.d/10-ipv4forward.conf
net.ipv4.ip_forward = 1
# :wq
$ sysctl -p /etc/sysctl.d/10-ipv4forward.conf
$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
$

# Firewall 起動
$ systemctl start firewalld
$ systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: active (running) since Mon 2017-05-15 10:46:39 CST; 5h 56min ago
     Docs: man:firewalld(1)
 Main PID: 27068 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─27068 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
...
$

# Firewalld NAT設定
$ firewall-cmd --get-active-zones # アクティブゾーンなし
$ firewall-cmd --set-default-zone external
$ firewall-cmd --zone=external --add-interfce=eth0 --permanent
$ firewall-cmd --permanent --direct --passthrough ipv4 -t nat -I POSTROUTING -o eth0 -j MASQUERADE -s 10.2.0.0/16
$
```

ここでは、`10.2.0.0/16`はVPCネットワークのプライベートIPレンジです。

#### VPCの設定

**① 2インスタンスが所属しているVPC設定画面へ移動**

![image](https://qiita-image-store.s3.amazonaws.com/0/74420/319fecaf-9bdf-eb27-bf15-fc7378f2ec7d.png)

**② VRouter設定画面へ移動し、ルートエントリ追加**

![image](https://qiita-image-store.s3.amazonaws.com/0/74420/513dd668-5874-1a66-16cf-fc08432688c1.png)

**【ルートエントリの追加】**ボタンを押し、以下の画面の通りに入力します

* ① 外部のアドレス。`0.0.0.0/0` は外部のすべてという意味です
* ② ECS1のインスタンスID

![image](https://qiita-image-store.s3.amazonaws.com/0/74420/9c96a380-da8f-2c28-d1fb-5be1d8299f03.png)

【OK】を押します

![image](https://qiita-image-store.s3.amazonaws.com/0/74420/83a7e58f-233e-cc9e-6e48-f236759ab94d.png)

新しいルートエントリが追加されることを確認します。

![image](https://qiita-image-store.s3.amazonaws.com/0/74420/503fb311-3d84-b350-f5c6-f76d7fd0aa67.png)

#### ECS2の方で接続が可能となったことを確認

```
# googleへpingできるようになった
$ ping google.com
PING google.com (216.58.200.174) 56(84) bytes of data.
64 bytes from nrt12s11-in-f174.1e100.net (216.58.200.174): icmp_seq=1 ttl=54 time=1.81 ms
64 bytes from nrt12s11-in-f174.1e100.net (216.58.200.174): icmp_seq=2 ttl=54 time=2.27 ms
^C

# tracepathでECS1のプライベートIPが表示される
$ tracepath google.com
 1?: [LOCALHOST]                                         pmtu 1500
 1:  10.2.219.106                                          0.176ms
 1:  10.2.219.106                                          0.142ms
 2:  no reply
 3:  10.106.205.9                                          5.843ms asymm  2
 4:  no reply
```

上記の`10.2.219.106`はECS1のIPアドレスで、`10.106.205.9`は上流のルータのIPです。

## まとめ

VPCのSNATゲートウェイの設定方法について書きました。この方法では、ECS1という踏み台サーバーを構築するこで、エラスティックIPが不要でも外部へアクセス可能となり、セキュリティが強化されます。

## 参考文献
1. セキュリティの概要 > [ファイアワォールの使用](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html) 
2. [Alibabaクラウドの公式ドキュメント](https://jp.aliyun.com/help)