備忘録

備忘録

C#でHttpClientにSOCKS Proxyを利用する方法

Ⅰ. はじめに

タイトルの通り「C#でHttpClientにSOCKS プロキシを利用する方法」です。

各ライブラリの違いは次のとおりです。

# ライブラリ名 メモ
1 なし .NET 6以上
2 HttpToSocks5Proxy SOCKS5のみ
3 DotNet4.SocksProxy SOCKS4/5 に対応
4 SocksSharp SOCKS4/4a/5 に対応。バグが多い

Ⅱ. やり方(.NET6以上の場合)

1. サンプルプログラム
// .NET 6以上必須
// .NET6以上でSocks4, 4a, 5がサポートされた
// https://github.com/dotnet/runtime/pull/48883

static async Task Main()
{
  var handler = new HttpClientHandler
  {
    // 認証なし
    Proxy = new WebProxy(new Uri("socks5://127.0.0.1:9050"))

    // 認証あり
    // Proxy = new WebProxy(new Uri("socks5://127.0.0.1:9050"), true, null, new NetworkCredential("user", "pass"))
  };
  var httpClient = new HttpClient(handler);
  var str = await httpClient.GetStringAsync("https://api.ipify.org/").ConfigureAwait(false);
  Console.WriteLine(str);
}
2. 実行結果

省略

Ⅲ. やり方(HttpToSocks5Proxyを利用する方法)

HttpToSocks5Proxy を利用します。
HttpToSocks5Proxy はSOCKS5のみに対応しています。(2018/09/17時点)

1. NuGetから HttpToSocks5Proxy をインストールする
Install-Package HttpToSocks5Proxy
2. サンプルプログラム
var proxy = new HttpToSocks5Proxy("46.x.x.x", 1080);
var handler = new HttpClientHandler();
handler.Proxy = proxy;
handler.UseProxy = true;
var client = new HttpClient(handler);
var str  = await client.GetStringAsync("https://api.ipify.org");
Console.WriteLine(str);
3. 実行結果

f:id:kagasu:20180917063524p:plain

Ⅳ. やり方(DotNet4.SocksProxyを利用する方法)

DotNet4.SocksProxy を利用します。
DotNet4.SocksProxy は SOCKS4/5 に対応しています。(2018/02/21時点)

1. NuGetから DotNet4.SocksProxy をインストールする
Install-Package DotNet4.SocksProxy
2. サンプルプログラム
using com.LandonKey.SocksWebProxy;
using com.LandonKey.SocksWebProxy.Proxy;
using System;
using System.Net;
using System.Net.Http;
using System.Net.Sockets;

namespace Test
{
  class Program
  {
    private static int GetNextFreePort()
    {
      var listener = new TcpListener(IPAddress.Loopback, 0);
      listener.Start();
      var port = ((IPEndPoint)listener.LocalEndpoint).Port;
      listener.Stop();

      return port;
    }

    static void Main(string[] args)
    {
      var proxy = new SocksWebProxy(new ProxyConfig(
        IPAddress.Parse("127.0.0.1"),
        GetNextFreePort(),
        IPAddress.Parse("127.0.0.1"),
        9050,
        ProxyConfig.SocksVersion.Five));

      var handler = new HttpClientHandler();
      handler.Proxy = proxy;
      var client = new HttpClient(handler);

      Console.WriteLine(client.GetStringAsync("https://api.ipify.org").Result);
    }
  }
}
3. 実行結果

f:id:kagasu:20180221085227p:plain

Ⅴ. やり方(SocksSharpを利用する方法)

SocksSharp を利用します。
SocksSharp は SOCKS4/4a/5 に対応しています。(2018/02/21時点)
POSTが正常に出来ない、Streamに対応していない等バグが多いです。(2018/02/21時点)

1. NuGetから SocksSharp をインストールする
Install-Package SocksSharp
2. サンプルプログラム
using SocksSharp;
using SocksSharp.Proxy;
using System;
using System.Net.Http;

namespace HttpClientTest
{
  class Program
  {
    static void Main(string[] args)
    {
      var settings = new ProxySettings()
      {
        Host = "127.0.0.1",
        Port = 1080
      };

      var handler = new ProxyClientHandler<Socks5>(settings);
      var client = new HttpClient(handler);
      Console.WriteLine(client.GetStringAsync("https://api.ipify.org").Result);
    }
  }
}
3. 実行結果

f:id:kagasu:20170826174528p:plain