前言
迩来向导安排了新使命,需要搭建一台socks5服务器,然后再做一个远程登录客户端,嵌入网络代理功能。最初的想法是把vpn嵌入到自己做的客户端内里,但这个技能要求相对来说太高了,小弟气力还远远不够。背面QQ、钉钉等客户端软件得到灵感,发现他们登录界面都内嵌了网络代理功能,随后小弟便想到了下图的架构。
socks5代理服务器预研及总结
四款socks5服务器分析
- shadowsocks 需要安装专门的客户端毗连,雷同于openvpn需要有客户端和服务端配套使用
- ss5 该方案较为古老,下载完安装包之后,编译失败(ubuntu22系统)
- goproxy 采取go语言开辟,该方案最新且性能较好,但是高级功能需要购买商业版(免费版本无法使用用户名密码认证),如果需要稳定使用购买该商业版较好
- socks-server,采取c++语言开辟,服务端可以设置用户名,密码认证,缺点该服务器相对小众,运用在生产环境不确定是否稳定
最后选择socks-server,项目地址:https://github.com/xukeawsl/socks-server
socks-server安装搭建
- 下载堆栈并创建构建目录
- git clone https://github.com/xukeawsl/socks-server.git
- cd socks-server
- mkdir build
- cd build
复制代码
- 使用cmake构建release版本
build_type选择release
- cmake -DCMAKE_BUILD_TYPE=Release ..
复制代码
构建
- 安装,我这里选择到**/usr/local/**目录下
- cmake --install . --prefix /usr/local
复制代码
- 进入安装目录后执行
- cd /usr/local/socks_server/Release/bin/
- ./socks_server
复制代码 发现报如图错误
我这里为了方便,直接将libsocks_server.4.3.so移动到系统目录下面去了
- mv libsocks_server.4.3.so /usr/lib/x86_64-linux-gnu/
复制代码 再执行一遍发现运行成功无报错
- 修改config.json文件,配置用户名密码登录
- cd /usr/local/socks_server/Release/
- vim config.json
复制代码
- 让代理服务器在背景启动并不产生输出
- nohup /usr/local/socks_server/Release/bin/socks_server > /dev/null 2>&1 &
复制代码 使用python脚本测试socks5客户端毗连
- 测试代码
- import socks
- import socket
- def test_socks5_proxy_connection(proxy_host, proxy_port, proxy_username, proxy_password, timeout=10):
- """
- 测试 SOCKS5 代理连接是否能够成功。
- :param proxy_host: SOCKS5 代理主机地址
- :param proxy_port: SOCKS5 代理端口
- :param proxy_username: SOCKS5 代理用户名
- :param proxy_password: SOCKS5 代理密码
- :param timeout: 连接超时时间(秒)
- :return: 如果连接成功,返回 True;否则返回 False
- """
- original_socket = socket.socket # 保存原始的 socket 类
- try:
- # 设置 SOCKS5 代理,包括用户名和密码
- socks.set_default_proxy(proxy_type=socks.SOCKS5,addr=proxy_host, port=proxy_port, rdns=True, username=proxy_username, password=proxy_password)
- socket.socket = socks.socksocket # 覆盖 socket 模块的 socket 类
- test_host = '10.8.0.214'
- test_port = 80
- with socket.create_connection((test_host, test_port), timeout) as conn:
- print(f"成功连接到 SOCKS5 代理 {proxy_host}:{proxy_port},并通过它连接到了 {test_host}:{test_port}")
- return True
- except Exception as e:
- print(f"连接失败: {e}")
- return False
- finally:
- # 恢复原始的 socket 类
- socket.socket = original_socket
- # 示例用法
- if __name__ == "__main__":
- proxy_host = '10.10.112.5'
- proxy_port = 1080 # 常见的 SOCKS5 代理端口
- proxy_username = 'narada'
- proxy_password = 'narada@123'
- result = test_socks5_proxy_connection(proxy_host, proxy_port, proxy_username, proxy_password)
- print(f"测试结果: {result}")
复制代码 - 使用正确的用户名密码和错误的用户名密码进行测试
测试成功!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |