分享一个TCP端口转发的类库

一、阁下是否曾被以下问题困扰?

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

下载码是啥?如何下载=》点击三味书屋-分享一个TCP端口转发的类库

举报
评论 0