Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

当开启全部转发的时候,会产生很多自己转发给自己的请求,导致too many file 崩溃 #11

Open
Chanli520 opened this issue Feb 27, 2024 · 8 comments

Comments

@Chanli520
Copy link

问题描述

^[[1;0;32m2024/02/26 23:05:57 转发目标: 服务器IP:443^[[0m
^[[1;0;32m2024/02/26 23:05:57 连接来自: 服务器IP:54222^[[0m
^[[1;0;32m2024/02/26 23:05:57 转发目标: 服务器IP:443^[[0m
^[[1;0;32m2024/02/26 23:05:57 连接来自: 服务器IP:54222^[[0m
^[[1;0;32m2024/02/26 23:05:57 转发目标: 服务器IP:443^[[0m
^[[1;0;32m2024/02/26 23:05:57 连接来自: 服务器IP:54222^[[0m
^[[1;0;32m2024/02/26 23:05:57 转发目标: 服务器IP:443^[[0m
^[[1;0;32m2024/02/26 23:05:57 连接来自: 服务器IP:54222^[[0m
^[[1;0;31m2024/02/26 23:05:57 接受连接请求时出错: accept tcp [::]:443: accept4: too many open files^[[0m
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x30 pc=0x557721]

goroutine 6 [running]:
main.startSniProxy.func1({0x5c8ac0?, 0xc00000c198})
C:/Github/SNIProxy/main.go:110 +0x101
created by main.startSniProxy

软件版本

v1.0.0

附加截图

No response

@XIU2
Copy link
Owner

XIU2 commented Feb 27, 2024

自从写完这个工具后,我的服务器上一直运行着,也是开着 allow_all_hosts 的,没有遇到过这种情况。

你这个情况和 #1 类似,你这种情况肯定是有什么触发条件的,你是如何触发该问题的?难道运行后不访问也会这样?
你访问的是什么域名?域名解析的 IP 是什么?
假设因为某种原因导致 SNIProxy 接受连接时解析域名得到的 IP 正好是当前设备的服务器 IP,那么 SNIProxy 就会把数据转发给自身IP:443,因此也就陷入了死循环。

@zxzlf
Copy link

zxzlf commented Mar 4, 2024

自从写完这个工具后,我的服务器上一直运行着,也是开着 allow_all_hosts 的,没有遇到过这种情况。

你这个情况和 #1 类似,你这种情况肯定是有什么触发条件的,你是如何触发该问题的?难道运行后不访问也会这样? 你访问的是什么域名?域名解析的 IP 是什么? 假设因为某种原因导致 SNIProxy 接受连接时解析域名得到的 IP 正好是当前设备的服务器 IP,那么 SNIProxy 就会把数据转发给自身IP:443,因此也就陷入了死循环。

我猜他是在本机使用,hosts里地址写的就是127.0.0.1,因为我就是这么干的
这里有个问题是SNIProxy 解析域名用的是系统DNS,也就是说在本机使用会受到hosts的影响,这样就变成死循环了
如果要在本机使用,看起来得有办法指定SNIProxy 用来解析的DNS服务器才行

@XIU2
Copy link
Owner

XIU2 commented Mar 5, 2024

@zxzlf
这个工具代码很少,只实现了核心的功能用来自用,就四百来行,像 DNS 解析、缓存等自然是交给系统处理更省力,毕竟系统现成的不用白不用,也省得重复造轮子了,否则代码量可能需要翻倍。

而且我搞不懂,在服务器上开启 SNI 代理服务,然后在服务器上 hosts 将域名指向 127.0.0.1 是有什么作用么?
在服务器上访问 目标域名,解析为 127.0.0.1 指向本机的 SNI 代理服务,然后 SNIProxy 将其转发给目标域名的服务器(假设 SNIProxy 不使用系统 DNS 解析,不受 Hosts 影响的话),那这样岂不是多此一举?这和直接访问 目标域名 有什么区别?。。。

@xltzsoft
Copy link

image
main.go改成这样,自己编译一下即可解决

@pynne
Copy link

pynne commented Mar 15, 2024

@zxzlf 这个工具代码很少,只实现了核心的功能用来自用,就四百来行,像DNS解析、缓存等自然是排序系统处理成更省力,毕竟系统现的不用白不用,也省得重复造轮子了,不然代码量可能需要翻倍。

而且我搞不懂,在服务器上开启SNI代理服务,然后在服务器上hosts将域名指向127.0.0.1有什么作用呢?在服务器上 访问目标域名,解析为127.0.0.1指向本机的SNI代理服务,然后SNIProxy将其转发给目标域名的服务器(假设SNIProxy不使用系统DNS解析,不受主机影响的话),那这样岂不是多此一举?这和直接访问目标域名有什么区别?

指定独立dns解析服务器IP,可以防止dns污染。比如在本地假设一个dns解析服务器,很有必要,是否可以加一个dns函数解决。

@zxzlf
Copy link

zxzlf commented Mar 15, 2024

@zxzlf 这个工具代码很少,只实现了核心的功能用来自用,就四百来行,像 DNS 解析、缓存等自然是交给系统处理更省力,毕竟系统现成的不用白不用,也省得重复造轮子了,否则代码量可能需要翻倍。

而且我搞不懂,在服务器上开启 SNI 代理服务,然后在服务器上 hosts 将域名指向 127.0.0.1 是有什么作用么? 在服务器上访问 目标域名,解析为 127.0.0.1 指向本机的 SNI 代理服务,然后 SNIProxy 将其转发给目标域名的服务器(假设 SNIProxy 不使用系统 DNS 解析,不受 Hosts 影响的话),那这样岂不是多此一举?这和直接访问 目标域名 有什么区别?。。。

我本人的话大概是想实现一个本地的反向代理,以期绕过某些拦截(比如公司的网关或者steam、pixiv的那种屏蔽,类似于steamcommunity302那种功能),不过看起来好像并不能实现,我在另外找了一台局域网内的电脑做服务器以后,还是不能绕过去,远程返回的还是错误

@XIU2
Copy link
Owner

XIU2 commented Mar 16, 2024

@pynne
如果你在国外服务器上运行 SNIProxy,那么自然不用在乎 DNS 污染了。如果你是在国内服务器上运行 SNIProxy,那么就算获得了正确 IP,程序也无法访问到目标网站(即国外被污染阻断的域名)。
所以说,你提的需求意义不大。


@zxzlf
你能这样折腾,说明你没明白 steamcommunity302 等工具的工作原理是什么。
这些工具虽然也是建立一个本地的 SNI 反向代理,但和本项目不同的是,它们需要解密 SSL(所以需要自签根证书并添加系统信任,再用根证书来自签域名证书),来置空 SNI,并把域名信息添加到头部数据中 host: xxx.xxx 字段,这样一些没有使用 CDN 的(很多 CDN 不支持这样干,比如 Cloudflare)网站就会通过头部 host 字段来获知你要访问的到底是那个网站(域名)。

这种技术有个专有名词,叫做 域前置

以前也有人像你一样问过这种问题: #2 #7

@XIU2
Copy link
Owner

XIU2 commented Apr 1, 2024

系统服务配置文件里我忘记加上用于守护进程的配置项了(Restart=on-failure),因此在 SNIProxy 服务异常退出后,没有自动恢复启动,修改下服务配置文件加上这个试试。这样对于一些小概率报错引起的异常退出,也不用担心来不及恢复了。
# Linux 配置为系统服务 (systemd - 以支持开机启动、守护进程等)

@XIU2 XIU2 mentioned this issue Apr 1, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants