我想设置一个 Linux (mint/ubuntu) 客户端,使用 Redoscks 将所有 TCP 和 UDP 连接传递到运行 Dante 的 SOCKS5 代理服务器,在单个端口上,通过企业代理传递。到目前为止,我已成功在家中重定向 HTTP/HTTPS(因此中间没有限制性企业代理),并且测试似乎显示使用 UDP 部分成功。我想确保完整的 TCP 和 UDP 重定向,以便所有服务(如 ntp)都可以运行。DNS 请求重定向也很好。
dante 配置文件如下,设置为允许 udp 关联,并进行基本用户身份验证。
# /etc/danted.conf
logoutput: syslog
user.privileged: root
user.unprivileged: nobody
internal: veth0 port=1080
external: veth0
socksmethod: username
clientmethod: none
# Rules
client pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
log: error connect disconnect
}
client block {
from: 0.0.0.0/0 to: 0.0.0.0/0
log: connect error
}
socks pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
command: bind connect udpassociate
log: error connect disconnect
socksmethod: username
}
socks block {
from: 0.0.0.0/0 to: 0.0.0.0/0
log: connect error
}
socks pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
command: bindreply udpreply
log: error # connect disconnect iooperation
}
为了清洁起见,我从模板中汲取灵感,我不太明白需要客户端块和袜子块规则。如果注释掉它们似乎不会改变任何东西。我也不明白为什么要放回去socksmethod:用户名如果全局定义,则在 socks pass 规则中。将其注释掉不会产生任何效果。
在客户端,redsocks 配置文件内容如下
base {
log_debug = off;
log_info = on;
log = "syslog:daemon";
daemon = on;
user = redsocks;
group = redsocks;
redirector = iptables;
}
redsocks {
local_ip = 127.0.0.1;
local_port = 12345;
ip = myproxyserverIP;
port = 1080;
type = socks5;
login = myproxyuser;
password = myproxypassword;
}
redudp {
local_ip = 127.0.0.1;
local_port = 12345;
ip = myproxyserverip;
port = 1080;
login = myproxyuser;
password = myproxypassword;
dest_ip = 8.8.8.8;
dest_port = 53;
udp_timeout = 30;
udp_timeout_stream = 180;
}
dnstc {
// fake and really dumb DNS server that returns "truncated answer" to
// every query via UDP, RFC-compliant resolver should repeat same query
// via TCP in this case.
local_ip = 127.0.0.1;
local_port = 5300;
}
然后我使用 iptables 将 80 和 443 重定向到 redsocks,无论是 TCP 还是 UDP。我还为 iperf 测试服务器添加了 UDP 5002。
*nat
:PREROUTING ACCEPT [26:3850]
:INPUT ACCEPT [2:178]
:OUTPUT ACCEPT [8:3456]
:POSTROUTING ACCEPT [10:6452]
:REDSOCKS - [0:0]
-A PREROUTING -p tcp -m tcp --dport 443 -j REDSOCKS
-A PREROUTING -p tcp -m tcp --dport 80 -j REDSOCKS
-A PREROUTING -p udp -m udp --dport 443 -j REDSOCKS
-A PREROUTING -p udp -m udp --dport 80 -j REDSOCKS
-A PREROUTING -p udp -m udp --dport 5002 -j REDSOCKS
-A OUTPUT -p tcp -m tcp --dport 443 -j REDSOCKS
-A OUTPUT -p tcp -m tcp --dport 80 -j REDSOCKS
-A OUTPUT -p udp -m udp --dport 443 -j REDSOCKS
-A OUTPUT -p udp -m udp --dport 80 -j REDSOCKS
-A OUTPUT -p udp -m udp --dport 5002 -j REDSOCKS
-A REDSOCKS -d 0.0.0.0/8 -j RETURN
-A REDSOCKS -d 10.0.0.0/8 -j RETURN
-A REDSOCKS -d 127.0.0.0/8 -j RETURN
-A REDSOCKS -d 169.254.0.0/16 -j RETURN
-A REDSOCKS -d 172.16.0.0/12 -j RETURN
-A REDSOCKS -d 192.168.0.0/16 -j RETURN
-A REDSOCKS -d 224.0.0.0/4 -j RETURN
-A REDSOCKS -d 240.0.0.0/4 -j RETURN
-A REDSOCKS -p tcp -j REDIRECT --to-ports 12345
-A REDSOCKS -p udp -j REDIRECT --to-ports 12345
COMMIT
*filter
:INPUT ACCEPT [4510:4209873]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [6689:7022488]
COMMIT
从那时起,它似乎就起作用了。如果我
curl ifconfig.co
我得到了代理服务器地址。
如果我尝试测试 udp 连接,
iperf -c speedtest.serverius.net -u -p 5002
并尝试查看活动的 UDP 连接(尽管是无状态的)
ss -u -pa
我看到有一个到我的代理服务器的 udp 连接,尽管它们报告在端口 48066 和 48610,而不是 1080。我还看到一个到 serverius 测试服务器的直接连接,端口指示为 rfe?有人能给我解释一下吗?
如果我尝试更粗暴一点,并告诉 iptables 路由所有流量,什么都行不通了,我什么都无法连接。我一定是做错了什么。
*nat
:PREROUTING ACCEPT [26:3850]
:INPUT ACCEPT [2:178]
:OUTPUT ACCEPT [8:3456]
:POSTROUTING ACCEPT [10:6452]
:REDSOCKS - [0:0]
-A PREROUTING -p tcp -m tcp -j REDSOCKS
-A PREROUTING -p udp -m udp -j REDSOCKS
-A OUTPUT -p tcp -m tcp -j REDSOCKS
-A OUTPUT -p udp -m udp -j REDSOCKS
-A REDSOCKS -d 0.0.0.0/8 -j RETURN
-A REDSOCKS -d 10.0.0.0/8 -j RETURN
-A REDSOCKS -d 127.0.0.0/8 -j RETURN
-A REDSOCKS -d 169.254.0.0/16 -j RETURN
-A REDSOCKS -d 172.16.0.0/12 -j RETURN
-A REDSOCKS -d 192.168.0.0/16 -j RETURN
-A REDSOCKS -d 224.0.0.0/4 -j RETURN
-A REDSOCKS -d 240.0.0.0/4 -j RETURN
-A REDSOCKS -p tcp -j REDIRECT --to-ports 12345
-A REDSOCKS -p udp -j REDIRECT --to-ports 12345
COMMIT
*filter
:INPUT ACCEPT [4510:4209873]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [6689:7022488]
COMMIT
非常感谢您的帮助,我的大脑快要融化了:p谢谢您,尼古拉斯
答案1
在 dante 配置中,我认为你阻止了所有连接,如下所示
client block {
from: 0.0.0.0/0 to: 0.0.0.0/0
log: connect error
}