web-dev-qa-db-ja.com

Squid 3.3TPROXYを使用した透過的なIPv4およびIPv6プロキシ

Squidの透過的な設定を一般的なNATこれはIPv4のみに制限されており、IPv6をサポートするためにTPROXYに切り替えています。透過的なクライアントをただし、新しいセットアップでは、すべてのリクエストにsquidが対応し、すべてのリクエストで次のエラーがスローされます。

"要求されたURLを取得できませんでした"

どこかにルーティングの問題があるように見えますが、何が問題なのかわかりません。

DD-WRTルーターとSquidProxyでiptablesip6tablesを使用し、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

squid conf:

http_port 3129 tproxy

sysctl config:

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
  • イカ3.3.8(EPEL)
  • iptables/ip6tables 1.4.21
  • Linuxカーネル3.10
  • libcap 2.22

これらのソースをガイダンスとして使用しましたが、動作するセットアップを取得できません。

何が問題になるか、またはさらにデバッグするためのアドバイスはありますか?

1
James White

すべてが正しく設定されていることがわかります。実際の問題は、Privoxyのcache_peerディレクティブです。スローされたエラーは、実際にはSquidがトラフィックをPrivoxyに渡すことができないと言っています。これは、tproxyの設定が混乱しているためです。

これを回避するには、cache_peer行にno-tproxyを追加する必要があります

cache_peer hostname parent 8118 7 no-tproxy ...
1
James White