はじめに
この記事はZenelo Advent Calendar 2018の22日目(完全に遅刻だけどね)の記事です。
やりたいこと
外部ネットワークからVPC内のリソースにアクセスする。
例えば、
- ElastiCache
- RDS
- Elasticsearch
とか。
どうやるの?
iptablesでNATでしょ!(nginxとかhaproxyとかでも全然いけると思う)
手順
セキュリティグループの準備
- セキュリティグループ作成
- 許可するネットワーク(例えば会社の拠点IPとか)からのみ特定ポート(RDSだったら
3306
、memcachedだったら11211
とか)にアクセスを許可する
- 許可するネットワーク(例えば会社の拠点IPとか)からのみ特定ポート(RDSだったら
- アクセスしたいリソースのセキュリティグループのインバウンドに上記で作成したセキュリティグループを追加する
EC2インスタンスの準備
- コンソールからEC2インスタンスを立ててElasticIPをつける
iptablesでルーティング
- 上記で作成したEC2インスタンスにsshログインする
- iptablesコマンドが入ってなければインストール
sudo yum install iptables bind-utils tcpdump # 必要コマンドとついでにtcpdumpも入れたければ入れとく
- カーネルパラメータの設定
sysctl -w net.ipv4.ip_forward=1 # フォワーディングの有効化
vi /etc/sysctl.conf # 該当箇所を修正して設定を永続化
-> net.ipv4.ip_forward=0となっているところをnet.ipv4.ip_forward=1に修正する、なければ追記する
- 対象リソースのIP確認
nslookup <対象リソースのエンドポイント名(コンソールで確認しとく)>
- iptablesでルーティング設定
- netfilterとかiptablesでのルーティングについて知りたければ下の補足へ
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 3306 -j DNAT --to <上記で確認した対象リソースのIP>:3306 # RDSの場合
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 11211 -j DNAT --to <上記で確認した対象リソースのIP>:11211 # memcachedの場合
vi /etc/sysconfig/iptables # 永続化のために上記の設定を追記
疎通確認
- 外部ネットワークからtelnetなりcurlなりmysqlコマンドなりでElastiIPへアクセス!応答が返ってくるはず
- NATサーバー上でtcpdumpするとNATしてる様子が見れますね