Squid 3.3 使用 TPROXY 实现透明 IPv4 和 IPv6 代理

Squid 3.3 使用 TPROXY 实现透明 IPv4 和 IPv6 代理

我正在尝试将 Squid 透明设置从使用仅限于 IPv4 的通用 NAT 更改为 TPROXY,以支持 IPv6。我在让透明客户端在新设置下工作时遇到了困难,但是,所有请求都得到了满足,Squid 在所有请求上都抛出了以下错误:

“所请求的网址无法检索”

看起来似乎某个地方存在路由问题,但我不确定问题是什么。

我正在我的 DD-WRT 路由器和 Squid Proxy 上使用iptablesip6tablesiproute2执行两侧的路由部分。

默认情况下,该模块似乎ip6table_mangle未在 DD-WRT 上默认加载,但已被编译到在我的路由器上运行的版本中:

find /lib/modules -name "*.ko" | grep -i mangle
/lib/modules/3.10.89/ip6table_mangle.ko

加载模块并添加到启动脚本以供将来启动:

insmod ip6table_mangle

DD-WRT 路由信息:

# Squid transparent proxy
PROXY_IPV4="192.168.x.x"
PROXY_IPV6="xxxx:xxxx:xxxx:xxxx::x"
CLIENTIFACE=br0
FWMARK=3

iptables -t mangle -A PREROUTING -i $CLIENTIFACE -p tcp --dport 80 -s $PROXY_IPV4 -j ACCEPT
ip6tables -t mangle -A PREROUTING -i $CLIENTIFACE -p tcp --dport 80 -s $PROXY_IPV6 -j ACCEPT

iptables -t mangle -A PREROUTING -i $CLIENTIFACE -p tcp --dport 80 -j MARK --set-mark $FWMARK
iptables -t mangle -A PREROUTING -m mark --mark $FWMARK -j ACCEPT
ip6tables -t mangle -A PREROUTING -i $CLIENTIFACE -p tcp --dport 80 -j MARK --set-mark $FWMARK
ip6tables -t mangle -A PREROUTING -m mark --mark $FWMARK -j ACCEPT

iptables -t filter -A FORWARD -i $CLIENTIFACE -o $CLIENTIFACE -p tcp --dport 80 -j ACCEPT
ip6tables -t filter -A FORWARD -i $CLIENTIFACE -o $CLIENTIFACE -p tcp --dport 80 -j ACCEPT

ip rule add fwmark $FWMARK table 2
ip -6 rule add fwmark $FWMARK table 2
ip route add default via $PROXY_IPV4 table 2
ip -6 route add default via $PROXY_IPV6 table 2

# End Squid intercept proxy config

Squid 代理路由(在服务器本身上):

iptables -F -t mangle
iptables -X -t mangle
ip6tables -F -t mangle
ip6tables -X -t mangle
iptables -t mangle -N DIVERT
ip6tables -t mangle -N DIVERT

iptables -t mangle -A DIVERT -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -A DIVERT -j ACCEPT
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 3129

ip6tables -t mangle -A DIVERT -j MARK --set-mark 1
ip6tables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
ip6tables -t mangle -A DIVERT -j ACCEPT
ip6tables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 3129

ip -f inet rule add fwmark 1 lookup 100
ip -f inet route add local default dev eno1 table 100

ip -f inet6 rule add fwmark 1 lookup 100
ip -f inet6 route add local default dev eno1 table 100

鱿鱼配置:

http_port 3129 tproxy

系统控制配置:

net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.lo.rp_filter = 0
net.ipv4.conf.eno1.rp_filter = 0

eno1是主要的以太网接口,我也尝试过使用,lo但没有成功。

流量被传送到 Squid 盒,因此路由器似乎正在工作。当流量最终到达 Squid 盒时,似乎出了问题。所有请求都已记录,但返回 500 错误。

据我所知,我的设置支持TPROXY:

  • CentOS 7
  • Squid 3.3.8(EPEL)
  • iptables/ip6tables 1.4.21
  • Linux 内核 3.10
  • libcap 2.22

我已使用这些来源作为指导,但无法获得可行的设置。

对于可能存在的问题或者需要进一步调试,您有什么建议吗?

答案1

事实证明,一切都设置正确。实际问题在于我的 Privoxy 的 cache_peer 指令。抛出的错误实际上是 Squid 说它无法将流量交给 Privoxy。这是因为 tproxy 设置使其感到困惑。

为了避免这种情况,你必须添加no-tproxy到 cache_peer 行

cache_peer hostname parent 8118 7 no-tproxy ...

相关内容