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代码实现加密端口转发相关推荐

  1. 100个必会的python脚本-100行Python代码实现自动抢火车票(附源码)

    前言 又要过年了,今年你不妨自己写一段代码来抢回家的火车票,是不是很Cool.下面话不多说了,来一起看看详细的介绍吧. 先准备好: 12306网站用户名和密码 chrome浏览器及下载chromedr ...

  2. 100行JavaScript代码实现JavaScript

    先看效果: 100行JavaScript代码实现经典游戏俄罗斯方块 新建一个html文件,复制如下代码,用浏览器打开即可: <!doctype html> <html> < ...

  3. sql行数少于10_如何用少于100行的代码创建生成艺术

    sql行数少于10 by Eric Davidson 埃里克·戴维森(Eric Davidson) 如何用少于100行的代码创建生成艺术 (How to Create Generative Art I ...

  4. c语言微信挑一挑编程,100行python代码实现微信跳一跳辅助程序

    写在前面 分享一下今天下午用python写的"跳一跳"小游戏的辅助程序.之前是准备用树莓派操控一个"机械手指"来代替人的触摸操作,但该方案还在酝酿中,实现了再分 ...

  5. windows命令行下用netsh实现端口转发(端口映射)

    windows命令行下用netsh实现端口转发(端口映射) 微软Windows的netsh是一个命令行脚本实用工具.使用netsh工具 ,可以查看或更改本地计算机或远程计算机的网络配置.不仅可以在本地 ...

  6. github怎么为代码着色_如何仅用100行神经网络代码为黑白照片着色

    github怎么为代码着色 by Emil Wallner 埃米尔·沃尔纳(Emil Wallner) 如何仅用100行神经网络代码为黑白照片着色 (How to colorize black &am ...

  7. 100行python代码做一个程序_100行python代码实现微信跳一跳辅助程序

    写在前面 分享一下今天下午用python写的"跳一跳"小游戏的辅助程序.之前是准备用树莓派操控一个"机械手指"来代替人的触摸操作,但该方案还在酝酿中,实现了再分 ...

  8. python模拟别人说话的声音_如何用100行Python代码做出魔性声控游戏“八分音符酱”...

    最近几天,一款魔性的小游戏在微博上刷屏了,各大平台的主播也纷纷如感染病毒一样直播自己怎么玩这个游戏(被游戏玩). 这个游戏叫做<不要停!八分音符酱♪>.它是一款来自岛国的恶搞游戏,主角是一 ...

  9. python100行代码程序-100行python代码,轻松完成贪吃蛇小游戏

    大家小时候都玩过贪吃蛇吧?小编小时候可喜欢拿爸妈的手机玩了,厉害着呢!今天,小编就来用100行代码实现一个简易版的贪吃蛇.在网上,贪吃蛇教程蛮多的,但要安装蛮多库的,而且也不够清晰,今天的代码比较短, ...

最新文章

  1. leetcode-cli 用命令行开心的刷算法
  2. 当下数据中心业务面临哪些重大威胁?
  3. 广西2021各校高考成绩查询入口,2021年广西高考成绩排名查询系统,广西高考位次排名查询...
  4. 【知识星球】LeNet5,AlexNet,VGG,MobileNet它们的前身都是什么,你知道吗?
  5. oracle rac11g更换存储,11g rac更换存储
  6. 希尔排序(C++版)
  7. SAP在Kubernetes上打造的Kyma到底是个什么东东
  8. 单片机c语言必背代码_【典藏】深度剖析单片机程序的运行(C程序版)
  9. Linux 系统应用编程——网络编程(常用命令解析)
  10. java学习(87):Interage包装类进制转换
  11. (王道408考研操作系统)第二章进程管理-第三节10:经典同步问题之哲学家进餐问题
  12. linq to entity 左联接 右连接 以及内连接写法的区别(转)
  13. 力扣1317.将整数转换为两个无零整数之和
  14. SQL Server数据库的导出
  15. [react-native]react-native填坑笔记
  16. python之常用快捷键
  17. Flea CodeForces - 32C (思维)
  18. Linux系统创建vlan教程,linux vlan配置详解
  19. bada-开发入门之HelloWorld(上)
  20. CodeForces - 55D UVALive - 6528

热门文章

  1. mysql快速迁移数据sql_使用Navicat Premium工具快速迁移数据方法 适用于mysql及mssql数据库...
  2. 无盘服务器2个dhcp,无盘 dhcp 服务器配置
  3. linux 安装包 在此作用域中尚未声明_Linux运行go项目报错:copy_file_range: bad file descriptor...
  4. python打印表格_使用 Python 打印漂亮的表格,这两项基本功你可会?
  5. 伯克利的电气工程和计算机科学专业,2021年加州大学伯克利分校电气工程与计算机科学专业入学要求高吗?...
  6. 智能车竞赛技术报告 | 单车拉力组 - 长春理工大学- 追风零队 2021
  7. 走火入魔 | 暑期电子设计课程学生们的作品
  8. 清华导学故事|卓晴:在每个人生阶段中,找到自己的定位
  9. 利用STM32F405RG制作pyBoard实验板
  10. mongodb索引生成HTML页面,MongoDB高级索引