OpenVPNとVPC(RouteTable)の設定だけで特定ドメインのみAlibaba CloudにルーティングさせるNW構成を作る

# この記事の目的
特定のドメインやG-IP向けの通信経路だけAlibaba Cloud網を通したいときの手段として検証してみました。
VPC間にCENを通して2つのVPCをつなげたうえで試してみました。
VPN接続後、NATサーバ(ECS)を通ってアクセスするようになります。


# リソース構成図とNWフロー
下図のとおりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/1a4da2ba-a560-e5af-861e-ec8744006846.png)


# 手順

## OpenVPN：ECSの作成
GUIコンソールから作成しました。

- サーバー情報

|機能|Hostname|Zone|InstanceType|Spec|P-IP|
|---|---|---|---|---|---|
|NATサーバ|nat01|日本東京(ゾーンB)|ecs.t5-lc1m1.small|1vCPU 1GiB|10.68.30.153|
|VPNサーバ|openvpn01|日本東京(ゾーンA)|ecs.t5-lc1m1.small|1vCPU 1GiB|10.68.10.238|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/756c5730-056d-9245-5fa5-a3cb1517dd9f.png)

- セキュリティグループ（OpenVPN）
便宜上一旦anyしてます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/718527d6-3b2a-896e-be7a-db654ebdabe6.png)

- セキュリティグループ（NATサーバ）
便宜上一旦anyにしてます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/bfb78d68-a012-a429-a037-4ceb4fd402bd.png)

- VPCのルートテーブル情報（OpenVPN）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/5e232299-f1d6-2ec5-cd53-f353ce8af229.png)

- VPCのルートテーブル情報（NATサーバ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/9c799925-61e1-b527-7e48-02db9ab64174.png)



## OpenVPN：Configure
CAは腹持ちで建てました。
ECS上のOpenVPNの構築は別の記事に起こしているので、↓のリンクをご参照ください。
https://qiita.com/tnoce/items/b5765b38aeacc8f92269

- ポイント
    - push "route 13.112.0.0 255.252.0.0" ※qiitaのipアドレスをVPN接続したクライアントにpushする


```:/etc/openvpn/default.conf※コメントアウトとオプションoff項目を除く
[root@openvpn]# grep '^[^#]' 'server_r.conf
port 1194
proto udp
dev tun
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server_r.crt
key /etc/openvpn/easy-rsa/pki/private/server_r.key  # This file should be kept secret
dh /etc/openvpn/easy-rsa/pki/dh.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 13.112.0.0 255.252.0.0"
```

## ECS(NATサーバ):Configure

### eth0 の firewalld zone を external に変更
```
# firewall-cmd --zone=external --change-interface=eth0 --permanent
success
```

### externalゾーン に IPマスカレード設定
```
# firewall-cmd --zone=external --add-masquerade --permanent
success
```

### 変更の反映
```
# firewall-cmd --reload
success
```

### Firewalldを常に起動
```
# systemctl enable firewalld
```

### Firewalldを起動
```
# systemctl start firewalld
```

### Firewalldのステータスを確認（RunningになっていればOK）
```
# systemctl status firewalld
irewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since 木 2019-11-28 08:00:13 CST; 10h ago
     Docs: man:firewalld(1)
 Main PID: 542 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─542 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid

11月 28 08:00:13 nginx02 systemd[1]: Starting firewalld - dynamic firewall daemon...
11月 28 08:00:13 nginx02 systemd[1]: Started firewalld - dynamic firewall daemon.
11月 28 18:02:38 nginx02 firewalld[542]: WARNING: ALREADY_ENABLED: masquerade
```


# 検証

## VPN接続
vpnuxやtunnelblickなどのGUIアプリでVPN接続します。

## 接続後にNW設定を確認
OpenVPNに設定しいてたクライアントサブネットが割り当てられていることを確認します。

```
User:~$ ifconfig | grep 10.8
        inet 10.8.0.6 --> 10.8.0.5 netmask 0xffffffff 
```

Qiita向けの経路が適切にpublishされているか確認します。

```
User:~$ netstat -rn | grep 13.112/14
13.112/14          10.8.0.5           UGSc         utun8 
```

## 特定ドメイン向けの経路を確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274358/21d98728-bd74-9b43-f0ec-ac2bdbfbb87a.png)

これでVPN接続時はAlibaba CloudのVPC網を通ってNATサーバからQiitaにアクセスするようになりました！
注意点としてIPアドレスが複数ある場合は、丸めて記載するか単体でそれぞれ記載するなど工夫が必要です。
OpenVPNがドメインで経路をpushできれば良さそうなんですけど、今のところはできなさそう...🤔

しかし、特定IP範囲であれば、クライアントのProxy設定不要でVPN接続さえすればローカルスプリットします。
そして、特定経路だけVPCにルーティングしてくれるので、ユーザーにルーティングを意識させたくないとき有効的に使える構成だと思います。