我在 CentOS 7 服务器上让 TPROXY 与 Squid 和 IPv6 一起工作时遇到问题。我以前使用 NAT 的通用拦截设置,但它仅限于 IPv4。我现在正在扩展设置以包含带有 TPROXY 的 IPv6。
我一直在使用有关该主题的官方 Squid wiki 文章来配置所有内容:
http://wiki.squid-cache.org/Features/Tproxy4
到目前为止,TPROXY 配置似乎适用于 IPv4,没有任何问题。然而,使用 IPv6 时,连接超时且无法正常工作。我将分解设置以便更好地理解。
请注意,所有防火墙和路由规则对于 IPv4 完全相同,唯一的区别是inet6
和ip6tables
用于在下面的示例中配置基于 IPv6 的规则。
IPv6 连接目前是通过 Hurricane Electric 的 6in4 隧道,这是在 DD-WRT 路由器上配置的,然后分配的前缀通过radvd
. Squid 框配置了多个静态 IPv6 地址。
Squid 盒位于它所服务的主 LAN 中。端口 80 上的流量被拦截的客户端(主要是无线客户端)通过我的 DD-WRT 路由器被推送到 Squid 框,并使用以下防火墙和路由规则,改编自 Policy Routing wiki 文章和 DD-WRT wiki
我有一个装有 2 个网卡的 linux 机器,用于检查通过端口 80 的流量。一张网卡用于上网,另一张卡连接到网络交换机。关键是为了调试目的,能够检查连接到该交换机的设备上的所有 HTTP 和 HTTPS 流量。
我已经为 iptables 编写了以下规则:
nat
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.1:1337
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 1337
-A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)
在 192.168.2.1:1337,我有一个使用 Charles ( http://www.charlesproxy.com/ ) 进行录制的透明 http 代理。
对于端口 80 一切正常,但是当我为指向端口 1337 的端口 443 (SSL) 添加类似的规则时,我通过 Charles 收到有关无效消息的错误。
我之前与 Charles ( http://www.charlesproxy.com/documentation/proxying/ssl-proxying/ )在同一台计算机上使用过 SSL 代理,但由于某种原因透明地执行它没有成功。我在谷歌上搜索的一些资源说这是不可能的 - 如果有人可以解释原因,我愿意接受它作为答案。
请注意,我可以完全访问所描述的设置,包括连接到子网的所有客户端 …
Squid Transparent Proxy Version: 3.3.8
OS: Ubuntu Server 14.04
Server IP: 192.168.1.3
Run Code Online (Sandbox Code Playgroud)
(不包括使用 grep 的评论)
root@ubuntu:~# grep -v '^$\|^\s*\#' /etc/squid3/squid.conf
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # …
Run Code Online (Sandbox Code Playgroud) 在处理连接的进程获取流之前,我需要对来自已知 tcp host:port 的传入流量进行一些小的修改。
例如,让 192.168.1.88 成为运行 Web 服务器的远程主机。
我需要的是,当我本地主机上的进程从 192.168.1.88:80(例如浏览器)接收数据时,数据首先被替换text-A
为text-B
,如下所示:
127.0.0.1:... 发送到 192.168.1.88:80:
GET /
Run Code Online (Sandbox Code Playgroud)192.168.1.88:80 发送到 127.0.0.1:...:
HTTP/1.0 200 OK
Content-Type: text/plain
Some text-A, some other text
Run Code Online (Sandbox Code Playgroud)该数据在某种程度上被系统拦截并传递给一个程序,其输出为:
HTTP/1.0 200 OK
Content-Type: text/plain
Some text-B, some other text
Run Code Online (Sandbox Code Playgroud)系统将如此更改的数据提供给处理 127.0.0.1:... 的进程,就像它来自 192.168.1.88:80 一样。
假设我有一种基于流的方法来进行这种更改(sed
例如使用),预处理传入的 tcp 流的最简单方法是什么?
我想这会涉及iptables
,但我不是很擅长。
请注意,应用程序应该感觉与原始主机打交道,因此设置代理不太可能是解决方案。
我在 Ubuntu 10.04.4 中设置了一个透明代理,其中 firehol 和 tinyproxy 适用于 http,但我无法让它适用于 https。
直接连接到 tinyproxy 可以正常工作,因为以下命令可以正常完成:
env http_proxy=localhost:8888 curl http://www.google.com
env https_proxy=localhost:8888 curl https://www.google.com
Run Code Online (Sandbox Code Playgroud)
Http 透明代理也可以正常工作:
curl http://www.google.com
Run Code Online (Sandbox Code Playgroud)
但是当直接使用 https 访问 google 时,命令就挂了:
curl https://www.google.com
Run Code Online (Sandbox Code Playgroud)
这是 firehol 和 tinyproxy 的完整配置文件。请注意,除了透明代理之外,我对使用 firehol 没有兴趣。
firehol.conf:
transparent_proxy "80 443" 8888 proxy
interface any world
client all accept
server all accept
Run Code Online (Sandbox Code Playgroud)
tinyproxy.conf(除了上游代理之外的所有默认值):
User nobody
Group nogroup
Port 8888
Timeout 600
DefaultErrorFile "/usr/share/tinyproxy/default.html"
StatFile "/usr/share/tinyproxy/stats.html"
Logfile "/var/log/tinyproxy/tinyproxy.log"
LogLevel Info
PidFile "/var/run/tinyproxy/tinyproxy.pid"
MaxClients 100
MinSpareServers 5
MaxSpareServers 20
StartServers …
Run Code Online (Sandbox Code Playgroud) 我已经搜索了很多小时关于为 SSL(不是 Squid)设置透明代理的方法。一般的答案是我不能,但我知道有一些方法。我的目的只有以下几点:
以下页面告诉我可以不加修改地传递流量,但它没有说明如何: iptables https 透明代理与 privoxy?
以下页面显示了 443 的 iptables 规则,我自己无法使用它:http : //alien.slackbook.org/dokuwiki/doku.php?id=slackware : proxy
以下页面介绍了如何使其仅适用于 Squid:http : //www.rahulpahade.com/content/squid-transparent-proxy-over-ssl-https
编辑:这里有人说: 如何使用 IPTABLES 在 Squid 周围创建 HTTPS (443) 直通? “对您来说,最好的办法是阻止对端口 443 的直接访问,并告诉您的用户,如果他们想使用 HTTPS,他们必须将浏览器配置为使用代理。” 但我只知道如何完全阻止 443,而不是让它在代理下工作。
我需要将所有连接到任何地址端口 22 转发到不同的网关(即没有默认值)。首先我想用ipfw来做:
sudo ipfw add 5 fwd $EXTERNAL_IP,22 tcp from any to any 22 keep-state
Run Code Online (Sandbox Code Playgroud)
但是对于 Mac OS X Lion,它似乎不起作用。无论如何,查看 ipfw 文档我发现它已被弃用,我应该使用 pfctl。
所以我修改了/etc/pf.conf
文件:
rdr proto tcp from $internal_ip to any port 22 -> $external_ip port 22
Run Code Online (Sandbox Code Playgroud)
但没有运气。
有谁知道如何将本地应用程序生成的所有连接转换或转发到任何地址,但端口 22 到不同的网关/IP 地址?
更新
按照 Jake 的建议,我尝试仅指定目标 IP,因此我将 rdr 规则转换为 mac os x 语法:
rdr proto tcp from any to any port 22 -> $external_ip port 22
Run Code Online (Sandbox Code Playgroud)
即使在这种情况下,我也没有得到预期的结果,即我可以通过 ssh 连接到我的服务器,但通过默认网关。
几年来,我一直在 DigitalOcean droplet 上将一些服务作为 docker 容器运行,最近我认为是时候将其中一个更新到最新版本(有问题的服务是幽灵博客平台)。以前,我的工作设置使用caddy作为反向代理,因此我可以通过访问blog.mydomain.example
. Caddyfile 设置如下所示:
blog.mydomain.example {
proxy / 192.0.2.5:1268
}
Run Code Online (Sandbox Code Playgroud)
其中 IP:port 是本地 ghost docker 容器的 IP:port。
但是,在将我的 ghost 实例更新到最新版本并保持相同的配置后,出现了一个奇怪的错误。导航到blog.mydomain.example
会加载很长时间然后突然重定向到https://192.0.2.5:2368,这当然不起作用,因为这是我的 droplet 上的本地 IP。在网上搜索了很长时间后,我最终找到了修复程序,它需要像这样修改我的 Caddyfile:
blog.mydomain.example {
proxy / 192.0.2.5:1268 {
transparent
}
}
Run Code Online (Sandbox Code Playgroud)
代理的caddy 文档页面有一些关于透明的作用:
透明:从原始请求中传递主机信息,正如大多数后端应用程序所期望的那样。
简写:
header_upstream Host {host}
header_upstream X-Real-IP {remote}
header_upstream X-Forwarded-For {remote}
header_upstream X-Forwarded-Proto {scheme}
我也阅读了关于代理类型的这篇文章,但我仍然对使反向代理透明意味着什么以及为什么在这种情况下需要它感到困惑。有人可以解释一下吗?
我正在尝试确定我的宽带提供商是否使用透明代理。大多数情况下我不介意他们是否这样做,但今天我试图预览我在 DNS 传播之前从一台服务器移动到另一台服务器的站点。所以我将新的 IP 地址放入 /etc/hosts 并希望能够连接到新服务器,但可惜我仍然得到旧的。
为了证明我正在与“新”服务器通话,我正在远程登录到新的IP 地址并执行以下操作:
GET /
Host: www.example.com
Run Code Online (Sandbox Code Playgroud)
这仍然影响到旧服务器。
我在互联网上其他地方的另一台主机上尝试了相同的操作,该主机上肯定没有透明代理缓存,这次它命中了正确的服务器。
所以我相当确定我的宽带线路上有一个缓存......并且缓存正在执行自己的 DNS 查找,这当然会覆盖我的 /etc/hosts 文件。
但是,有什么方法可以让我找到更多关于它的信息,并确认它在那里?
我的网络请求的“源 IP 地址”似乎是我的家庭 IP 地址,因此不会显示代理缓存
Wireshark 检查数据包以查看直接与站点(例如在本地主机上)通信与通过代理通信时是否有任何区别,我没有取得任何成功。
任何人都可以提供任何智慧的话吗?是否有任何可靠的方法来检测或识别内联/透明代理缓存?
谢谢
我现在有以下配置:
# Squid normally listens to port 3128
http_port 3128
cache_peer proxy1_address parent proxy1_port 0 proxy-only default login=name1:pass1
never_direct allow all
Run Code Online (Sandbox Code Playgroud)
现在,我需要以某种方式配置鱿鱼,将所有到 3128 的传入请求都重定向到 proxy1(就像现在一样),并且所有到 3127 的传入请求都将重定向到 proxy2。可以做吗?
我当前的配置不起作用:
http_port 3128
http_port 3127
acl port_3128 port 3128
acl port_3127 port 3127
# 3128
cache_peer proxy01 parent 3128 0 no-query originserver name=proxy3128
cache_peer_access proxy3128 allow port_3128
cache_peer_access proxy3128 deny port_3127
# 3127
cache_peer proxy02 parent 3128 0 no-query originserver name=proxy3127
cache_peer_access proxy3127 allow port_3127
cache_peer_access proxy3127 deny port_3128
Run Code Online (Sandbox Code Playgroud)