実現したいこと・構成
構成が複雑なため、長文になることお許しください。
Azureで以下のように構成し、外部APIへの送信元ポート番号を毎回変化させることを試行中です。
Azure Function (C#, .net core 3.1) →接続①→ プロキシサーバー(squid v3.5.27 on Azure VM ubuntu 18.04) →接続②→ 外部API
Azure環境でのソケットが枯渇することを避けるため、
接続①はConnection:Keep-Alive
接続②はConnection:close
となるようにしたいです。
送信元のFunctionでは以下のようにproxy設定を行い、リクエスト送信しております(抜粋)。
csharp
1// startup.cs 抜粋 2public override void Configure(IFunctionsHostBuilder builder) 3{ 4 ~略~ 5 6 builder.Services.AddHttpClient<IApiCallLogic, ApiCallLogic>(c => { }) 7 .ConfigurePrimaryHttpMessageHandler(() => 8 { 9 var handler = new HttpClientHandler { UseProxy = true }; 10 handler.Proxy = new WebProxy($"http://xxx.xxx.xxx.xxx:xxx"); // proxyのIP/ポートを指定 11 return handler; 12 }); 13}
// API呼び出し部分 class ApiCallLogic : IApiCallLogic { private HttpClient httpClient; public ApiCallLogic(HttpClient httpClient) { this.httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient)); } public async Task<HttpResponseMessage> CallApi(string url, ILogger log) { var reqMessage = new HttpRequestMessage(HttpMethod.Get, url); var response = await httpClient.SendAsync(reqMessage); return response; } }
squidは以下のように設定しております(抜粋)。
# Function IP 許可 acl function_net src xxx.xxx.xxx.xxx http_access allow function_net # その他 NG http_access deny all # キャッシュを使用しない cache deny all # ポート指定 http_port xxxx # X-Forwarded-For設定しない forwarded_for off # クライアント接続は維持、サーバーへの接続は維持しない。 server_persistent_connections off client_persistent_connections on
動作確認のため外部APIの代わりのAzure Functionを作成し、以下のような環境で検証をしています。
Azure Function (C#, .net core 3.1) → プロキシサーバー (squid v3.5.27 on Azure VM ubuntu 18.04) → Azure Function (c#)
後段の確認用Functionで以下のように送信元IP/ポート番号を返却し、確認をしています。
csharp
1 var remoteAddr = req.HttpContext.Connection.RemoteIpAddress; 2 var remotePort = req.HttpContext.Connection.RemotePort; 3 return new OkObjectResult($"{remoteAddr}:{remotePort}");
発生している問題
ローカル環境にてFunctionを起動し、以下のようにcurlにて複数回実行しても、同じレスポンスが返却されてしまいます。
> curl http://localhost:7071/api/ProxyConnectionTest xxx.xxx.xxx.xxx:43462 > curl http://localhost:7071/api/ProxyConnectionTest xxx.xxx.xxx.xxx:43462
返却されるIPアドレスはプロキシのものになっているため、プロキシは経由している認識です。
ただ、squidのアクセスログには以下のような1行しか記録されておりませんでした。
xxx.xxx.xxx.xxx - - [27/May/2020:08:55:52 +0000] "CONNECT checkfunction.azurewebsites.net:443 HTTP/1.1" 200 5175 "-" "-" TCP_TUNNEL:HIER_DIRECT
確認用Functionのログには複数回実行されたログが記録されておりました。
試したこと
curlを使用して、プロキシ経由で確認用Functionを呼び出した場合、送信元ポート番号が変更されることは確認しています。
> curl -x http://xxx.xxx.xxx.xxx:port https://checkfunction.azurewebsites.net xxx.xxx.xxx.xxx:45178 > curl -x http://xxx.xxx.xxx.xxx:port https://checkfunction.azurewebsites.net xxx.xxx.xxx.xxx:48552
この場合は、squidのアクセスログには複数行出力されておりました。
知りたいこと
確認用Functionを直接呼び出した場合はポートが変わっているため、呼び出し元のFunctionが影響している可能性が高いと思っております。
以下をご教示いただけないでしょうか。
- そもそも、本構成ではプロキシ以降(接続②)のみConnection:closeとすることは可能でしょうか?
- squidにアクセスログが1行しか記録されない原因として、どのようなことが考えられるでしょうか?
補足情報(FW/ツールのバージョンなど)
squid : v3.5.27
net core : 3.1.2
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。