100行php代码实现加密端口转发
2019独角兽企业重金招聘Python工程师标准>>>
如题,这个是100行php代码实现代理上网最终篇,玩具性质,个人用可以,因为1性能不高,2加解密IV重复使用。 用法就是socks5服务端和加密端口转发服务端运行在可自由上网的机器上,加密端口转发客户端运行在本地,配置socks5代理即可。
加密端口转发分服务端和客户端,偷懒了,没有把代码整合到一块去。
客户端:
<?php
class Server
{public $mode;public $buffer = [];private $clients = [];public function __construct($mode){$this->mode = $mode;}public function start(){$server = new swoole_server('0.0.0.0', 2080, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);$server->set(['max_conn' => 1000,'daemonize' => 0,'worker_num' => 1,'dispatch_mode' => 2,//'max_request' => 2048,'open_cpu_affinity' => 1,'open_tcp_nodelay' => 1,'log_file' => 'port_forward_client.log','heartbeat_check_interval' => 30,'heartbeat_idle_time' => 60,]);$server->on('connect', [$this, 'onConnect']);$server->on('receive', [$this, 'onReceive']);$server->on('close', [$this, 'onClose']);$server->start();}public function onConnect($server, $fd, $fromID){echo 'onConnect.', PHP_EOL;$this->buffer[$fd] = '';$remote = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);$proxy = $this;$remote->on('connect', function($cli) use($proxy, $server, $fd, $remote) {echo 'connected to remote.', PHP_EOL;$this->clients[$fd] = $remote;if (isset($proxy->buffer[$fd]) && strlen($proxy->buffer[$fd]) > 0) {$remote->send($proxy->buffer[$fd]);$proxy->buffer[$fd] = '';}});$remote->on("error", function(swoole_client $cli) use($server, $fd) {echo 'connect to remote error.', PHP_EOL;$server->close($fd);});$remote->on('receive', function($client, $data) use($proxy, $server, $fd) {$data = ($this->mode === 'client') ? $proxy->decryptData($data) : $proxy->encryptData($data);$server->send($fd, $data);});$remote->on('close', function($cli) use($server, $fd) {//$server->close($fd);});$remote->connect('127.0.0.1', 1081);}public function onReceive($server, $fd, $fromID, $data){echo 'onReceive', PHP_EOL;$data = ($this->mode === 'client') ? $this->encryptData($data) : $this->decryptData($data);if (!isset($this->clients[$fd])) {$this->buffer[$fd] .= $data;return;}if (isset($this->buffer[$fd]) && strlen($this->buffer[$fd]) > 0) {$this->clients[$fd]->send($this->buffer[$fd]);$this->buffer[$fd] = '';}$this->clients[$fd]->send($data);}public function onClose($server, $fd, $fromID){//unset($this->clients[$fd]);}public function encryptData($data){return openssl_encrypt($data, 'AES-128-CFB', 'password', OPENSSL_RAW_DATA, '0123456789012345');}public function decryptData($data){return openssl_decrypt($data, 'AES-128-CFB', 'password', OPENSSL_RAW_DATA, '0123456789012345');}
}(new Server('client'))->start();
服务端:
<?php
class Server
{public $mode;public $buffer = [];private $clients = [];public function __construct($mode){$this->mode = $mode;}public function start(){$server = new swoole_server('127.0.0.1', 1081, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);$server->set(['max_conn' => 1000,'daemonize' => 0,'worker_num' => 1,'dispatch_mode' => 2,//'max_request' => 2048,'open_cpu_affinity' => 1,'open_tcp_nodelay' => 1,'log_file' => 'port_forward.log','heartbeat_check_interval' => 30,'heartbeat_idle_time' => 60,]);$server->on('connect', [$this, 'onConnect']);$server->on('receive', [$this, 'onReceive']);$server->on('close', [$this, 'onClose']);$server->start();}public function onConnect($server, $fd, $fromID){echo 'onConnect.', PHP_EOL;$this->buffer[$fd] = '';$remote = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);$proxy = $this;$remote->on('connect', function($cli) use($proxy, $server, $fd, $remote) {echo 'connected to remote.', PHP_EOL;$this->clients[$fd] = $remote;if (isset($proxy->buffer[$fd]) && strlen($proxy->buffer[$fd]) > 0) {$remote->send($proxy->buffer[$fd]);$proxy->buffer[$fd] = '';}});$remote->on("error", function(swoole_client $cli) use($server, $fd) {echo 'connect to remote error.', PHP_EOL;$server->close($fd);});$remote->on('receive', function($client, $data) use($proxy, $server, $fd) {$data = ($this->mode === 'client') ? $proxy->decryptData($data) : $proxy->encryptData($data);$server->send($fd, $data);});$remote->on('close', function($cli) use($server, $fd) {//$server->close($fd);});$remote->connect('127.0.0.1', 8388);}public function onReceive($server, $fd, $fromID, $data){echo 'onReceive', PHP_EOL;$data = ($this->mode === 'client') ? $this->encryptData($data) : $this->decryptData($data);if (!isset($this->clients[$fd])) {$this->buffer[$fd] .= $data;return;}if (isset($this->buffer[$fd]) && strlen($this->buffer[$fd]) > 0) {$this->clients[$fd]->send($this->buffer[$fd]);unset($this->buffer[$fd]);}$this->clients[$fd]->send($data);}public function onClose($server, $fd, $fromID){//unset($this->clients[$fd]);}public function encryptData($data){return openssl_encrypt($data, 'AES-128-CFB', 'password', OPENSSL_RAW_DATA, '0123456789012345');}public function decryptData($data){return openssl_decrypt($data, 'AES-128-CFB', 'password', OPENSSL_RAW_DATA, '0123456789012345');}
}(new Server('server'))->start();
转载于:https://my.oschina.net/u/142205/blog/676859
100行php代码实现加密端口转发相关推荐
- 100个必会的python脚本-100行Python代码实现自动抢火车票(附源码)
前言 又要过年了,今年你不妨自己写一段代码来抢回家的火车票,是不是很Cool.下面话不多说了,来一起看看详细的介绍吧. 先准备好: 12306网站用户名和密码 chrome浏览器及下载chromedr ...
- 100行JavaScript代码实现JavaScript
先看效果: 100行JavaScript代码实现经典游戏俄罗斯方块 新建一个html文件,复制如下代码,用浏览器打开即可: <!doctype html> <html> < ...
- sql行数少于10_如何用少于100行的代码创建生成艺术
sql行数少于10 by Eric Davidson 埃里克·戴维森(Eric Davidson) 如何用少于100行的代码创建生成艺术 (How to Create Generative Art I ...
- c语言微信挑一挑编程,100行python代码实现微信跳一跳辅助程序
写在前面 分享一下今天下午用python写的"跳一跳"小游戏的辅助程序.之前是准备用树莓派操控一个"机械手指"来代替人的触摸操作,但该方案还在酝酿中,实现了再分 ...
- windows命令行下用netsh实现端口转发(端口映射)
windows命令行下用netsh实现端口转发(端口映射) 微软Windows的netsh是一个命令行脚本实用工具.使用netsh工具 ,可以查看或更改本地计算机或远程计算机的网络配置.不仅可以在本地 ...
- github怎么为代码着色_如何仅用100行神经网络代码为黑白照片着色
github怎么为代码着色 by Emil Wallner 埃米尔·沃尔纳(Emil Wallner) 如何仅用100行神经网络代码为黑白照片着色 (How to colorize black &am ...
- 100行python代码做一个程序_100行python代码实现微信跳一跳辅助程序
写在前面 分享一下今天下午用python写的"跳一跳"小游戏的辅助程序.之前是准备用树莓派操控一个"机械手指"来代替人的触摸操作,但该方案还在酝酿中,实现了再分 ...
- python模拟别人说话的声音_如何用100行Python代码做出魔性声控游戏“八分音符酱”...
最近几天,一款魔性的小游戏在微博上刷屏了,各大平台的主播也纷纷如感染病毒一样直播自己怎么玩这个游戏(被游戏玩). 这个游戏叫做<不要停!八分音符酱♪>.它是一款来自岛国的恶搞游戏,主角是一 ...
- python100行代码程序-100行python代码,轻松完成贪吃蛇小游戏
大家小时候都玩过贪吃蛇吧?小编小时候可喜欢拿爸妈的手机玩了,厉害着呢!今天,小编就来用100行代码实现一个简易版的贪吃蛇.在网上,贪吃蛇教程蛮多的,但要安装蛮多库的,而且也不够清晰,今天的代码比较短, ...
最新文章
- leetcode-cli 用命令行开心的刷算法
- 当下数据中心业务面临哪些重大威胁?
- 广西2021各校高考成绩查询入口,2021年广西高考成绩排名查询系统,广西高考位次排名查询...
- 【知识星球】LeNet5,AlexNet,VGG,MobileNet它们的前身都是什么,你知道吗?
- oracle rac11g更换存储,11g rac更换存储
- 希尔排序(C++版)
- SAP在Kubernetes上打造的Kyma到底是个什么东东
- 单片机c语言必背代码_【典藏】深度剖析单片机程序的运行(C程序版)
- Linux 系统应用编程——网络编程(常用命令解析)
- java学习(87):Interage包装类进制转换
- (王道408考研操作系统)第二章进程管理-第三节10:经典同步问题之哲学家进餐问题
- linq to entity 左联接 右连接 以及内连接写法的区别(转)
- 力扣1317.将整数转换为两个无零整数之和
- SQL Server数据库的导出
- [react-native]react-native填坑笔记
- python之常用快捷键
- Flea CodeForces - 32C (思维)
- Linux系统创建vlan教程,linux vlan配置详解
- bada-开发入门之HelloWorld(上)
- CodeForces - 55D UVALive - 6528
热门文章
- mysql快速迁移数据sql_使用Navicat Premium工具快速迁移数据方法 适用于mysql及mssql数据库...
- 无盘服务器2个dhcp,无盘 dhcp 服务器配置
- linux 安装包 在此作用域中尚未声明_Linux运行go项目报错:copy_file_range: bad file descriptor...
- python打印表格_使用 Python 打印漂亮的表格,这两项基本功你可会?
- 伯克利的电气工程和计算机科学专业,2021年加州大学伯克利分校电气工程与计算机科学专业入学要求高吗?...
- 智能车竞赛技术报告 | 单车拉力组 - 长春理工大学- 追风零队 2021
- 走火入魔 | 暑期电子设计课程学生们的作品
- 清华导学故事|卓晴:在每个人生阶段中,找到自己的定位
- 利用STM32F405RG制作pyBoard实验板
- mongodb索引生成HTML页面,MongoDB高级索引