精华内容
下载资源
问答
  • Nginx 配置TCP代理
    2022-01-26 10:35:27

    Nginx 1.9 版本以后增加了stream模块,可以对tcp,udp请求进行代理和负载均衡了,今天来体验一下
    首先编译安装过程configure的时候增加选项 --with-stream --with-stream_ssl_module 是支持tcp代理
    安装完成后修改 nginx.conf 在文件最后添加 include tcp/*.conf ,注意不是在http范畴内,然后在conf目录下创建tcp目录


    简单测试

    都在一个机器上, nginx监听 10000 端口,然后开两个窗口,用nc监听 10001 、10002端口。
    nginx配置

                  / nc -l 10001
    telnet--> nginx(10000)  ---->
                  \ nc -l 10002
    配置

    stream {undefined
      upstream backend {undefined
        server 127.0.0.1:10001;
        server 127.0.0.1:10002;
      }
      server {undefined
        listen 10000;
    #    listen 10000 udp; 如需代理udp端口则在端口后面加udp即可
        proxy_timeout 20s;
        proxy_pass backend;
      }
    }

    telnet 127.0.0.1 10000
    第一次会代理到 10001 端口,第二次会到 10002 端口,代理正常。


    下面是一个ssl 然后ip hash方式的负载均衡(tcp也支持几种负载均衡方式 round-robin, least_conn least_time, hash等)

    stream {undefined
      upstream backend {undefined
        hash $remote_addr;
        server 192.168.1.10:20001;
        server 192.168.1.10:20002;
      }
      server {undefined
        listen 20000 ssl;
        ssl_certificate /data/keys/CAcert.pem;
        ssl_certificate_key /data/keys/privkey.pem;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 2h;
        proxy_timeout 20s;
        proxy_pass backend;
      }
    }

    ===================

    Nginx 在1.9.0版本发布以前如果要想做到基于TCP的代理及负载均衡需要通过打名为 nginx_tcp_proxy_module 的第三方patch来实现,该模块的代码托管在github上网址:https://github.com/yaoweibin/nginx_tcp_proxy_module/。

    Nginx 从1.9.0开始发布ngx_stream_core_module模块,该模块支持tcp代理及负载均衡。

    今天我们就要来简单测试一下 Nginx 的 ngx_stream_core_module 模块。

    安装Nginx并启用模块

    ngx_stream_core_module这个模块并不会默认启用,需要在编译时通过指定--with-stream参数来激活这个模块。

    • 编译安装

     
    
    1. $ yum -y install proc* openssl* pcre*

    2. $ wget http://nginx.org/download/nginx-1.9.4.tar.gz

    3. $ tar zxvf nginx-1.9.4.tar.gz

    4. $ cd nginx-1.9.4

    5. $ ./configure  --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-threads --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_spdy_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'

    6. $ make

    7. $ make install

    • 配置stream模块

    实例一:测试MYSQL负载均衡

    stream模块必需在nginx.conf中配置

     
    
    1. $ mv nginx.conf{,.bak}

    2. $ vim  /etc/nginx/nginx.conf

    3. worker_processes auto;

    4. events {

    5.    worker_connections  1024;

    6. }

    7. error_log /var/log/nginx_error.log info;

    8. stream {

    9.    upstream mysqld {

    10.        hash $remote_addr consistent;

    11.        server 192.168.1.42:3306 weight=5 max_fails=1 fail_timeout=10s;

    12.        server 192.168.1.43:3306 weight=5 max_fails=1 fail_timeout=10s;

    13.    }

    14.    server {

    15.        listen 3306;

    16.        proxy_connect_timeout 1s;

    17.        proxy_timeout 3s;

    18.        proxy_pass mysqld;

    19.    }

    20. }

    实例二:实现SSH转发

     
    
    1. upstream ssh {

    2.        hash $remote_addr consistent;

    3.        server 192.168.1.42:22 weight=5;

    4.   }

    5. server {

    6.    listen 2222;

    7.    proxy_pass ssh;    

    8.   }

    实例三:官方一个较完整的配置示例

    stream模块的配置里还支持类似server unix:/tmp/backend3.sock;这样的sock数据交换接口,也可以直接proxy_pass unix:/tmp/stream.socket;

     
    
    1. worker_processes auto;

    2. error_log /var/log/nginx/error.log info;

    3. events {

    4.    worker_connections  1024;

    5. }

    6. stream {

    7.    upstream backend {

    8.        hash $remote_addr consistent;

    9.        server backend1.example.com:12345 weight=5;

    10.        server 127.0.0.1:12345            max_fails=3 fail_timeout=30s;

    11.        server unix:/tmp/backend3;

    12.    }

    13.    server {

    14.        listen 12345;

    15.        proxy_connect_timeout 1s;

    16.        proxy_timeout 3s;

    17.        proxy_pass backend;

    18.    }

    19.    server {

    20.        listen [::1]:12345;

    21.        proxy_pass unix:/tmp/stream.socket;

    22.    }

    23. }

    ngx_stream_core_module也同样的支持tcp长连接保持。keepidle是保持时间,keepintvl是间隔时间 ,keepcnt是发送的个数。

    so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]

    更多相关内容
  • 本文实例讲述了python实现简单的TCP代理服务器的方法,分享给大家供大家参考。 具体实现代码如下: # -*- coding: utf-8 -*- ''' filename:rtcp.py @desc: 利用python的socket端口转发,用于远程维护 如果连接不到...
  • 代理:C ++ TCP代理服务器
  • 又一个 tcp 代理服务器。 特征 简单、小型的代码库 非常快,高性能 完全非阻塞的 IO 操作。 多IO线程 简单教程 ####1.更新配置文件“application.conf”。 tcpProxyServer { hosts = [ { localPort = 465 ...
  • smart-proxy 是一个 tcp 代理,它允许您根据任何协议的主机名路由 tcp 连接 npm install smart-proxy 用法 首先在两个不同的端口上启动两个服务,一个 tcp 服务和一个 http 服务(比如10001和10002 ) var ...
  • proxy-server 是基于swoole开发的纯异步多进程TCP代理服务器,可支持超大量并发。可完美利用多核,性能强劲。运行程序pecl install swoole php proxy.php压力测试ab -c 1000 -n 100000 -k ...
  • EasyProxy 是一个简单易用的 Tcp 代理服务器。如上图,easyproxy作为LBS服务器。如果您遇到不能直接访问某个服务的情况或需要一个网关服务器作为网关,您就可以使用此代理服务器代理。 标签:EasyProxy
  • node_tcp_proxy node实现tcp代理,本例主要是用来代理emq tcp服务器
  • tcp代理服务

    2017-12-09 12:51:46
    用于实现端口转换,可以通过80等端口转换TCP通讯并绕过防火墙,同时也能把网络传输的数据截取到文本中,对于没有加密的传输来说,那么传输的内容就完全暴露在你眼皮上了..还可以在指定机器上运行通过端口转换作为代理...
  • TCP Proxy TCP代理

    2013-03-07 17:25:01
    用于实现端口转换,可以通过80等端口转换TCP通讯并绕过防火墙,同时也能把网络传输的数据截取到文本中,对于没有加密的传输来说,那么传输的内容就完全暴露在你眼皮上了..还可以在指定机器上运行通过端口转换作为代理...
  • (socket,netty)客户端访问代理1服务器,代理服务器1过网闸1访问代理2服务器,代理2服务器访问目标服务器成功返回数据后,过网闸2返回数据至代理1服务器,代理1服务器返回数据至客户端。 可用到功能(代理服务器,...
  • 支持代理udp和tcp协议。
  • go-tcp-proxy, 在Go中,一个小型的TCP代理 tcp代理用Go编写的小型TCP代理这里项目用于调试基于文本的协议。 下一个版本将处理二进制协议。用法go get github.com/jpillora/go-tcp-proxy/cmd/tcp-proxy
  • 简单的websocket tcp代理。 Usage: ws-tcp-proxy <address> [flags] Flags: -a, --auto-cert string register hostname with LetsEncrypt -c, --cert string path to cert.pem for TLS -k, --key string path ...
  • 易语言TCP代理

    2020-08-20 19:20:34
    易语言TCP代理源码系统结构:启动代理服务,服务器,客户,关闭代理服务,取系统时间,取域名,取端口,取页面地址,Call,Start,Stop,ThreadProc,GetIndex,GetSocket,GetType,SetType,PostAcceptEx,PostWSARecv,PostWSASe
  • 用epoll演示tcp代理

    2017-08-23 23:52:49
    epoll 原型展示,包括用epoll开发的客户端、服务端、代理,及用vc开发的客户端,并有相关脚本
  • 基于Verilog语言编写的TCP代理程序,部署在FPGA上加速TCP代理功能
  • 提供简单的tcp协议代理windows工具,提供UI模式使用; 支持多种负载均衡模式; 提供实时状态显示;
  • 安全和最小的tcp代理。 以非特权用户身份运行,因此只能代理非特权端口(> = 1024)。 环境变量 预设运行时变量 VAR_PORT =“ 8080” VAR_FINAL_COMMAND ='socat TCP-LISTEN:$ {VAR_LISTEN_PORT:-$ VAR_PORT},...
  • 这是一个实现简单回退机制的TCP代理。 所有请求将转发到列表中的第一个工作后端。 当后端连接失败时,将关闭客户端连接,并将后端标记为不工作,以便在后台进行探测。 恢复后端连接后,会将后端标记回以供代理使用...
  • 使用进行服务发现的TCP代理。 这使用 API来收集候选服务器。 安装 预编译的二进制文件 在页面上可以找到针对Linux环境的预编译二进制文件。 $ curl -L ...
  • Golang中的简单tcp代理程序包和可执行二进制文件。 :warning: 该代码仅用于测试目的,有时很难看,还不能投入生产,并且API可能会更改。 :warning: 安装 使用正确配置的: $ git clone github.com/kahlys/proxy/...
  • wstcp WebSocket以Rust编写的TCP代理 安装预编译的二进制文件在Rust编写的pag wstcp WebSocket to TCP代理发行版中提供了Linux环境的预编译二进制文件。 安装预编译的二进制文件在发行页面上可以找到Linux环境的预...
  • tcp-cl-代理 旨在限制并发的 TCP 代理 为什么? 有时有一个服务侦听 TCP 端口,它很容易被并发请求淹没。 此外,无论出于何种原因,该服务都没有任何方法来限制其自身的资源使用或并发性。 当您没有能力(关闭、...
  • tcpproxy:TCP代理

    2021-07-13 07:28:12
    TCPproxy:立即限制您的 TCP 连接! $ npm install -g tcpproxy 默认命令将每个 TCP 连接延迟一秒并将端口 8080 重定向到 80: $ tcpproxy -a www.google.com Finish transfer! -- Time: 150 ms -- Client: 76 ...
  • haproxy配置TCP代理

    2021-11-30 16:22:01
    haproxy配置TCP代理 安装: yum -y install haproxy 备份原配置文件: cp -rf /etc/haproxy/haproxy.cfg{,.bak} 删除配置文件中的注释行和空行: sed -i -r '/^[ ]*#/d;/^$/d' /etc/haproxy/haproxy.cfg 修改配置...

    haproxy配置TCP代理

    安装:

    yum -y install haproxy
    

    备份原配置文件:

    cp -rf /etc/haproxy/haproxy.cfg{,.bak}
    

    删除配置文件中的注释行和空行:

    sed -i -r '/^[ ]*#/d;/^$/d' /etc/haproxy/haproxy.cfg
    

    修改配置文件:

    global
        log         127.0.0.1 local2
        chroot      /var/lib/haproxy
        pidfile     /var/run/haproxy.pid
        maxconn     4000
        user        haproxy
        group       haproxy
        daemon
        stats socket /var/lib/haproxy/stats
    defaults
    #默认是http,我们要做tcp代理
        mode                    tcp
        log                     global
    #需要注释下行
    #    option                  httplog
    #需要添加下行
        option                  tcplog
        option                  dontlognull
    #在使用长连接时,为了避免客户端超时没有关闭长连接,此功能可以使服务器端关闭长连接
        option http-server-close    
    #如果服务器上的应用程序想记录发起请求的客户端的IP地址,需要在HAProxy上配置此选项,这样HAProxy会把客户端的IP信息发送给服务器,在HTTP请求中添加"X-Forwarded-For"字段
        option forwardfor       except 127.0.0.0/8
        option                  redispatch
        retries                 3
        timeout http-request    10s
        timeout queue           1m
    #成功连接到一台服务器的最长等待时间
        timeout connect         1000s
    #客户端超时
        timeout client          150000m
    #后端服务器超时   
        timeout server          150000m
        timeout http-keep-alive 10s
        timeout check           10s
    #最大连接数
        maxconn                 6000
    listen mysql
        bind *:3310
        mode tcp
    #负载均衡的方式
        balance leastconn
        server mysql1 xxx.xxx.xxx.xxx:3306 check inter 500 rise 1 fall 2
    

    登录
    在这里插入图片描述

    展开全文
  • 易语言TCP代理源码设置本地网络为远程代理
  • windows下运行的tcp代理工具,能方便的看到中间的数据流
  • TCP代理的原理及实现

    千次阅读 2020-07-10 23:50:06
    TCP代理的实现方法及原因 很多时候对于渗透人员有必要保留一个TCP代理,它可以将流量从一个主机转发到另一个主机,而且也可以用来评估基于网络的软件。当你在渗漏环境时,发现目标网络无法抓包,这个时候,TCP代理...

    TCP代理的实现方法及原因

    很多时候对于渗透人员有必要保留一个TCP代理,它可以将流量从一个主机转发到另一个主机,而且也可以用来评估基于网络的软件。当你在渗漏环境时,发现目标网络无法抓包,这个时候,TCP代理可以代替使用以了解流量及一些协议。
    在这里插入图片描述

    过程原理:

    主机A通过和服务器主动连接,通过accept()返回一个socket对象,也就是client_socket来进行通信,之后服务器连接我们要探测的目标主机B,通过建立的remote_socket对象来进行连接通信。A把自己想要发送给B的信息存储在local_buffer发送给服务器,服务器再通过和主机B之间的套接字remote_socket转发给B。B的回应信息的转发过程与此同理。

    脚本主要是以下几个核心函数组成。

    1.server_loop():主要是绑定服务器的地址和端口号,并且指定远程目标主机ip和端口号。并且调用proxy_handler()函数
    2.proxy_handler():此函数就是本脚本中的TCP代理函数,用于转发和接收数据
    3.hexdump():16进制导出函数。
    4.response_hanler()和request_handler():可以对获取的数据(也就是包)进行修改。没有的话就直接原数据返回
    5.receive_from():通过套接字对象来接收存储的数据
    6.相关参数解释
    (1)client_scoket:服务器和本机的套接字对象
    (2)local_host和local_port:绑定服务器地址和端口
    (3)remote_host和remote:确定远程要连接的主机地址和端口
    (4)flag:表示是否存在信息。

    脚本如下:

    import sys
    import socket
    import threading
    
    
    def server_loop(local_host,local_port,remote_host,remote_port,flag):
        server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        try:
            server.bind((local_host,local_port))
        except:
            print("[!!] Failed to listen on %s:%d"%(local_host,local_port))
            sys.exit(0)
        print("[*] listening on %s:%d"%(local_host,local_port))
        server.listen(5)
    
        while True:
            client,addr=server.accept()
            print("Received connection from %s:%d"%(addr[0],addr[1]))
    
            #开启多线程处理与本地接收到的套接字与远程主机的通信
            proxy_thread=threading.Thread(target=proxy_handler,args=(client,remote_host,remote_port,flag))
            proxy_thread.start()
    
    #16进制导出函数
    def hexdump(src,length=16):
        result=[]
        digits=4 if isinstance(src,unicode) else 2
    
        for i in range(0,len(src),length):
            s=src[i:i+length]
            hexa=b' '.join(["%0*X"%(digits,ord(x) for x in s)])
            text=b''.join([x if 0x20 <= ord(x) < 0x7F else b'.' for x in s])
            result.append(b"%04X   %-*s   %s" %(i,length*(digits + 1),hexa,text))
        print(b'\n'.join(result))
    
    #tcp代理核心函数
    def proxy_handler(client,remote_host,remote_port,flag):
        remote_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        remote_socket.connect((remote_host,remote_port))
        if flag:
            remote_buffer=receive_from(remote_socket)
            #转换成16进制表示
            hexdump(remote_buffer)
            #发送给响应处理
            remote_buffer=response_handler(remote_buffer)
    
            if len(remote_buffer):
                print("[<==] sending %d bytes to localhost",%len(remote_buffer))
                client.send(remote_buffer)
            while True:
                local_buffer=receive_from(client)
    
                #判断是否有本地数据的存在
                if len(local_buffer):
                    print("[==>] Received %d bytes from localhost"%len(local_buffer))
                    hexdump(local_buffer)
                    #发生给我们的响应处理
                    local_buffer=request_handler(local_buffer)
    
                    remote_socket.send(local_buffer)
                    print("[==>] Sent to remote")
    
                #接受响应的数据
                remote_buffer=receive_from(remote_socket)
                if len(remote_buffer):
                    print("[<==] Receive %d bytes from remote"%len(remote_buffer))
                    hexdump(remote_buffer)
    
                    remote_buffer=response_handler(remote_buffer)
                    #将得到的信息发送回来
                    client.send(remote_buffer)
                    print("[<==] Sent to localhost")
    
                if len(remote_buffer) or len(local_buffer):
                    client.close()
                    remote_socket.close()
                    print("[*] no more data")
                    break
    
    def response_handler(buffer):
        #可以适当进行包修改,不做修改就直接返回
        return buffer
    def request_handler(buffer):
        # 可以适当进行包修改,不做修改就直接返回
        return buffer
    
    def receive_from(connection):
        buffer=""
        connection.settimeout(2)
    
        try:
            while True:
                data=connection.recv(4096)
                if not data:
                    break
                buffer+=data
        except:
            pass
        return buffer
    
    def main():
        #命令行提示信息
        if len(sys.argv[1:])!=5:
            print("usage:proxy.py  [local_host] [local_port] [remote_host] [remote_port] [flag]")
            sys.exit(0)
    
        #绑定本地服务器ip和端口
        local_host=sys.argv[1]
        local_port=int(sys.argv[2])
        #确定远程主机ip和端口
        remote_host=sys.argv[3]
        remote_port=int(sys.argv[4])
        flag=sys.argv[5]
    
        #确定是否有信息需要接收
        if "True" in flag:
            flag=True
        else:
            flag=False
        server_loop(local_host,local_port,remote_host,remote_port,flag)
    main()
    

    连接远程FTP主机运行结果如下
    在这里插入图片描述

    此脚本出自书《python黑帽子》,此文章是自己的学习笔记,若有错误请大家指正。

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 232,973
精华内容 93,189
关键字:

tcp代理

友情链接: EX100.rar