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ベースのルールを構成することです。
- OSおよびカーネル:CentOS 7(3.10.0-229.14.1.el7.x86_64)
- yumによると、すべてのパッケージは最新です
- Squidバージョン:3.3.8(3.5.9も試しました)
- ファイアウォール:iptables / ip6tables 1.4.21
- libcap-2.22-8.el7.x86_64
IPv6接続は現在、ハリケーンエレクトリックを介した6in4トンネルを介しており、これはDD-WRTルーターで構成され、割り当てられたプレフィックスがを介してクライアントに委任されますradvd
。Squidボックスには、いくつかの静的IPv6アドレスが構成されています。
Squidボックスは、サービスを提供しているメインLAN内にあります。ポリシー80
- http://wiki.squid-cache.org/ConfigExamples/Intercept/IptablesPolicyRoute
http://www.dd-wrt.com/wiki/index.php/Squid_Transparent_Proxy
ip6tables -t mangle -A PREROUTING -i "$CLIENTIFACE" -s "$PROXY_IPV6" -p tcp --dport 80 -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 ip6tables -t filter -A FORWARD -i "$CLIENTIFACE" -o "$CLIENTIFACE" -p tcp --dport 80 -j ACCEPT ip -f inet6 rule add fwmark $FWMARK table 2 ip -f inet6 route add default via "$PROXY_IPV6" dev "$CLIENTIFACE" table 2
これは、Squidボックスにトラフィックを渡すという点では正常に機能しているようです。上記に加えてDD-WRTルーターに追加しなければならなかった1つの追加ルールは、Squidボックスで設定された発信IPv4およびIPv6アドレスの例外ルールでした。 Squidを使用するメインLAN 3128
。
ip6tables -t mangle -I PREROUTING -p tcp --dport 80 -s "$OUTGOING_PROXY_IPV6" -j ACCEPT
Squidボックスでは、次のルーティングルールとDIVERTチェーンを使用して、それに応じてトラフィックを処理します。テスト中に既存のチェーンでエラーが発生しないように、ルールを追加する必要がありました。私のファイアウォールはCSF
、次を追加しましたcsfpre.sh
ip -f inet6 route flush table 100
ip -f inet6 rule del fwmark 1 lookup 100
ip -f inet6 rule add fwmark 1 lookup 100
ip -f inet6 route add local default dev eno1 table 100
ip6tables -t mangle -F
ip6tables -t mangle -X
ip6tables -t mangle -N DIVERT
ip6tables -t mangle -A DIVERT -j MARK --set-mark 1
ip6tables -t mangle -A DIVERT -j ACCEPT
ip6tables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
ip6tables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 3129
squid.conf
2つのポート用に構成されています。
http_proxy 3128
http_proxy 3129 tproxy
さらに、Privoxyも使用no-tproxy
しており、cache_peer行に追加する必要がありました。追加しないと、両方のプロトコルですべてのトラフィックを転送できませんでした。
cache_peer localhost parent 8118 7 no-tproxy no-query no-digest
tcp_outgoing_address
Privoxyのため、ディレクティブを使用していません。代わりに、CentOSとバインド順序を使用して送信アドレスを制御しています。
sysctl値:
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.eno1.rp_filter = 0
rp_filter
設定がIPv4で機能するかどうかに関係なく機能し、IPv6でも同じ結果が得られるため、変更が必要かどうかはわかりません。
セリナックス
SELINUXはSquidボックスで有効になっていますが、TPROXYセットアップを許可するようにポリシーが構成されているため、ブロックされません(IPv4の動作はこれを示しています)。私はチェックしgrep squid /var/log/audit/audit.log | audit2allow -a
て取得しました<no matches>
#============= squid_t ==============
#!!!! This avc is allowed in the current policy
allow squid_t self:capability net_admin;
#!!!! This avc is allowed in the current policy
allow squid_t self:capability2 block_suspend;
#!!!! This avc is allowed in the current policy
allow squid_t unreserved_port_t:tcp_socket name_connect;
次のブール値も設定しました。
setsebool squid_connect_any 1
setsebool squid_use_tproxy 1
壊れたIPv6接続
最終的に、TPROXYクライアントのIPv6接続は完全に切断されます(3128
WPAD / PACファイルを使用するポート上のLANクライアントには、完全に機能するIPv6があります)。何らかの方法でトラフィックがSquidボックスにルーティングされているように見えますが、TPROXYを介したIPv6経由のリクエストはに表示されていませんaccess.log
。すべてのIPv6要求は、リテラルIPv6とDNS、タイムアウトの両方を要求します。内部IPv6クライアントにアクセスできますが、このトラフィックもログに記録されません。
test-ipv6.comを使用していくつかのテストを行ったところ、送信中のSquid IPv6アドレスが検出されましたが、IPv6テストではbad / slowまたはtimeoutとして表示されました。viaヘッダーを一時的に有効にすると、Squid HTTPヘッダーが表示されていることがわかったため、トラフィックは少なくともSquidボックスに到達していますが、Squidボックスに適切にルーティングされていません。
私はこれをしばらくの間機能させようとしていて、問題が何であるかを見つけることができませんでした、私はSquidメーリングリストで尋ねましたが、実際の問題を診断したり解決したりすることはできませんでした。私のテストに基づいて、私はそれが次の領域の1つであり、Squidが問題を解決していると確信しています。
- ルーティング
- カーネル
- ファイアウォール
TPROXYとIPv6を機能させるためにできるアイデアや追加の手順は大歓迎です!
追加情報
ip6tablesルール:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DIVERT tcp ::/0 ::/0 socket
TPROXY tcp ::/0 ::/0 tcp dpt:80 TPROXY redirect :::3129 mark 0x1/0x1
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Chain DIVERT (1 references)
target prot opt source destination
MARK all ::/0 ::/0 MARK set 0x1
ACCEPT all ::/0 ::/0
IPv6ルーティングテーブル(プレフィックスが不明瞭)
unreachable ::/96 dev lo metric 1024 error -101
unreachable ::ffff:0.0.0.0/96 dev lo metric 1024 error -101
2001:470:xxxx:xxx::5 dev eno1 metric 0
cache mtu 1480
2001:470:xxxx:xxx:b451:9577:fb7d:6f2d dev eno1 metric 0
cache
2001:470:xxxx:xxx::/64 dev eno1 proto kernel metric 256
unreachable 2002:a00::/24 dev lo metric 1024 error -101
unreachable 2002:7f00::/24 dev lo metric 1024 error -101
unreachable 2002:a9fe::/32 dev lo metric 1024 error -101
unreachable 2002:ac10::/28 dev lo metric 1024 error -101
unreachable 2002:c0a8::/32 dev lo metric 1024 error -101
unreachable 2002:e000::/19 dev lo metric 1024 error -101
unreachable 3ffe:ffff::/32 dev lo metric 1024 error -101
fe80::/64 dev eno1 proto kernel metric 256
default via 2001:470:xxxx:xxxx::1 dev eno1 metric 1