目的
今回は下記の図のように VPC1 内の EC2 インスタンスから VPC3 の EC2 インスタンスに VPC2 内の EC2 インスタンスによるポートフォーワーディングを利用したリクエストを行うためのシステム構築を目的とします。
ふとしたきっかけでちょっとやってみようかなぁと思っただけなんで、特に用途とかは考えてないです。
条件: VPC1 と VPC2 及び VPC2 と VPC3 はそれぞれ VPC Peering で接続しているが、VPC1 と VPC3 は接続していない
手順
- まずは上の図にある VPC 及び Subnet を作成し、各サブネット内に EC2 インスタンスを起動します
- 全ての EC2 インスタンスのセキュリティグループに以下のルールを追加します
( めんどくさいんで、全ポート開放です…。)
- VPC3 内の EC2 インスタンスに検証の為の Web サーバを構築します ( 今回はポートフォーワードした先で 80 番ポートでアクセスすることでテストします )
$ sudo yum install httpd -y
$ cat /var/www/html/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<h1>VPC 3</h1>
</body>
</html>
- VPC Peering により VPC1 と VPC2 及び VPC2 と VPC3 を接続します
- VPC2 内の EC2 インスタンス内でポートフォーワードの設定を行う
$ sudo sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
$ sudo echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
$ sudo iptables -t nat -A PREROUTING -m tcp -p tcp --dst 172.31.0.66 --dport 1234 -j DNAT --to-destination 192.168.10.10:80
$ sudo iptables -t nat -A POSTROUTING -m tcp -p tcp --dst 192.168.10.10 --dport 80 -j SNAT --to-source 172.31.0.66
$ sudo iptables -nL FORWARD
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ただし 172.31.0.66 は VPC2 内 EC2 インスタンスの IP、192.168.10.10 は VPC3 内 EC2 インスタンスの IP です。1234 は接続元ポート、80 は接続先ポートですね。
- VPC1 内 EC2 インスタンスから以下のコマンドで VPC3 内のコンテンツを取得できるか確認
$ curl http://172.31.0.66:1234/
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<h1>VPC 3</h1>
</body>
</html>
まとめ
これでポートフォーワードによる VPC 間の通信が実現できました。
( VPC1 と VPC3 を VPC Peering すればいいだけだけど… )