我正在尝试将 Squid 透明设置从使用仅限于 IPv4 的通用 NAT 更改为 TPROXY,以支持 IPv6。我在让透明客户端在新设置下工作时遇到了困难,但是,所有请求都得到了满足,Squid 在所有请求上都抛出了以下错误:
“所请求的网址无法检索”
看起来似乎某个地方存在路由问题,但我不确定问题是什么。
我正在我的 DD-WRT 路由器和 Squid Proxy 上使用iptables
和ip6tables
来iproute2
执行两侧的路由部分。
默认情况下,该模块似乎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
我已使用这些来源作为指导,但无法获得可行的设置。
- http://wiki.squid-cache.org/ConfigExamples/Intercept/IptablesPolicyRoute
- http://wiki.squid-cache.org/Features/Tproxy4#Feature:_TPROXY_version_4.1.2B-_Support
对于可能存在的问题或者需要进一步调试,您有什么建议吗?
答案1
事实证明,一切都设置正确。实际问题在于我的 Privoxy 的 cache_peer 指令。抛出的错误实际上是 Squid 说它无法将流量交给 Privoxy。这是因为 tproxy 设置使其感到困惑。
为了避免这种情况,你必须添加no-tproxy
到 cache_peer 行
cache_peer hostname parent 8118 7 no-tproxy ...