DNS 上的 SOCKS 代理

DNS 上的 SOCKS 代理

我正在尝试实现类似于提供的服务https://www.smartdnsproxy.com,客户端只需更改其 DNS 设置即可连接到 HTTP/S 或 SOCKS5 代理。我想我了解各个组件,但我无法将它们组合在一起。

为了实现我的目标,我需要向客户提供以下服务:

  • DNS 服务器,我正在使用dnsmasq
  • SOCKS 代理,我正在使用Dante

然后,一旦客户端将 DNS 设置为我的服务器并发送请求,目标就是发生以下情况:

  1. 用户执行 DNS 请求询问example.com
  2. 我的 DNS 服务器响应“是的<proxy-ip-address>
  3. 然后,用户向代理的 IP 地址发送 HTTP/S 请求,例如
    GET /about.html HTTP/1.1
    Host: example.com
    
  4. 代理服务器处理传入的请求(可能在端口 80 或 443)并将结果返回给客户端

我能够设置这两项服务,它们似乎可以独立运行。我已配置dnsmasq为使用代理的 IP 地址解析所有域,并且可以很好地设置客户端。我已配置dante为监听端口 1080,并且可以验证客户端是否可以使用代理,并使用方便的socksify工具进行测试。

然后,为了将来自 HTTP/S 端口的传入请求转发到代理本身,我使用以下 IPTABLES 规则:

#!/bin/bash
# Create new chain
iptables -t nat -N SOCKSPROXY

# Ignore LANs and some other reserved addresses.
iptables -t nat -A SOCKSPROXY -d 0.0.0.0/8 -j RETURN
iptables -t nat -A SOCKSPROXY -d 10.0.0.0/8 -j RETURN
iptables -t nat -A SOCKSPROXY -d 127.0.0.0/8 -j RETURN
iptables -t nat -A SOCKSPROXY -d 169.254.0.0/16 -j RETURN
iptables -t nat -A SOCKSPROXY -d 172.16.0.0/12 -j RETURN
iptables -t nat -A SOCKSPROXY -d 192.168.0.0/16 -j RETURN
iptables -t nat -A SOCKSPROXY -d 224.0.0.0/4 -j RETURN
iptables -t nat -A SOCKSPROXY -d 240.0.0.0/4 -j RETURN

# Anything else should be redirected to port 1080
iptables -t nat -A SOCKSPROXY -p tcp -j REDIRECT --to-ports 1080

# Any tcp connection made by our user should be redirected
iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner $USER -j SOCKSPROXY

# Accept all HTTP and HTTPS connections
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -j ACCEPT

但是我看到了连接被拒绝的错误。iptables 是将传入连接转发到代理服务器的正确方法吗?如果是,我遗漏了什么?

答案1

它比看上去要复杂一些。SOCKS 是一种单独的协议(二进制),它与 HTTP 不同。当浏览器向 Dante 发送 HTTP 请求时 - Dante 期望协议是 socks - 而不是 HTTP - 因此它会断开连接。

为了让浏览器使用 SOCKS(如果支持),应该隐式配置它以使用 socks 代理。如果您只想通过 DNS 配置来执行此操作,则必须设置透明 HTTP(s) 代理。需要进行额外配置才能支持 80 以外的端口(实际上是所有 tcp 端口)。

你还必须支持其他协议(不仅仅是 HTTP),因此你的服务器应该充当网关并进行流量转发。

配置 HTTPS 将会很棘手 - 因为您的 SSL 证书与原始服务器证书不同,并且它应该得到浏览器的信任。

看一眼乌贼例如代理 - 它支持透明 HTTP(s) 代理。

相关内容