雲計算

當函數計算遇上白名單

實際上這個世界上沒有好人和壞人,只有做了好事的人,和做了壞事的人。
——柴靜《看見》

阿里雲函數計算(Function Compute)是一個事件驅動的全託管 Serverless 計算服務。使用函數計算只需編寫代碼並上傳,而無需管理服務器等基礎設施,函數計算會準備好計算資源,並以彈性、可靠的方式運行代碼。

不久前在一個項目上使用了函數計算,需要在函數計算中調用第三方服務,第三方服務有可能會對函數計算的地址進行白名單驗證,但函數是通過彈性擴容的方式動態為函數分配計算資源的,因此無法提前預知訪問第三方接口服務的IP地址,而且目前函數計算也沒有像阿里雲WEB應用防火牆一樣提供回源地址清單,第三方接口需要的白名單IP要使用一些特殊手段來取得。

在阿里雲函數計算的文檔中的“場景案例”中有一個章節就是針對這種情況的,使用的是Nginx正向代理來代理函數計算的訪問請求,這種通過Nginx的代理後,第三方服務看到的將是Nginx服務器的公網IP地址,這樣就可以解決白名單的問題。

其中Nginx的配置如下:

server{

resolver x.x.x.x;
listen 8080;
location / {
    proxy_pass http://$http_host$request_uri;
}

}

其中resolver x.x.x.x;是DNS服務器的地址。
這樣雖然能解決白名單的問題,但這個代理你能使用,別人也能用,這肯定不是你要看到的情況。解決的方案是對請求的目標主機名進行驗證,只對目標第三方服務的請求進行代理,其餘的請求一律拒絕。

Nginx服務器的配置如下:

server {
resolver x.x.x.x;
listen 8080;
location /{

if ( $http_host = ‘y.y.y.y’ ) {
  proxy_pass http://$http_host$request_uri;
  break;
}
return 403;

}
}

用一個或者多個條件判斷對請求的http主機名進行驗證,假如請求的是第三方服務則代理髮送,否則請求將被拒絕。

解決了Nginx的盜用的問題,還有一個問題要解決,就是Nginx服務的可用性問題,這個問題可以通過負載均衡SLB和來解決,架構如下:

1.jpg

第三方服務的防火牆需要加兩條地址,分別是兩臺Nginx服務器的公網IP。
2.jpg

上圖中xx.xx.125.101和xx.xx.119.208是兩臺ECS的外網地址,可以將這兩個地址提供給第三方加白名單,xx.xx.227.184是函數計算的地址,這個地址無法保證固定,不能用做白名單。

這裡需要至少加兩個IP,那麼假如只能加一條地址怎麼辦?
這就需要對架構進行一些調整了,架構如下:

3.jpg

需要給函數計算增加VPC內網訪問接口,訪問在內網的SLB負載均衡和Nginx代理,Nginx代理服務器不配置公網IP而是通過NAT網關訪問第三方接口。

為函數計算增加VPC訪問接口需要進行訪問授權,配置的方式是在函數計算的控制檯打開服務配置。
4.jpg

點擊修改,後可以看到網絡配置,選擇函數計算要對接的VPC和虛擬交換機。

5.jpg

在權限配置部分選擇新建角色,並指定系統模版授權,選擇
AliyunECSNetworkInterfaceManagementAccess ,並點擊授權。

使用函數計算訪問代理服務後,從阿里雲彈性網卡控制檯可以看到新增的ENI彈性網卡。

6.jpg

該彈性網卡地址雖然也是動態分配的,但地址範圍僅限於指定的虛擬交換機內。

Leave a Reply

Your email address will not be published. Required fields are marked *