smartdns icon indicating copy to clipboard operation
smartdns copied to clipboard

能否增加个使用代理服务器请求上游的功能?

Open wutongskype opened this issue 2 years ago • 37 comments

建议的方案 增加一个可以使用socks5的功能 比如加个参数 server-https https://cloudflare-dns.com/dns-query --proxy socks5://user:[email protected]:1080 server-tls 8.8.8.8:853 --proxy http://user:[email protected]:1080 server-tcp 8.8.8.8:53 --proxy socks5://user:[email protected]:1080 server 8.8.8.8:53 -blacklist-ip -group g1 --proxy socks5://user:[email protected]:1080

wutongskype avatar May 13 '22 12:05 wutongskype

如何连接至上游取决于设备自身联网方式。建议通过系统路由表和透明代理实现这个

PikuZheng avatar May 13 '22 13:05 PikuZheng

公共代理都找不到稳定的吧,并且也可能不好用,直接使用TLS有什么情况用不了

pymumu avatar May 15 '22 11:05 pymumu

公共代理都找不到稳定的吧,并且也可能不好用,直接使用TLS有什么情况用不了

代理隧道当然是自建了, 直接用公共DNS 比如1.1.1.1 8.8.8.8 这种CF 和谷狗的基本上都给墙了,CF的可能偶尔能用,但是谷狗的基本上国内就无法正常使用, 还有就是1.1.1.1这种如果直连使用都是绕到美国去了, 解析出来的IP也是怪怪的还不如翻墙软件上直接远程解析算了,或者路由器上用dns2socks远程解析. 比如我香港的VPS走代理隧道从1.1.1.1解析给的IP地址也是香港的, 如果直连1.1.1.1 解析给的IP地址反而是美国落三基或者其他地方的.就不是香港的了.

wutongskype avatar May 15 '22 11:05 wutongskype

看有多少人需要这个功能吧

pymumu avatar May 15 '22 12:05 pymumu

+1 用代理还有个好处就是境外站点不用考虑 ECS 了,8.8.8.8, 1.1.1.1 这些公共服务器会根据代理服务器的地址按最优解析。

rampageX avatar May 15 '22 13:05 rampageX

+1 用代理还有个好处就是境外站点不用考虑 ECS 了,8.8.8.8, 1.1.1.1 这些公共服务器会根据代理服务器的地址按最优解析。

ecs是为了解决代理服务器地理位置识别不准的问题(由于很多代理都是广播ip)。 我个人还是倾向smartdns只管做好解析,至于系统自身联网(或分流)方式不要去管。

PikuZheng avatar May 15 '22 13:05 PikuZheng

+1 用代理还有个好处就是境外站点不用考虑 ECS 了,8.8.8.8, 1.1.1.1 这些公共服务器会根据代理服务器的地址按最优解析。

ecs是为了解决代理服务器地理位置识别不准的问题(由于很多代理都是广播ip)。 我个人还是倾向smartdns只管做好解析,至于系统自身联网(或分流)方式不要去管。

我认为smartDNS对其他DNS程序的优势, 就是能对解析出来的ip进行测速和优选, 反而让系统负责分流让这功能失效了; 现情况是: 走ping无法测被墙IP, 走TCPping如果透明代理情况下会被劫持到本地,测速数据无参考价值 当然对于纯国内解析或者直连解析到不影响此功能的有效性

另外我觉得让系统分流还是有局限性, 长远来看能走代理通道的DNS程序都基本上活的比较长, 如果N年以后你们不维护了, 墙或者出了新招, 起码套个socks5还能凑活用. PS: 我目前有台电脑还在使用Pcap_DNSProxy > https://github.com/chinaniupai/Pcap_DNSProxy 这货虽然作者删库跑路了, 但是此程序的国内外分流解析我觉得是做的最好的(之一), 虽然不支持最新的协议, 会被墙封锁, 但是起码经过特殊设置后 套个socks5代理还能凑活用

所以建议还是加个给 公共DNS使用代理的功能 另外再添加个HTTPping这种能走代理通道的测速模式

wutongskype avatar May 15 '22 13:05 wutongskype

走TCPping如果透明代理情况下会被劫持到本地

这里是我没理解。我用的ss,这块是没有问题的。刚查了一下v2ray用tcp ping会因为空连接报错。passwall(似乎是为了解决这个问题)对ping做了抢答(也就是ping 永远通)。虽然这个动作是程序本意,但我认为这是passwall带来的问题,没有“忠实的”传递数据报本身。passwall应该有个开关来控制这个问题。

参考#602 #624

PikuZheng avatar May 16 '22 00:05 PikuZheng

走TCPping如果透明代理情况下会被劫持到本地

这里是我没理解。我用的ss,这块是没有问题的。刚查了一下v2ray用tcp ping会因为空连接报错。passwall(似乎是为了解决这个问题)对ping做了抢答(也就是ping 永远通)。虽然这个动作是程序本意,但我认为这是passwall带来的问题,没有“忠实的”传递数据报本身。passwall应该有个开关来控制这个问题。

参考#602 #624

**是的应该是PW的问题, PW上我试过几乎所有的选项, 只要开启PW它, 它就给TCPping抢答了~_~ 导致SmartDNS用TCPping测速出来的结果失真, #602 #624这俩兄弟表达的意思跟俺也差不多. 我也是建议增加个更靠谱的测速方式比如用curl 某网站 测出返回200代码的时间, 可以参考这个命令:

下面这个是一条命令: github这个文档编辑真是醉了

curl -sIL --resolve www.youtube.com:443:142.250.207.78 https://www.youtube.com -w " 状态码:%{http_code}\n 请求总用时:%{time_total}\n 解析时间:%{time_namelookup}\n " -o /dev/null --connect-timeout 10 --verbose -x socks5://192.168.1.94:10800

这个是解释:

     --resolve [解析的域名]:[port]:[要测试的IP]
    https://www.youtube.com [对应上面解析的域名]
    -w " 状态码:%{http_code}\n 请求总用时:%{time_total}\n 解析时间:%{time_namelookup}\n " [这个是单独列出来所用时间]
    -x socks5://192.168.1.94:10800` [这个是测试时使用的代理服务器,这样测速就走代理了]

另外还是建议给上游服务器添加个使用socks的功能, 类似https://github.com/IrineSistiana/mosdns/wiki/Plugin#%E8%BD%AC%E5%8F%91%E8%AF%B7%E6%B1%82 https://github.com/IrineSistiana/mosdns-cn image 类似这种样子, 上面也给了更多示例 tls://8.8.8.8?socks5=127.0.0.1:1080 https://dns.google/dns-query?socks5=127.0.0.1:1080

PS: 这个Issues和我另外一个 https://github.com/pymumu/smartdns/issues/929 有点闹混了...

wutongskype avatar May 16 '22 10:05 wutongskype

建议的方案 增加一个可以使用socks5的功能 比如加个参数 server-https https://cloudflare-dns.com/dns-query --proxy socks5://user:[email protected]:1080 server-tls 8.8.8.8:853 --proxy http://user:[email protected]:1080 server-tcp 8.8.8.8:53 --proxy socks5://user:[email protected]:1080 server 8.8.8.8:53 -blacklist-ip -group g1 --proxy socks5://user:[email protected]:1080

个人也感觉这个很有用的功能,这样还能实现不同的国外dns走不同代理去连接,稳定而灵活。

hpcex avatar May 16 '22 11:05 hpcex

没必要 代理不是dns本身功能 可以套passwall之类的分流国外tcp流量 dns做好自己的事情就行了

openips avatar May 24 '22 02:05 openips

这个功能加上之后 可以预见的是sock会不慢慢不何用 会需要套v2ray之类的客户端才能满足要求 跑题有点太多了

openips avatar May 24 '22 02:05 openips

建议的方案 增加一个可以使用socks5的功能 比如加个参数 server-https https://cloudflare-dns.com/dns-query --proxy socks5://user:[email protected]:1080 server-tls 8.8.8.8:853 --proxy http://user:[email protected]:1080 server-tcp 8.8.8.8:53 --proxy socks5://user:[email protected]:1080 server 8.8.8.8:53 -blacklist-ip -group g1 --proxy socks5://user:[email protected]:1080

个人也感觉这个很有用的功能,这样还能实现不同的国外dns走不同代理去连接,稳定而灵活。

代理客户端都有代理本机的功能,没必要单独套一个socks5

InspoOnU avatar May 25 '22 06:05 InspoOnU

看有多少人需要这个功能吧

非常需要这个功能。最近在使用国外的dns解析的时候,有时候会出现无法访问的情况,国内在访问国外这些DNS时还是非常有可能会被干扰的吧。因为我路由器上运行了Clash,Clash虽然代理了局域网设备的流量但是没有代理路由器本身的流量。所以SmartDNS的流量就不会走代理,如果可以在SmartDNS中设置某个或者某组上游DNS服务器通过Clash 在本地开启的 http/socks 代理就非常棒了👍

lemoeo avatar May 29 '22 03:05 lemoeo

建议的方案 增加一个可以使用socks5的功能 比如加个参数 server-https https://cloudflare-dns.com/dns-query --proxy socks5://user:[email protected]:1080 server-tls 8.8.8.8:853 --proxy http://user:[email protected]:1080 server-tcp 8.8.8.8:53 --proxy socks5://user:[email protected]:1080 server 8.8.8.8:53 -blacklist-ip -group g1 --proxy socks5://user:[email protected]:1080

个人也感觉这个很有用的功能,这样还能实现不同的国外dns走不同代理去连接,稳定而灵活。

代理客户端都有代理本机的功能,没必要单独套一个socks5

代理本机好像是有这个功能,但是好像不是所有设备都容易实现。比如我用的ShellClash,在小米路由器的官方系统就不能开启本机代理功能。

lemoeo avatar May 29 '22 03:05 lemoeo

看有多少人需要这个功能吧

非常需要这个功能。最近在使用国外的dns解析的时候,有时候会出现无法访问的情况,国内在访问国外这些DNS时还是非常有可能会被干扰的吧。因为我路由器上运行了Clash,Clash虽然代理了局域网设备的流量但是没有代理路由器本身的流量。所以SmartDNS的流量就不会走代理,如果可以在SmartDNS中设置某个或者某组上游DNS服务器通过Clash 在本地开启的 http/socks 代理就非常棒了👍

没用对clash 国外的dns用tcp的 clash代理国外tcp就可以了 这个功能没必要

openips avatar May 29 '22 03:05 openips

@openips 因为我是在路由器上安装的clash来透明代理,clash内置dns国外用的 dot 和 doh,但是clash的内置dns并没有走自己的代理,而是直连的。我这里只有tls://8.8.4.4 和 opendns 的 doh 可以用,tls://1.1.1.1 和 tls://8.8.8.8 是用不了的。

lemoeo avatar May 30 '22 10:05 lemoeo

@lemoeo 我用的也是clash分流smartdns完全没有问题 把国外的dns到付放到一组就可以通个节点代理解析

openips avatar May 30 '22 10:05 openips

@openips 请问需要什么特别配置吗?我现在是通过iptables在OUTPUT链上将除了Clash的流量转发到Clash的端口,实现路由器本机的代理,然后SmartDNS请求上游的国外公开DNS就可以通过代理去解析了。

lemoeo avatar May 30 '22 12:05 lemoeo

@lemoeo clash本来就有dns劫持和分流了 我是建了两个smartdns分组 一个国内 一个国外 国外分组的dns都是tcp协议的 两个端口不一样 clash的nameserver配置为smartdns的国内分组端口 fallback配置为国外分组端口 完美解决

openips avatar May 30 '22 12:05 openips

其实,没必要增加代理功能。 网络结构,DNS是没法掌控的。 想让DNS走代理,很容易的,IP分流就行了。

cresky-github avatar Jul 01 '22 22:07 cresky-github

其实,没必要增加代理功能。 网络结构,DNS是没法掌控的。 想让DNS走代理,很容易的,IP分流就行了。

我已经换软件用了,mosdns那边就支持给dns上游设置socks5代理,还能用geoip规则分流,去广告什么的。这边居然还在纠结要不要搞代理。。。

wutongskype avatar Jul 02 '22 02:07 wutongskype

其实,没必要增加代理功能。 网络结构,DNS是没法掌控的。 想让DNS走代理,很容易的,IP分流就行了。

我已经换软件用了,mosdns那边就支持给dns上游设置socks5代理,还能用geoip规则分流,去广告什么的。这边居然还在纠结要不要搞代理。。。

是的。 按IP分流,当用8888时,就会走代理。当用223时,直连。

cresky-github avatar Jul 02 '22 03:07 cresky-github

其实,没必要增加代理功能。 网络结构,DNS是没法掌控的。 想让DNS走代理,很容易的,IP分流就行了。

我已经换软件用了,mosdns那边就支持给dns上游设置socks5代理,还能用geoip规则分流,去广告什么的。这边居然还在纠结要不要搞代理。。。

老哥,可以分享一下你的mosdns配置吗?我的需求和你非常相似,就是出国留学的dns上游要走socks5代理和geoip分流

我不知为什么,我的路由器上iptables做透明代理,局域网的机器可以生效,但是路由器自身的流量无法生效,看了很多教程都是在nat的output链上redirect就可以代理本机的tcp流量,但是我这上面就是不行,所以smartdns对海外的测速和dns查询我这就不能走代理,没办法,折腾了好久,只能试试你说的mosdns了

faajaudai avatar Aug 31 '22 12:08 faajaudai

我不知为什么,我的路由器上iptables做透明代理,局域网的机器可以生效,但是路由器自身的流量无法生效,看了很多教程都是在nat的output链上redirect就可以代理本机的tcp流量,但是我这上面就是不行,所以smartdns对海外的测速和dns查询我这就不能走代理,没办法,折腾了好久,只能试试你说的mosdns了

究竟是socks5还是透明代理,socks5需要在iptables的output链(不是nat链)做重定向。透明代理需要在软件的“代理自身”配置

PikuZheng avatar Aug 31 '22 13:08 PikuZheng

go的组件比较完善很容易支持,c的话缺少现成组件,有不少开发工作量。 直接用http的DNS协议,大部分都能正常工作,这块诉求其实不那么强烈。 后面看情况支持吧。

pymumu avatar Aug 31 '22 14:08 pymumu

我不知为什么,我的路由器上iptables做透明代理,局域网的机器可以生效,但是路由器自身的流量无法生效,看了很多教程都是在nat的output链上redirect就可以代理本机的tcp流量,但是我这上面就是不行,所以smartdns对海外的测速和dns查询我这就不能走代理,没办法,折腾了好久,只能试试你说的mosdns了

究竟是socks5还是透明代理,socks5需要在iptables的output链(不是nat链)做重定向。透明代理需要在软件的“代理自身”配置

我是同时在路由上起了ss-local以及ss-redir,ss-local提供socks代理,ss-redir提供透明代理 ss-redir监听0.0.0.0:1081,ss-local监听0.0.0.0:1080 然后nat表的PREROUTING链匹配ipset然后redirect去1081端口,可以正常实现局域网内其他主机tcp流量的透明代理 然后预期是在nat表的OUTPUT链也去匹配ipset然后redirect去1081端口,实现路由器自身tcp流量的透明代理 然而目前并没有如预期所愿可以透明代理路由器自身流量,我看了很多篇透明代理教程都是这样实现的,方法上应该没问题 这个问题我怀疑是固件的锅,我的是红米的AC2100官方固件,目前我也没有能力去deubg解决这个问题 我所能调试出来的是,我触发需要走代理的流量后,查看iptables里的相应规则的计数,确实有增加,理应在output链上redirect去了1081端口 但是监听1081端口的程序,确实也没有看到有流量进来,无论是ss-redir的日志,还是我重新了起了一个tcpsvd去监听1081端口,确实没有现有触发相关的流量访问记录,所以我只能怀疑是固件的锅

所以目前面临的问题是,我没办法把路由器上自身的流量跑透明代理,也就无法使smartdns可以正常访问8.8.8.8这样的境外dns,以及可以经过代理去对境外网站做tcp-ping之类的测速,所以有点无奈 另外你说的“socks5需要在iptables的output链(不是nat链)做重定向”,我觉得应该不是很正确,以我的理解,经过iptables后的流量,不是socks代理服务器可以正常处理的数据,应该还要套一层ip2socks之类的软件。我这里的问题不是到底是socks还是透明代理的问题,而是iptables不能在output链上正确处理重定向数据,在iptables靠不住的情况下,所以只能寻求smartdns这一类负责分流以及forward dns的软件可以自身支持socks代理,才能够把境外流量正确地跑代理出去。

当然我明白这确实是小众需求,因为这是固件、系统带来的bug,正常来说这个需求很少发生。

faajaudai avatar Sep 01 '22 14:09 faajaudai

预期是在nat表的OUTPUT链也去匹配ipset然后redirect去1081端口,实现路由器自身tcp流量的透明代理

查了一下这个方法是正确的。比较了一下我的shadowsocks在”代理自身:直接连接“和”代理自身:全部代理“的区别,发现iptables多了以下三行:

-A OUTPUT -p tcp -j SS_SPEC_WAN_DG
-A SS_SPEC_WAN_DG -m set --match-set ss_spec_dst_sp dst -j RETURN
-A SS_SPEC_WAN_DG -p tcp -j SS_SPEC_WAN_FW

其中ss_spec_dst_sp是排除列表。所以如果匹配了且不生效,需要查一下目标ip是不是在这个表里

然后我试了

iptables -t nat -A OUTPUT -p tcp -d 123.129.227.17 -j REDIRECT --to-ports 12340

然后wget http://myip.ipip.net/index.html (其中12340是我sslocal监听端口,123.129.227.17对应myip.ipip.net解析出的地址) 查看index.html内容,的确是从代理出去了

PikuZheng avatar Sep 01 '22 14:09 PikuZheng

预期是在nat表的OUTPUT链也去匹配ipset然后redirect去1081端口,实现路由器自身tcp流量的透明代理

查了一下这个方法是正确的。比较了一下我的shadowsocks在”代理自身:直接连接“和”代理自身:全部代理“的区别,发现iptables多了以下三行:

-A OUTPUT -p tcp -j SS_SPEC_WAN_DG
-A SS_SPEC_WAN_DG -m set --match-set ss_spec_dst_sp dst -j RETURN
-A SS_SPEC_WAN_DG -p tcp -j SS_SPEC_WAN_FW

其中ss_spec_dst_sp是排除列表。所以如果匹配了且不生效,需要查一下目标ip是不是在这个表里

然后我试了

iptables -t nat -A OUTPUT -p tcp -d 123.129.227.17 -j REDIRECT --to-ports 12340

然后wget http://myip.ipip.net/index.html (其中12340是我sslocal监听端口,123.129.227.17对应myip.ipip.net解析出的地址) 查看index.html内容,的确是从代理出去了

我这边应该不是iptables设置导致的问题,我有点怀疑是sysctl里那些内核参数的问题,但这块我不懂。 其实我在OUTPUT链上的操作也很简单 iptables -t nat -A OUTPUT -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-ports 1081 我是想只要触发了这个重定向规则,至少监听1081的程序应该能看到相关的请求信息才对,但我目前的测试是感觉根本没有相关的请求被传进去监控程序。 你说的相关白名单设置我也检查过,应该没问题,因为局域网里其他机器上也是可以正常走ss-redir出去的。

至于socks直接在OUTPUT重定向,我还是保留意见,其实可以这样想 如果直接重定向到ss-local就可以的话,那为什么还要有搞一个ss-redir出来 ss-redir和v2ray的Dokodemo-door,以及redsocks、ipt2socks这一类,应该都是为了处理iptables的流量而开发出来的 我自己也去虚拟机做了一个测试,如图

ss

我用ss-local监听1080,在OUTPUT链转发目的端口为80的数据到1080的(我的ss服务器端口不是80所以不受影响) sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-ports 1080 在这个情况下直接curl google.com,是empty reply, 当显式在curl里加代理访问的时候 curl -x socks5://127.0.0.1:1080 google.com ,才正确返回301 moved

faajaudai avatar Sep 01 '22 16:09 faajaudai

至于socks直接在OUTPUT重定向

这里是我搞错了,我是Mikrotik重度用户,Mikrotik没有s5客户端,就是用redirect处理。

其实我在OUTPUT链上的操作也很简单 iptables -t nat -A OUTPUT -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-ports 1081 我是想只要触发了这个重定向规则,至少监听1081的程序应该能看到相关的请求信息才对,但我目前的测试是感觉根本没有相关的请求被传进去监控程序。

有没有查看过完整的iptables结果是什么?由于iptables是按顺序执行的,可能有其他行先于本条做出了其他处理?

PikuZheng avatar Sep 02 '22 00:09 PikuZheng