try fix tor socks5 connection

This commit is contained in:
Kukks
2020-03-14 12:21:12 +01:00
parent 56d5e6f99f
commit 1a62ee9260
8 changed files with 74 additions and 70 deletions

View File

@@ -51,6 +51,7 @@ services:
- customer_lnd - customer_lnd
- merchant_lnd - merchant_lnd
- sshd - sshd
- tor
sshd: sshd:
build: build:
@@ -318,6 +319,19 @@ services:
- "bitcoin_datadir:/deps/.bitcoin" - "bitcoin_datadir:/deps/.bitcoin"
links: links:
- bitcoind - bitcoind
tor:
restart: unless-stopped
image: btcpayserver/tor:0.4.1.5
container_name: tor
environment:
TOR_PASSWORD: btcpayserver
ports:
- "9050" # SOCKS
- "9051" # Tor Control
volumes:
- "tor_datadir:/home/tor/.tor"
- "torrcdir:/usr/local/etc/tor"
- "tor_servicesdir:/var/lib/tor/hidden_services"
volumes: volumes:
sshd_datadir: sshd_datadir:
@@ -328,3 +342,6 @@ volumes:
lightning_charge_datadir: lightning_charge_datadir:
customer_lnd_datadir: customer_lnd_datadir:
merchant_lnd_datadir: merchant_lnd_datadir:
tor_datadir:
torrcdir:
tor_servicesdir:

View File

@@ -35,6 +35,7 @@
<PackageReference Include="BundlerMinifier.Core" Version="3.2.435" /> <PackageReference Include="BundlerMinifier.Core" Version="3.2.435" />
<PackageReference Include="BundlerMinifier.TagHelpers" Version="3.2.435" /> <PackageReference Include="BundlerMinifier.TagHelpers" Version="3.2.435" />
<PackageReference Include="HtmlSanitizer" Version="4.0.217" /> <PackageReference Include="HtmlSanitizer" Version="4.0.217" />
<PackageReference Include="HttpToSocks5Proxy" Version="1.4.0" />
<PackageReference Include="LedgerWallet" Version="2.0.0.5" /> <PackageReference Include="LedgerWallet" Version="2.0.0.5" />
<PackageReference Include="Microsoft.Extensions.Logging.Filter" Version="1.1.2" /> <PackageReference Include="Microsoft.Extensions.Logging.Filter" Version="1.1.2" />
<PackageReference Include="Microsoft.NetCore.Analyzers" Version="2.9.8"> <PackageReference Include="Microsoft.NetCore.Analyzers" Version="2.9.8">
@@ -51,7 +52,6 @@
<PackageReference Include="Serilog" Version="2.9.0" /> <PackageReference Include="Serilog" Version="2.9.0" />
<PackageReference Include="Serilog.AspNetCore" Version="3.2.0" /> <PackageReference Include="Serilog.AspNetCore" Version="3.2.0" />
<PackageReference Include="Serilog.Sinks.File" Version="4.1.0" /> <PackageReference Include="Serilog.Sinks.File" Version="4.1.0" />
<PackageReference Include="SocksWebProxy" Version="1.0.5" />
<PackageReference Include="SSH.NET" Version="2016.1.0" /> <PackageReference Include="SSH.NET" Version="2016.1.0" />
<PackageReference Include="Text.Analyzers" Version="2.6.4"> <PackageReference Include="Text.Analyzers" Version="2.6.4">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>

View File

@@ -156,26 +156,24 @@ namespace BTCPayServer.Controllers
return result.PSBT; return result.PSBT;
} }
private async Task<PSBT> TryGetBPProposedTX(PSBT psbt, DerivationSchemeSettings derivationSchemeSettings, BTCPayNetwork btcPayNetwork) private async Task<PSBT> TryGetBPProposedTX(PSBT psbt, DerivationSchemeSettings derivationSchemeSettings, BTCPayNetwork btcPayNetwork)
{ {
if (TempData.TryGetValue( "bpu", out var bpu) && !string.IsNullOrEmpty(bpu?.ToString()) && Uri.TryCreate(bpu.ToString(), UriKind.Absolute, out var endpoint)) if (TempData.TryGetValue( "bpu", out var bpu) && !string.IsNullOrEmpty(bpu?.ToString()) && Uri.TryCreate(bpu.ToString(), UriKind.Absolute, out var endpoint))
{ {
TempData.Remove("bpu"); TempData.Remove("bpu");
HttpClient httpClient; var httpClient = _socks5HttpClientFactory.CreateClient("payjoin");
if (endpoint.IsOnion() ) if (endpoint.IsOnion() && httpClient == null)
{ {
httpClient = await _socketFactory.SocksClient; return null;
if (httpClient == null)
{
return null;
}
} }
else else
{ {
httpClient = _httpClientFactory.CreateClient("bpu"); httpClient = _httpClientFactory.CreateClient("payjoin");
} }
var cloned = psbt.Clone(); var cloned = psbt.Clone();
if (!cloned.IsAllFinalized() && !cloned.TryFinalize(out var errors)) if (!cloned.IsAllFinalized() && !cloned.TryFinalize(out var errors))

View File

@@ -50,7 +50,7 @@ namespace BTCPayServer.Controllers
private readonly WalletReceiveStateService _WalletReceiveStateService; private readonly WalletReceiveStateService _WalletReceiveStateService;
private readonly EventAggregator _EventAggregator; private readonly EventAggregator _EventAggregator;
private readonly SettingsRepository _settingsRepository; private readonly SettingsRepository _settingsRepository;
private readonly SocketFactory _socketFactory; private readonly Socks5HttpClientFactory _socks5HttpClientFactory;
private readonly IHttpClientFactory _httpClientFactory; private readonly IHttpClientFactory _httpClientFactory;
public RateFetcher RateFetcher { get; } public RateFetcher RateFetcher { get; }
@@ -70,7 +70,7 @@ namespace BTCPayServer.Controllers
WalletReceiveStateService walletReceiveStateService, WalletReceiveStateService walletReceiveStateService,
EventAggregator eventAggregator, EventAggregator eventAggregator,
SettingsRepository settingsRepository, SettingsRepository settingsRepository,
SocketFactory socketFactory, Socks5HttpClientFactory socks5HttpClientFactory,
IHttpClientFactory httpClientFactory) IHttpClientFactory httpClientFactory)
{ {
_currencyTable = currencyTable; _currencyTable = currencyTable;
@@ -88,7 +88,7 @@ namespace BTCPayServer.Controllers
_WalletReceiveStateService = walletReceiveStateService; _WalletReceiveStateService = walletReceiveStateService;
_EventAggregator = eventAggregator; _EventAggregator = eventAggregator;
_settingsRepository = settingsRepository; _settingsRepository = settingsRepository;
_socketFactory = socketFactory; _socks5HttpClientFactory = socks5HttpClientFactory;
_httpClientFactory = httpClientFactory; _httpClientFactory = httpClientFactory;
} }

View File

@@ -68,6 +68,7 @@ namespace BTCPayServer.Hosting
services.TryAddSingleton<SettingsRepository>(); services.TryAddSingleton<SettingsRepository>();
services.TryAddSingleton<TorServices>(); services.TryAddSingleton<TorServices>();
services.TryAddSingleton<SocketFactory>(); services.TryAddSingleton<SocketFactory>();
services.TryAddSingleton<Socks5HttpClientFactory>();
services.TryAddSingleton<LightningClientFactoryService>(); services.TryAddSingleton<LightningClientFactoryService>();
services.TryAddSingleton<InvoicePaymentNotification>(); services.TryAddSingleton<InvoicePaymentNotification>();
services.TryAddSingleton<BTCPayServerOptions>(o => services.TryAddSingleton<BTCPayServerOptions>(o =>

View File

@@ -52,7 +52,7 @@
"BTCPAY_SSHPASSWORD": "opD3i2282D", "BTCPAY_SSHPASSWORD": "opD3i2282D",
"BTCPAY_DEBUGLOG": "debug.log", "BTCPAY_DEBUGLOG": "debug.log",
"BTCPAY_TORRCFILE": "../BTCPayServer.Tests/TestData/Tor/torrc", "BTCPAY_TORRCFILE": "../BTCPayServer.Tests/TestData/Tor/torrc",
"BTCPAY_SOCKSENDPOINT": "tor:9050" "BTCPAY_SOCKSENDPOINT": "localhost:9050"
}, },
"applicationUrl": "https://localhost:14142/" "applicationUrl": "https://localhost:14142/"
} }

View File

@@ -1,30 +1,64 @@
using System; using System.Collections.Concurrent;
using System.Linq;
using NBitcoin;
using System.Net; using System.Net;
using System.Net.Http; using System.Net.Http;
using System.Net.Sockets; using System.Net.Sockets;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using BTCPayServer.Configuration; using BTCPayServer.Configuration;
using com.LandonKey.SocksWebProxy; using MihaZupan;
using com.LandonKey.SocksWebProxy.Proxy;
using Microsoft.Extensions.Logging;
using NBitcoin.Logging;
using NBitcoin.Protocol.Connectors; using NBitcoin.Protocol.Connectors;
using NBitcoin.Protocol; using NBitcoin.Protocol;
namespace BTCPayServer.Services namespace BTCPayServer.Services
{ {
public class Socks5HttpClientFactory : IHttpClientFactory
{
private readonly BTCPayServerOptions _options;
public Socks5HttpClientFactory(BTCPayServerOptions options)
{
_options = options;
}
private static (string Host, int Port)? ToParts(EndPoint endpoint)
{
switch (endpoint)
{
case DnsEndPoint dns:
return (dns.Host, dns.Port);
case IPEndPoint ipEndPoint:
return (ipEndPoint.Address.ToString(), ipEndPoint.Port);
}
return null;
}
private ConcurrentDictionary<string, HttpClient> cachedClients = new ConcurrentDictionary<string, HttpClient>();
public HttpClient CreateClient(string name)
{
return cachedClients.GetOrAdd(name, s =>
{
var parts = ToParts(_options.SocksEndpoint);
if (!parts.HasValue)
{
return null;
}
var proxy = new HttpToSocks5Proxy(parts.Value.Host, parts.Value.Port);
return new HttpClient(
new HttpClientHandler {Proxy = proxy, },
true);
});
}
}
public class SocketFactory public class SocketFactory
{ {
private readonly BTCPayServerOptions _options; private readonly BTCPayServerOptions _options;
public readonly Task<HttpClient> SocksClient;
public SocketFactory(BTCPayServerOptions options) public SocketFactory(BTCPayServerOptions options)
{ {
_options = options; _options = options;
SocksClient = CreateHttpClientUsingSocks();
} }
public async Task<Socket> ConnectAsync(EndPoint endPoint, CancellationToken cancellationToken) public async Task<Socket> ConnectAsync(EndPoint endPoint, CancellationToken cancellationToken)
@@ -70,51 +104,5 @@ namespace BTCPayServer.Services
{ {
} }
} }
private Task<HttpClient> CreateHttpClientUsingSocks()
{
return Task.Run(() =>
{
try
{
var proxyConfig = new ProxyConfig() {Version = ProxyConfig.SocksVersion.Five};
switch (_options.SocksEndpoint)
{
case null:
return null;
case IPEndPoint ipEndPoint:
proxyConfig.SocksPort = ipEndPoint.Port;
proxyConfig.SocksAddress = ipEndPoint.Address;
break;
case DnsEndPoint dnsEndPoint:
proxyConfig.SocksPort = dnsEndPoint.Port;
var ip = Dns.GetHostEntry(dnsEndPoint.Host).AddressList
.SingleOrDefault(address => address.AddressFamily == AddressFamily.InterNetwork);
if (ip == null)
{
Logs.Utils.LogWarning( $"Could not find ip for {dnsEndPoint.Host}");
return null;
}
proxyConfig.SocksAddress = ip;
break;
default:
return null;
}
Logs.Utils.LogWarning( $"Created socks proxied http client!");
return new HttpClient(new HttpClientHandler
{
Proxy = new SocksWebProxy(proxyConfig), UseProxy = true
});
}
catch (Exception e)
{
Logs.Utils.LogError(e, "Could not create Tor client");
return null;
}
});
}
} }
} }

View File

@@ -52,7 +52,7 @@
<tr class="@(payment.Replaced ? "linethrough" : "")" > <tr class="@(payment.Replaced ? "linethrough" : "")" >
<td>@payment.Crypto</td> <td>@payment.Crypto</td>
<td>@payment.DepositAddress</td> <td>@payment.DepositAddress</td>
<td>@payment.CryptoPaymentData.GetValue() @(payment.CryptoPaymentData.PayJoinSelfContributedAmount == 0? string.Empty : $"<br/>(+ Payjoin {payment.CryptoPaymentData.PayJoinSelfContributedAmount })")</td> <td>@payment.CryptoPaymentData.GetValue() @Safe.Raw(payment.CryptoPaymentData.PayJoinSelfContributedAmount == 0? string.Empty : $"<br/>(Payjoin {payment.CryptoPaymentData.PayJoinSelfContributedAmount})")</td>
<td> <td>
<div class="wraptextAuto"> <div class="wraptextAuto">
<a href="@payment.TransactionLink" target="_blank"> <a href="@payment.TransactionLink" target="_blank">