Privoxy无法处理来自iptables的流量



我配置了privoxy,并在8118端口上工作。当定义http_proxyhttps_proxy变量指向代理时,我可以转发HTTP和HTTPS流量。示例:

https_proxy=http://127.0.0.1:8118 curl -vvv https://www.google.com
http_proxy=http://127.0.0.1:8118 curl -vvv http://www.google.com

请注意,我仍然使用http://作为HTTPS代理。Privoxy以某种方式转发了请求。

但是,我需要透明地转发它,因为我使用的是Node.js,我不想更改应用程序代码来支持代理。在Windows上,Proxifier很容易做到这一点,但该应用程序是专有的,不适用于WSL或GNU/Linux。在WSL/Linux上,我尝试使用iptables将包转发到privaoxy端口:

sudo iptables -t nat -N CUSTOM_PROXY
# Ignore LANs and some other reserved addresses.
sudo iptables -t nat -A CUSTOM_PROXY -d 0.0.0.0/8 -j RETURN
sudo iptables -t nat -A CUSTOM_PROXY -d 10.0.0.0/8 -j RETURN
sudo iptables -t nat -A CUSTOM_PROXY -d 127.0.0.0/8 -j RETURN
sudo iptables -t nat -A CUSTOM_PROXY -d 169.254.0.0/16 -j RETURN
sudo iptables -t nat -A CUSTOM_PROXY -d 172.16.0.0/12 -j RETURN
sudo iptables -t nat -A CUSTOM_PROXY -d 192.168.0.0/16 -j RETURN
sudo iptables -t nat -A CUSTOM_PROXY -d 224.0.0.0/4 -j RETURN
sudo iptables -t nat -A CUSTOM_PROXY -d 240.0.0.0/4 -j RETURN
# Everything else is redirected to the privoxy port
sudo iptables -t nat -A CUSTOM_PROXY -p tcp -j REDIRECT --to-ports 8118
# Then I tried to forward the ports I need to the chain:
sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j CUSTOM_PROXY
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j CUSTOM_PROXY
sudo iptables -t nat -A OUTPUT -p tcp --dport 443 -j CUSTOM_PROXY
sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j CUSTOM_PROXY
# other ports here...

激活这些规则后,HTTP和HTTPS调用停止工作:

shell> curl -vvv http://www.google.com
*   Trying 142.250.74.36:80...
* TCP_NODELAY set
* Connected to www.google.com (142.250.74.36) port 80 (#0)
> GET / HTTP/1.1
> Host: www.google.com
> User-Agent: curl/7.68.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 400 Invalid header received from client
< Content-Type: text/plain
< Connection: close
< 
Invalid header received from client.
* Closing connection 0
shell> curl -vvv https://www.google.com
*   Trying 142.250.74.36:443...
* TCP_NODELAY set
* Connected to www.google.com (142.250.74.36) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
* TLSv1.3

HTTP请求不起作用,HTTPS请求永远不会结束。Privoxy还支持鞋垫5。

我不明白这些转发是怎么发生的。有人能帮我找出我做错了什么吗?

一些可能有帮助的补充意见/问题:

  • 为什么设置变量有效,而通过iptables则无效
  • 为什么我必须将https_proxy设置为指向http://...?那和女贞有关吗
  • 关于评论";HTTPS不应该与透明代理一起使用":那么Proxifier是如何在Windows上工作的呢?如果这不是一个透明的代理,还有其他术语吗?为什么我们不能在WSL/Linux上有类似的东西

我的privoxy设置使用所有默认值,但以下转发配置除外:

forward  /  .
forward-socks5  .something.net  127.0.0.1:12345 .

我不认为这个privaxy配置真的很重要,因为我通过代理变量使用的任何东西都可以正常工作。问题在于iptables规则和privoxy之间。

感谢您的帮助。提前感谢!

我并不完全熟悉Privoxy的工作原理,但我知道拦截代理在Linux上是如何工作的
HTTP代理和拦截代理的工作方式截然不同。HTTP代理从查询的第一行获取目的地,该行将包含域名(例如,它应该是GET http://www.google.com/ HTTP/1.1(。对于HTTPS,它使用要连接的域:端口(例如CONNECT www.google.com:443 HTTP/1.1(执行HTTP CONNECT请求
拦截代理通过使用一些特定参数执行getsockopt((从内核获取原始目标地址。它不知道更高级别的协议
由于这些差异,通常使用iptables重定向到HTTP代理的请求是不起作用的。也就是说,Privoxy似乎有一个配置选项accept-intercepted-requests,您可以使用它来从Host:HTTP头读取目标。使用该配置,它应该能够处理使用iptables重定向的HTTP请求。正如文档所说,HTTPS不支持这种方式。您将需要使用一些额外的软件,这些软件可以转发到HTTP代理,可能很像Proxifier。我知道moproxy可以做到。它不应该是唯一的,但我不认识其他人。

附加问题:

  • 为什么设置变量有效,而通过iptables则无效

因为HTTP和透明/拦截代理以不同的方式工作。当变量存在时,curl(和其他(会改变他们发送查询的方式,但对于iptables,他们不会(因为他们不知道你使用了代理(。

  • 为什么我必须将https_proxy设置为指向http://...?那和女贞有关吗

环境变量中的http://用于描述如何连接到代理(如果您的代理具有tls证书,它实际上可能是https://,并且它也可以处理http请求,尽管它们只会从您加密到代理,而不是从代理加密到远程服务器(。

  • 关于评论"HTTPS不应该与透明代理一起使用":那么Proxifier是如何在Windows上工作的呢?如果这不是一个透明的代理,还有其他术语吗?为什么我们不能在WSL/Linux上有类似的东西

我不知道透明代理在Windows上如何工作的细节。假设它的工作方式与Linux非常相似,Proxifier可能会将请求重定向到本地端口,获得实际目的地,以HTTP/SOCKS代理可以理解的方式包装数据,并将其发送到您告诉它使用的代理。也许捕获部分有点不同(创建一个新的网络接口,要求Windows发送流量,从原始tcp数据包重建流,包装数据(。这通常被称为透明代理,因为客户端不知道使用了代理,有些人称之为拦截代理。我们可以有类似的东西,moproxy是一个例子(可能不是唯一的(

最新更新