我有一个运行Redis服务器的远程Linux机器,在开放端口上进行监听.我想加密流量,但Redis不支持SSH.建议的解决方案是使用SSH隧道,但我对此没有多少经验.
我尝试将RedisClient(ServiceStack.Redis)对象连接到通过SSH(SSH.NET)隧道转发到远程linux盒的本地端口:
static void Main(string[] args) { using (var client = new SshClient("example.org", "sshuser", "sshpassword")) { client.Connect(); var port = new ForwardedPortLocal("localhost", 1234, " example.org ", 1234); client.AddForwardedPort(port); port.Exception += (sender, e) => Console.WriteLine(e.Exception.ToString()); port.Start(); using (var redisClient = new RedisClient("localhost", 1234, "redispassword")) { var values = redisClient.As(); const string dansFord = "Dan's Ford Mustang"; values.Store(dansFord); Console.WriteLine("Redis has " + values.GetAll().Count + " entries"); values.GetAll().ToList().ForEach(Console.WriteLine); } Console.ReadLine(); port.Stop(); client.Disconnect(); } }
这不起作用,因为RedisClient无法连接到localhost上的不存在的服务器,并且转发似乎不起作用.我的问题是:
是否可以将SSH.NET的SSH隧道用于RedisClient?
我只是使用SshClient错了吗?
有没有更简单的方法来完成与远程Redis服务器的加密连接?
我无法应用任何操作系统级别的调整,因此解决方案应该是纯达4.5.1的.NET.这里发布的解决方案需要一个商业图书馆,而我必须依赖免费的.
谢谢!
回答:
是否可以将SSH.NET的SSH隧道用于RedisClient?是
我只是使用SshClient错了吗?是
有没有更简单的方法来完成与远程Redis服务器的加密连接? 我不这么认为.Redis 建议使用SSL代理,但这似乎更复杂
顺便说一句,您的代码在一些更改后工作.
使用"127.0.0.1"而不是"localhost".
使用localhost可能会导致问题,因为localhost可以解析为端口转发可能不支持的IPv6地址.
端口转发应该像这样设置:
var port = new ForwardedPortLocal("127.0.0.1",42421,"127.0.0.1",6379);
42421是本地计算机上的端口.它必须是可用的.发送到此端口的所有流量都将被转发.
6379是redis服务器正在侦听的远程服务器上的端口.
与redis客户端连接时,请使用IPv4地址:
var redisClient = new RedisClient("127.0.0.1",42421)
42421与您上面用于转发的端口相同.