一、阁下是否曾被以下问题困扰?
1、服务器3389端口被机房的网络安全设备如防火墙等禁止。
2、服务器22端口被机房的网络安全设备如防火墙等禁止。
。。。。。。
由于3389/22/1433等端口在网络安全设备的黑名单内,即使我们在服务器的“高级安全Windows防火墙”中设置了出入站规则也无济于事。
二、解决方案
数据机房的网络安全设备并没有禁止所有的端口。所以解决方案之一是监听一个新的不受限制的端口,当该端口监听到数据时,实时把数据转发给3389/22/1433等端口。同样,当3389/22/1433等端口接收到数据时也转发给这个新的端口。总之,新旧端口之间互发数据。
举例,8080端口与3389互发:
三、编写端口转发类库
新建类chanelThread,添加以下字段:
private bool isActive = true; private Socket socket1; private Socket socket2; Thread t1 = null; Thread t2 = null; public bool IsActive { get => isActive; } public Socket Socket1 { get => socket1; set => socket1 = value; } public Socket Socket2 { get => socket2; set => socket2 = value; }
Socket1和Socket2分别对应8080和3389这两个端口的tcp连接。
在类chanelThread构造函数中,创建2个线程t1和t2并立刻启动。t1作用是读取socket1数据并写入socket2。tc2作用则相反,读取socket2数据并写入socket1。
public chanelThread() { t1 = new Thread(this.Run1); t1.Start(); t2 = new Thread(this.Run2); t2.Start(); }
在每个线程开始前,使用WaitHandle.WaitOne 方法阻止当前线程执行,直到收到开始的信号。
类chanelThread的具体实现方法请查看源代码。
四、调用类库
在main函数中调用类库,功能是8081端口转发到192.168.8.164的3389端口。
IPEndPoint ipAndPort = new IPEndPoint(IPAddress.Any,8081); TcpListener tcpListener = new TcpListener(ipAndPort); tcpListener.Start(); while (true) { TcpClient A = tcpListener.AcceptTcpClient(); TcpClient B = new TcpClient(AddressFamily.InterNetwork); B.Connect("192.168.8.164", 3389); if (B.Connected) { chanelThread chanelThread = new chanelThread(); chanelThread.Socket1 = A.Client; chanelThread.Socket2 = B.Client; chanelThread.Start(); } }
首先新建tcpListener监听8081端口并启动监听。
while死循环是必不可少的,必须不停地接收连接。
当8081端口接收到连接后,保存连接为socket A。
新创建一个新的tcp client,主动连接至目标IP192.168.8.164:3389。
连接成功后,调用chanelThread类库,两个socket互发。
五、测试
启动示例代码,么有编写提示,所以无输出。
打开远程桌面,输入:192.168.8.111:8081,
也可以把B.Connect("192.168.8.164", 3389);改成B.Connect("192.168.8.164", 80);这样就可以用8081端口映射到164服务器的80端口了。使用方法有很多,可以作为跳板机访问同网络的其他机器资源。
我已将代码上传,下载码是:7225754549
下载码是啥?如何下载=》点击查看https://www.luweidong.cn/details/88