分享一个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

    下载码是啥?如何下载=》点击查看icon-default.png?t=N2N8https://www.luweidong.cn/details/88

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值