http代理协议 以及 路由器利用redsocks2实现 http-connect 全局代理

本文共有3796个字,关键词:redsockshttp-connecthttp代理

http 代理协议

通过telnet 可以测试http代理协议的过程
http协议分两种方式直接GET和CONNECT隧道

直接get / post

telnet {{ip地址}} {{端口}}后输入
GET http://pch18.cn HTTP/1.0
可以得到页面返回信息,需要注意的是

  1. 用这种方式 GET 必须大写
  2. 网址必须http开头的完整网址 可以省略端口
  3. 末尾的HTTP/1.0 不能省略
  4. 后面和http协议一样会被转发过去
  5. 实际服务器收到的数据会被代理服务器添加上proxy相关的header信息
  6. header信息写入完成后,发送两个换行符, 代理端开始转发给服务器
  7. 代理端收到服务器返回信息后,输出到当前流
  8. 发送的文件头如果有 keep-alive 服务器返回后不会切断连接,可以继续发送GET开始的文件头接着代理使用
  9. 通过这个方法不能转发https的网页,https设计底层tcp操作需要用CONNECT隧道隧道,来完成原生的ssl握手过程

CONNECT隧道

telnet {{ip地址}} {{端口}}后输入
CONNECT pch18.cn:80
如果代理服务器和对方连接成功可以收到
HTTP/1.1 200 Connection established
接着使用http协议一样可以取出网页
GET /
Host: pch18.cn
需要注意的是

  1. CONNECT一定要大写
  2. 地址可以是域名或者ip,不可以是http开头的地址
  3. 必须携带端口号
  4. 连接成功后和对方服务器建立隧道连接可以直接通信
  5. 这种方式通信不会被代理服务器添加上proxy相关的header信息(推测,待验证)
  6. 对方服务器切段连接后代理服务器也会切段连接
  7. 通过这种方式和socks类似可以代理任意tcp协议,不能代理udp
  8. 若需要代理udp,可以通过ss封装做二次转发

路由器利用redsocks2实现http-connect全局代理

使用redsocks失败案例

梅林路由器opkg install redsocks顺利安装修改redsocks.confredsocks段内容

ip = 158.217.200.50;                                                    
port = 8080;                                                            
// known types: socks4, socks5, http-connect, http-relay                
type = http-connect;  

然后启动redsocks,再配置 iptables

iptables -t nat -N REDSOCKS
iptables -t nat -A REDSOCKS -o lo -j RETURN
iptables -t nat -A REDSOCKS -d 158.217.200.50 -j RETURN
iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-port 12345
iptables -t nat -I PREROUTING -p tcp -j REDSOCKS

不知为何一直不行,
同样方法用redsocksredsocks2k2popenwrt中实验成功,

使用redsocks2成功案例

之前尝试过在ac56s路由器上刷koolshare固件
插上ext4的u盘安装entware
利用opkg install redsocks来转发流量。
不过opkg安装的redsocks连接socks5代理似乎没问题,连接http-connect代理始终没法访问。
后来了解到https://github.com/semigodking/redsocksredsocks2的后续版本有做过过优化,决定尝试使用一下。
自己尝试编译没成功,之前安装过redsocks,依赖应该都在。
直接opkg install make后,在解压后的文件夹下make后。一
直卡在一大段代码下没反应(不是报错,很长的程序源码)。
后来也没找到可行的解决方案,不过在网上找到arm编译好的文件,直接拷贝到/koolshare/bin中使用,可以执行。

文件如下:redsocks2.tar

redsocks2执行的时候会读取自身目录下redsocks.conf的配置文件。
更改配置文件内容如下。

base {
    log_debug = off;
    log_info = off;
    daemon = on;
    log = "syslog:daemon";
    redirector = iptables;
}
redsocks {
    local_ip = 0.0.0.0;
    local_port = 12345;

    ip = 158.217.200.50;
    port = 8080;
    type = http-connect;

    // ip = 192.168.50.201;
    // port = 8017;
    // type = socks5;

    // known types: socks4, socks5, http-connect, http-relay
    // New types: direct, shadowsocks, https-connect
}

因为放在bin文件夹下,命令行直接输入redsocks2便可以直接执行。
接下来是iptables的配置

iptables -t nat -N REDSOCKS
iptables -t nat -A REDSOCKS -d 158.217.200.50/32 -j RETURN #代理服务器直连
iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 12345

iptables -t nat -A PREROUTING -i br0 -p tcp -j REDSOCKS

刚开始试了n遍搞得代理服务器也无法访问。
随后意识到 PREROUTING 中的 i 参数后面原本写的是lan-br。
应该是接口名称不对,换成本机的br0后成功。
尝试在 speedtest.net 下测试网速,挂系统的http代理网速可以达到300m,不挂代理用路由器转发,速度只有70m左右,
而且测速的时候,路由器cpu占用高达50%~75%。应该是路由器性能问题导致速度过慢。
考虑能不能再iptables 转发流量引到内网其他机器上,或者自己根据iptables的转发协议,自己写转发插件。

# iptables -t nat -A REDSOCKS -p tcp -dnat --to-destnation 
192.168.50.202:12345
# 路由性能低,转发速度低下,能不能转发到其他设备上去? 没尝试.

通过上面对iptables的操作,只是临时起效,即使不重启,过一会也会失效,原因不明。
在梅林固件里,把iptables的设置写到/jffs/scripts/wan-start中即可持久生效。
/jffs/scripts/中还有个nat-start不清楚这两个有啥区别,网上推荐是wan-start
建议把cd /koolshare/bin/ && ./redsocks2
追加到/jffs/scripts/wan-start/jffs/scripts/nat-start文件中

「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」

pch18

(๑>ڡ<)☆谢谢老板~

使用微信扫描二维码完成支付

版权声明:如无特别说明,本文为作者原创,如需转载须联系作者本人同意,未经作者本人同意不得擅自转载。
添加新评论
暂无评论