为什么我的tcp客户机跳过代理而直接连接到服务器

2024-06-26 13:44:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我根据这个https://gist.github.com/voorloopnul/415cb75a3e4f766dc590#file-proxy-py写了一个反向代理。你知道吗

我需要这个来覆盖客户端的身份验证信息。喜欢跟在后面。你知道吗

Client(passA)  --->   Proxy(overwrite passA into passB)  ---> Server(passB)

其中passB是正确的密码,passA是随机数。你知道吗

算法是SCRAMSHA256,有点复杂,但我设法做到这一点。 当代理和服务器不在同一台机器上时,事件处理可以很好地工作。 我尝试在windows和linux上部署代理。代理使用“ip地址”指向服务器

然而,当代理使用'localhost'指向服务器时,它被破坏了,身份验证无法通过某个客户机(我为其制作了代理)。但对于其他客户,它也很有效。你知道吗

这不应该是封装的并且对用户是透明的吗?你知道吗

为什么localhost如此特殊,我如何解决这个问题?你知道吗


更新最新研究

身份验证失败,因为客户端直接连接到服务器,所以我的代理不会修改密码。你知道吗

Condition 1: Proxy on another machine. The proxy works.
Client(192.168.1.1) ==> Proxy(192.168.1.3:8000) ==> Server(192.168.1.2:6000) 

-

Condition 2: Proxy on the same machine as the Server.
The proxy listen 0.0.0.0:8000 and forward packets to localhost:6000.

Client(192.168.1.1) ==> Proxy(192.168.1.2:8000) ==> Server(192.168.1.2:6000)

After the first connection, the rest connection becomes

Client(192.168.1.1) =====> Server(192.168.1.2:6000) without proxy.

这使得代理不再有效。 为什么客户会在条件2中跳过它?你知道吗


Tags: the服务器client身份验证localhost密码客户端代理
4条回答

你可以使用前瞻。由于您可能会不止一次地使用此模式,所以将其创建为静态最终变量:

private static final Pattern PATTERN = Pattern.compile(":(?=[A-Z0-9]{2})");

// ...

idNum = PATTERN.matcher(idNum).replaceAll(" ");

我建议使用捕获组来真正获取您感兴趣的内容。没有理由不重复

String idNum = idNum.replaceAll(
   "ID Number: ([A-Z0-9]{2}):([A-Z0-9]{2}):([A-Z0-9]{2})",
   "$1 $2 $3"
);

如果字符串模式没有太多变化,我会选择

String str = "ID Number: 4D:9B:C4"
numbers = str.split(':')[1].split(':')

那你可能不得不这么做。trim()数组中的元素“number”

之后,你可以用空格连接数字[0-2]

通过regex和regex-ony。锚\G在上一次匹配结束的位置匹配

String s = "ID Number: 4D:9B:C4";
System.out.println(s.replaceAll("(?:ID Number: ([A-Z0-9]{2})|(?<!^)\\G):?([A-Z0-9]{2})","$1 $2"));

输出:

4D 9B C4

另一个例子是许多冒号分隔的部分

String s = "ID Number: 4D:9B:C4:B5:C6:D7:F8:K9";
System.out.println(s.replaceAll("(?:ID Number: ([A-Z0-9]{2})|(?<!^)\\G):?([A-Z0-9]{2})","$1 $2"));

输出:

4D 9B C4 B5 C6 D7 F8 K9

参考文献:

更新:

String s = "We got some text up here\n" +
           "ID Number: 4D:9B:C4:D4:F4\n" +
           "And also some text down here";
System.out.println(s.replaceAll("(?s)(?:ID Number: ([A-Z0-9]{2})|(?<!^)\\G):?([A-Z0-9]{2})|.*?(?=ID Number:)|.+","$1 $2").trim());

相关问题 更多 >