http
代理协议
通过telnet 可以测试http代理协议的过程
http协议分两种方式直接GET和CONNECT隧道
直接get / post
telnet {{ip地址}} {{端口}}后输入
GET http://pch18.cn HTTP/1.0
可以得到页面返回信息,需要注意的是
- 用这种方式 GET 必须大写
- 网址必须http开头的完整网址 可以省略端口
- 末尾的HTTP/1.0 不能省略
- 后面和http协议一样会被转发过去
- 实际服务器收到的数据会被代理服务器添加上proxy相关的header信息
- header信息写入完成后,发送两个换行符, 代理端开始转发给服务器
- 代理端收到服务器返回信息后,输出到当前流
- 发送的文件头如果有 keep-alive 服务器返回后不会切断连接,可以继续发送GET开始的文件头接着代理使用
- 通过这个方法不能转发https的网页,https设计底层tcp操作需要用CONNECT隧道隧道,来完成原生的ssl握手过程
CONNECT隧道
telnet {{ip地址}} {{端口}}后输入
CONNECT pch18.cn:80
如果代理服务器和对方连接成功可以收到
HTTP/1.1 200 Connection established
接着使用http协议一样可以取出网页
GET /
Host: pch18.cn
需要注意的是
- CONNECT一定要大写
- 地址可以是域名或者ip,不可以是http开头的地址
- 必须携带端口号
- 连接成功后和对方服务器建立隧道连接可以直接通信
- 这种方式通信不会被代理服务器添加上proxy相关的header信息(推测,待验证)
- 对方服务器切段连接后代理服务器也会切段连接
- 通过这种方式和socks类似可以代理任意tcp协议,不能代理udp
- 若需要代理udp,可以通过ss封装做二次转发
路由器利用redsocks2
实现http-connect
全局代理
使用redsocks
失败案例
梅林路由器opkg install redsocks
顺利安装修改redsocks.conf
中redsocks
段内容
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
不知为何一直不行,
同样方法用redsocks
非redsocks2
在k2p
的openwrt
中实验成功,
使用redsocks2
成功案例
之前尝试过在ac56s路由器
上刷koolshare固件
插上ext4的u盘
安装entware
后
利用opkg install redsocks
来转发流量。
不过opkg
安装的redsocks
连接socks5
代理似乎没问题,连接http-connect
代理始终没法访问。
后来了解到https://github.com/semigodking/redsocks
的redsocks2
的后续版本有做过过优化,决定尝试使用一下。
自己尝试编译没成功,之前安装过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 proxy.itc.kansai-u.ac.jp -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 -D PREROUTING -p tcp -j REDSOCKS
iptables -t nat -A OUTPUT -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
文件中