This repository has been archived by the owner on Mar 17, 2024. It is now read-only.
关于proxy protocol #51
e1732a364fed
started this conversation in
General
Replies: 3 comments
-
在 v1.2.0-beta.2 支持了 回落时使用 PROXY protocol |
Beta Was this translation helpful? Give feedback.
0 replies
-
关于 PROXY protocol 回落的测试 建立nginx
set_real_ip_from 填写你的verysimple的网段 或者 具体ip 运行后,nginx 就会在返回响应 的 header 中 显示 "yourip" 和 "yourport", 进行比对就可确认 PROXY protocol确实生效。 这个 proxy_set_header 的两行命令 用于 nginx到 监听 纯http的 的进一步转发,不一定用到,如果nginx内部还需要回落到其他位置的话,则可填写。 |
Beta Was this translation helpful? Give feedback.
0 replies
-
对verysimple 的 PROXY protocol 监听的测试 所需的 nginx的配置
把 192.168.1.123:10080 改为你 verysimple 所监听的 内网地址 |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
有人提议 支持 proxy protocol,那我就研究一下
用途
PROXY protocol主要用于 nginx或者 docker 等 反向代理的情况,有些应用需要获取用户的真实ip。
所以回落使用 PROXY protocol 是一项很有实际意义的 功能。
比如获取访问者的ip,如果访问者 多次尝试错误密码,就封杀该ip;如果你不用PROXY protocol,那就把 verysimple的ip给封杀了,那就会很尴尬
协议
据悉,proxy protocol 是 HAProxy 发起的。
https://www.haproxy.com/blog/haproxy/proxy-protocol/
http://www.haproxy.org/download/1.8/doc/proxy-protocol.txt
因为实际用途中和nginx有较大关系,所以也要看nginx文档
https://docs.nginx.com/nginx/admin-guide/load-balancer/using-proxy-protocol/
中文博客参考 https://www.jianshu.com/p/cc8d592582c9
proxy protocol 似乎很简单,就是加一个头部
类似
PROXY TCP4 1.1.1.2 2.2.2.2 12345 80\r\n
这叫做 Human-readable header format (Version 1)
还有一种 Binary header format (version 2)
总之看协议规范的 2.1 和 2.2 部分 即可。
v2ray的实现
我们首先学习一下 v2ray是如何实现的。
在v2ray中搜索
PROXY
, 得到vless 这种代理层协议为什么也会写入PROXY protocol呢?
仔细分析,发现它是专门用于回落的情况。在 v2fly.org 搜索 xver,可以找到,tcp和ws都可以设置 acceptProxyProtocol,然后 vless和trojan的回落 是设置 xver。
之所以回落需要 PROXY protocol, 是因为,回落 会从v2ray 转发到 服务器程序,如果没有 PROXY protocol 的话,服务器程序会以为 客户端的 实际ip 是 v2ray的ip。 所以如果不回落 而 转发到 direct 的话 ,是用不到 PROXY protocol的。
继续搜索
AcceptProxyProtocol
, 发现 transport/internet/system_listener.go 比较重要它引用了一个外部包,
github.com/pires/go-proxyproto
原来,v2ray在基本的system_listener.go 里 设置了这一项,然后其他包 如 tcp,ws等包,都会调用到 这里。
而在回落时,因为需要 替 “客户端数据” 提前写好 proxy protocol 的头部,所以才会在 代理层部分的代码 里写。这个也是v2ray的架构特点造成的。 本作是不需要在 代理层的代码中 操作 proxy protocol的。
另外就是,v2ray的配置文件的架构也不完美,ws/grpc等高级层的配置 都包含 proxy protocol这种 传输层头 的配置,这个不够科学。
而且理论上 这个 proxy protocol 也不属于 sockopt,不应放入 sockopt 配置中。
Beta Was this translation helpful? Give feedback.
All reactions