我正在尝试实现类似于提供的服务https://www.smartdnsproxy.com,客户端只需更改其 DNS 设置即可连接到 HTTP/S 或 SOCKS5 代理。我想我了解各个组件,但我无法将它们组合在一起。
为了实现我的目标,我需要向客户提供以下服务:
- DNS 服务器,我正在使用
dnsmasq
- SOCKS 代理,我正在使用
Dante
然后,一旦客户端将 DNS 设置为我的服务器并发送请求,目标就是发生以下情况:
- 用户执行 DNS 请求询问
example.com
- 我的 DNS 服务器响应“是的
<proxy-ip-address>
” - 然后,用户向代理的 IP 地址发送 HTTP/S 请求,例如
GET /about.html HTTP/1.1 Host: example.com
- 代理服务器处理传入的请求(可能在端口 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) 代理。