GCE 上實作 Bastion Gateway 的 HA 架構

2017年8月18日 | 作者 GCPUG TW | 譯者 | 審稿者 GCPUG.TW | 1500字 | 閱讀大約需要3分鐘
歸檔於 architecture | 标签 #GCE #HA

概念

NAT(或稱Bastion主機)的架構在自建機房中常常可以見到,我們也可以將該架構在雲端環境上建置來使用… 而Google雲端的環境中,可以透過network與routing的方式搭配來建置一個具有HA(High Availability)的NAT環境,讓NAT不是單點提供服務… 下面是架構的簡單描述:

建置過程

設定網路與防火牆基本規則

首先,建議使用自建Network,好處是可以自訂內部的路由與相關防火牆規則,且可以避免影響其他主機。

gcloud compute networks create kankan-ha-nat \
    --mode legacy \
    --range [10.10.10.0/24](http://10.10.10.0/24)

為了可以測試狀態,我們允許port 22的ssh連線,因此建立允許 tcp 22 port 連線的防火牆規則…

gcloud compute firewall-rules create kankan-ha-nat-allow-ssh \
--allow tcp:22 --network kankan-ha-nat

在NAT server的建置上,我們需要讓內外部連線可以透通,因此將tcp:1-65535, udp:1-65535, icmp等協定打開,讓內部的網段(10.10.10.0/24))可以透過NAT server來連線外部網路。

gcloud compute firewall-rules create kankan-ha-nat-allow-internal \ 
--allow tcp:1-65535,udp:1-65535,icmp \
--source-ranges [10.10.10.0/24](http://10.10.10.0/24) --network kankan-ha-nat

建立NAT server

然後我們將NAT server建立起來:

gcloud compute instances create nat-gateway-asia-east1-a --network kankan-ha-nat --can-ip-forward \
--zone asia-east1-a \
--image-family debian-8 \
--image-project debian-cloud \ 
--tags nat

為了實現NAT的HA可能性,我們需要另外建立一台NAT server,可以讓NAT server異常時候,有另外一台NAT server可以提供路由服務… 下面是用同樣的設定在創建一台NAT server,但是我們選擇不同的zone,讓multi zone提供更高可用性…

gcloud compute instances create nat-gateway-asia-east1-c --network kankan-ha-nat --can-ip-forward \
--zone asia-east1-c \
--image-family debian-8 \
--image-project debian-cloud  
--tags nat

附註:上面NAT主機建立的過程中,必需要開啟network中的”can-ip-forward”參數,開啟後該主機才能夠提供路由之功能…

建立測試主機與連線環境

接下來建立內部服務主機,也就是我們想藏在NAT Gateway後面的重要機器,該主機會具備一個”no-ip”標籤,該標籤主要會結後後面建立的路由規則,讓路由經過指定的NAT主機…

gcloud compute instances create  no-ip-instance --network kankan-ha-nat --no-address \
--zone asia-east1-a \
--image-family debian-8 \
--image-project debian-cloud \
--tags no-ip

為了方便測試,我們另外建立測試時使用的 jumper 主機,當作跳到內部主機的跳板…,該主機必須與內部主機在同一個network下面…

gcloud compute instances create kankan-jumper --network kankan-ha-nat \ 
--zone asia-east1-b \
--image-family debian-8 \
--image-project debian-cloud

設定NAT主機之路由

接下來需要準備NAT主機的路由,指定所有”no-ip”的主機可以走該路由進出internet…

gcloud compute routes create  no-ip-internet-route-a --network kankan-ha-nat \
--destination-range [0.0.0.0/0](http://0.0.0.0/0) \
--next-hop-instance nat-gateway-asia-east1-a \
--next-hop-instance-zone asia-east1-a \
--tags no-ip --priority 800

我們也需要針對第二台NAT主機建立同樣的路由…

gcloud compute routes create  no-ip-internet-route-c --network kankan-ha-nat \
--destination-range [0.0.0.0/0](http://0.0.0.0/0) \
--next-hop-instance nat-gateway-asia-east1-c \
--next-hop-instance-zone asia-east1-c \
--tags no-ip --priority 800

當兩個路由同時存在時,只要該路由可運作,則內部主機之網路會由可運作的路由提供網路,如果整在使用的 NAT server 異常或關機,則GCE會自動使用另一台 NAT server 主機提供服務。

設定NAT主機

NAT主機需要進行一些路由forward的設定,我們需要連線進入所建立的NAT主機上進行設定:

gcloud compute ssh nat-gateway-asia-east1-a --zone asia-east1-a  
gcloud compute ssh nat-gateway-asia-east1-c --zone asia-east1-c

設定的內容如下:

sudo vi /etc/rc.local  
sysctl -w net.ipv4.ip_forward=1  
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

其中net.ipv4.ip_forward=1是啟動主機內 ip forward 的功能,iptables的那段則是啟用封包forward到eth0網卡的功能… 這些設定寫到 “/etc/rc.local” 則可以讓主機再重新開機後可以自動起來…

測試

最後我們可以透過 jumper server 做跳板,再 ssh 連線進到 no-ip-instance 主機中,然後 ping 外部的 ip …

gcloud compute ssh kankan-jumper --zone asia-east1-b  
ssh no-ip-instance  
ping 8.8.8.8

只要上面 ping 8.8.8.8 有實際成功,則我們可以測試輪流關閉(只保留一台NAT主機)時,內部這台主機的ping運作狀況…

參考


作者:KanKan