はじめに
Alibaba CloudのECSを購入するときに、帯域幅を1Mbps以上に設定すると、ElasticIP (グローバルIP)が自動的に付与されます。このIPを経由でサーバーをアクセスし操作することができるのに便利です。その一方、役割により外部からのアクセスが許可しないけれども、外部へアクセスしたい場合があります。例えば、Server Load Balancer 配下のECSサーバーの場合、外部へアクセスしパッケージを更新したいですが、セキュリティ担保のため外部から直接にECSサーバーへアクセスを拒否したい。こういう場合には、ECSサーバーをゲートウェイとして設定すればよいでしょう。
この記事はタイトル通りにSNATゲートウェイの設定手順について書きます。
設定構成
設定しようとする構成は上記の図となります。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設定画面へ移動
② VRouter設定画面へ移動し、ルートエントリ追加
**【ルートエントリの追加】**ボタンを押し、以下の画面の通りに入力します
- ① 外部のアドレス。
0.0.0.0/0
は外部のすべてという意味です - ② ECS1のインスタンスID
【OK】を押します
新しいルートエントリが追加されることを確認します。
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が不要でも外部へアクセス可能となり、セキュリティが強化されます。
参考文献
- セキュリティの概要 > ファイアワォールの使用
- Alibabaクラウドの公式ドキュメント