2016年8月17日 星期三

AWS 筆記 - 建置自己的 VPC 且透過 VPN/IPSec 讓各個 Region 的 VPC 互通

Amazon VPC 的全名為 Amazon Virtual Private Cloud,就是所謂的內網架構,在此網路架構內的機器可以互通有無。https://aws.amazon.com/tw/vpc/

假設使用情境:
  1. 建立一個 VPC 網段為 10.100.0.0/16
  2. 建立兩個 Subnet 網段 A 跟 B 分別為 10.100.1.0/24, 10.100.2.0/24 且為不同 Availability Zone
  3. 其中 A 網段不給予 Public IP ,而 B 網段會有 Public IP
  4. 其中 A 網段需建立 NAT 運作方式,可以連外,也可以被 B 網段連到
建置方式:

VPC dashboard
-> Your VPCs -> Create VPC
-> 給定 CIDR block,如 10.100.0.0/16
-> Subnets -> Create Subnet
-> 挑選剛剛建立 VPC 以及 Availability Zone (兩個 Subnet 挑不同區),以及給定 CIDR block
-> A 網段 10.100.1.0/24
-> B 網段 10.100.2.0/24 並打開 Auto-Assign Public IP 屬性
-> Internet Gateways -> Create Internet Gateway
-> 勾選後,點擊 Attach to VPC -> 挑剛剛的 10.100.0.0/16
-> Nat Gateways -> Create NAT Gateway
-> 在此只需建立 A 網段的 NAT Gateway,但要建立在 B 網段,才能讓 A 網段的機器連出去 -> 給予 EIP/Create New EIP
-> Route Tables -> Create Route Table
-> 建立 A 網段 10.100.1.0/24 專屬表 -> 並設置 0.0.0.0/0 給予剛剛建立的 NAT   -> 建立 B 網段 10.100.2.0/24 專屬表 -> 並設置 0.0.0.0/0 給予剛剛建立的 Internet Gateway
-> 回到 Subnets 分別挑選 A/B 網段並更新他們的 route table

如此一來,就有一個 VPC = 10.100.0.0/16 ,內有兩個 subnet = A網段 10.100.1.0/24, B網段 10.100.2.0/24,其中 A 網段聯外方式就是透過 NAT 出去(對外會看到NAT IP),而 B 網段則是用 public ip 透過 Internet Gateway 出去。機器們可以用 curl ipino.io 去驗證 IP ,以及使用 ping 來檢驗是不是可以連到彼此。以上就是自建 VPC 且擁有 public ip 跟 private ip 網段的部分。

接著進行不同 Region VPC 溝通方式,不同 Region VPC 要溝通的方式,就只是單純在各個 Region 架設 VPN/IPSEC Server 互連,除了彼此更新 Route Table 外,還需在 VPN 機上打開防火牆、取消封包檢查等,如此一來即可處理封包移動流程。

假設有 10.100.0.0/16 跟 10.200.0.0/16 兩個網段,一處在 EU-West-1 另一處在 SA-EAST-1 ,一樣透過上述先建立完 VPC-EU-West-1 跟 VPC-SA-EAST-1,並且分別建立 Subnet EU-WEST-1 10.100.1.0/24 跟 SA-EAST-1 10.200.1.0/24 且兩者都有 Public IP(在此不做 private subnet),接著分別在這兩各區域,各開一台機器安裝 IPSEC,在此直接挑 Community AMIs -> amzn-ami-vpc-nat -> amzn-ami-vpc-nat-hvm-2016.03.3.x86_64-ebs CentOS ,並且使用 ec2-user 帳號登入。建議先在兩台 VPN server 彼此 ping 一下對方(在 Security Group 可以偷懶開放對方 IP 所有網路流量),接著就設定 IPSEC 的部分:

兩台機器都安裝 openswan 軟體:

$ sudo yum install openswan
$ sudo ls /etc/ipsec*
/etc/ipsec.conf  /etc/ipsec.secrets

/etc/ipsec.d:
policies


在 EU-WEST-1 機器,其 public ip = 52.209.16.24:

$ sudo vim /etc/ipsec.d/SA-EAST-1.conf
conn Connect-to-SA-EAST-1
type=tunnel
authby=secret

leftid=52.209.16.24
left=%defaultroute
leftsubnet=10.100.0.0/16
leftnexthop=%defaultroute

right=52.67.138.147
rightsubnet=10.200.0.0/16

pfs=yes
auto=start
$ sudo vim /etc/ipsec.d/SA-EAST-1.secrets
52.209.16.24 52.67.138.147: PSK "IPSEC_PASSWORD"
$ sudo grep -c "^include /etc/ipsec.d/" /etc/ipsec.conf > /dev/null || (echo "include /etc/ipsec.d/*.conf" | sudo tee --append /etc/ipsec.conf)
$ sudo grep -c "^include /etc/ipsec.d/" /etc/ipsec.secrets > /dev/null || (echo "include /etc/ipsec.d/*.secrets" | sudo tee --append /etc/ipsec.secrets)
$ sudo ipsec setup restart
$ sudo ipsec auto --up Connect-to-SA-EAST-1
117 "Connect-to-SA-EAST-1" #3: STATE_QUICK_I1: initiate
004 "Connect-to-SA-EAST-1" #3: STATE_QUICK_I2: sent QI2, IPsec SA established tunnel mode {ESP=>0xe7553eef <0xa8498182 xfrm=AES_128-HMAC_SHA1 NATOA=none NATD=52.67.138.147:4500 DPD=none}


在 SA-EAST-1 機器上,其 public ip = 52.67.138.147:

$ sudo vim /etc/ipsec.d/EU-WEST-1.conf
conn Connect-to-EU-WEST-1
type=tunnel
authby=secret

leftid =52.67.138.147
left=%defaultroute
leftsubnet=10.200.0.0/16
leftnexthop=%defaultroute

right=52.209.16.24
rightsubnet=10.100.0.0/16

pfs=yes
auto=start
$ sudo vim /etc/ipsec.d/EU-WEST-1.secrets
52.67.138.147 52.209.16.24 : PSK "IPSEC_PASSWORD"
$ sudo grep -c "^include /etc/ipsec.d/" /etc/ipsec.conf > /dev/null || (echo "include /etc/ipsec.d/*.conf" | sudo tee --append /etc/ipsec.conf)
$ sudo grep -c "^include /etc/ipsec.d/" /etc/ipsec.secrets > /dev/null || (echo "include /etc/ipsec.d/*.secrets" | sudo tee --append /etc/ipsec.secrets)
$ sudo ipsec setup restart
$ sudo ipsec auto --up Connect-to-EU-WEST-1
117 "Connect-to-EU-WEST-1" #5: STATE_QUICK_I1: initiate
004 "Connect-to-EU-WEST-1" #5: STATE_QUICK_I2: sent QI2, IPsec SA established tunnel mode {ESP=>0x681a5ce6 <0xcb613471 xfrm=AES_128-HMAC_SHA1 NATOA=none NATD=52.209.16.24:4500 DPD=none}


接著,就可以在兩台機器上,分別 ping 對方的 private ip 來測試,如此一來就算打通一條連線,最後要做的就是設定 VPC 的 route table:

在 EU-WEST-1 VPC (10.100.0.0/16) 的所有 Subnet (例如10.100.1/16),多添加一條 routing rule = 10.200.0.0/16 而 Target 用 EU-WEST-1 上的 VPN Server (可以在 Target 上打 i 關鍵字,就可以看到 EC2 server);在 SA-EAST-1 VPC (10.200.0.0/16) 裡所有的 Subnet (例如 10.200.1.0/16) ,多添加一條 routing rule = 10.100.0.0/16 而 Target 用 SA-EAST-1 上的 VPN Server 。

最後,回到 EC2 Dashboard ,將各區域的 VPN Server 的設定更新一下:Actions -> Networking -> Change Source/Dest. Check -> Disable,如此一來,雙方 VPC 下的機器,就可以互相 ping 和連線了。

在此使用 IPSEC 的做法,是因為後續可以來做跨 ISP 的結合,如 Azure service 等。

沒有留言:

張貼留言