質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Squid

Squidは、TCP/IPネットワークでのユーザーとサーバの通信を中継するオープンソースのプロキシサーバソフト。リバースプロキシやキャッシュサーバとして使用することも可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

プロキシ

プロキシは、二つ以上の相互接続されているプログラム又はデバイスの間に存在する中間サーバを指します。プロキシは、接続者の「代理」としてインターネット接続を行い、接続元にレスポンスを返します。また、その機能を実現するソフトウェアの意味合いもあります。

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

1回答

2820閲覧

Azure Functionからプロキシ(squid)を経由したリクエスト送信時にソースポート番号が変化しない

yuhsd

総合スコア0

Squid

Squidは、TCP/IPネットワークでのユーザーとサーバの通信を中継するオープンソースのプロキシサーバソフト。リバースプロキシやキャッシュサーバとして使用することも可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

プロキシ

プロキシは、二つ以上の相互接続されているプログラム又はデバイスの間に存在する中間サーバを指します。プロキシは、接続者の「代理」としてインターネット接続を行い、接続元にレスポンスを返します。また、その機能を実現するソフトウェアの意味合いもあります。

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2020/05/27 10:50

実現したいこと・構成

構成が複雑なため、長文になることお許しください。

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が影響している可能性が高いと思っております。

以下をご教示いただけないでしょうか。

  1. そもそも、本構成ではプロキシ以降(接続②)のみConnection:closeとすることは可能でしょうか?
  2. squidにアクセスログが1行しか記録されない原因として、どのようなことが考えられるでしょうか?

補足情報(FW/ツールのバージョンなど)

squid : v3.5.27
net core : 3.1.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

本件、ひとまず解決しましたのでクローズします。

確認用Functionではなく、外部APIを呼び出した場合は記載のsquid設定で問題が発生しませんでした。

推測ですが、Azure Functionsではレスポンス時にConnection:keep-aliveが設定されるようですのでそれが影響したのではと思われます。

投稿2020/06/08 04:36

yuhsd

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問