CentOS 7で動作するIPv6でSquidとTPROXYを取得する


18

CentOS 7サーバーでTPROXYをSquidとIPv6で動作させるのに問題があります。以前はNATで一般的なインターセプトセットアップを使用していましたが、IPv4のみに制限されていました。TPROXYでIPv6を含むようにセットアップを拡張しています。

私はこのテーマに関する公式のSquid wiki記事を使用してすべてを構成しました:

http://wiki.squid-cache.org/Features/Tproxy4

これまでのところ、TPROXY構成は問題なくIPv4で機能しているようです。ただし、IPv6では接続がタイムアウトになり、正しく機能しません。理解を深めるために、セットアップを分解します。

すべてのファイアウォールおよびルーティングルールはIPv4でまったく同じであることに注意してください。唯一の違いはinet6ip6tables以下の例で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

これは、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_addressPrivoxyのため、ディレクティブを使用していません。代わりに、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接続は完全に切断されます(3128WPAD / 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

バグ/リリースの問題を排除するために、Squidの新しいリリース(3.5)に更新しようとしましたが、問題は残っています。
ジェームスホワイト

1
ちょうど1年前にCentOS 6ボックスでこれを機能させたと言ってコメントします。しかし、ある日(カーネルの更新後)突然動作しなくなり、それ以降は動作しませんでした。IPv6 TPROXYセットアップを有効にすると、基本的にすべてのポート80のトラフィックが中断され、squidには何も届きません。今のところそれをあきらめました。現在実行しているカーネルは2.6.32です-wiki.squid-cache.org/Features/Tproxy4では、カーネルの最小バージョン2.6.37がリストされているため、すでにそれは不足しています。もし私がそれを調べたら、ここで私の発見を更新します。
パーカマーク

だから私はついにこれを機能させた。問題は、IPv4「インターセプト」ポートがsquid.confのIPv6「tproxy」ポートに等しいことでした-これはドキュメントで詳しく説明されていますが、これらのポートがリッスンしているので、これを行わなくても済むと思いました特定のアドレス/スタックとポートがあるため、競合する特定の理由はありませんか?まあ、これは誤った推定のようです。続きを読む
...-Parkamark

squid.confで「http_port 192.168.0.1:3128 intercept」と「http_port [fd00 :: 2]:3128 tproxy」を定義しました-これをしないでください!単に「http_port 3128 intercept」および「http_port 3129 tproxy」でなければなりません。IPv6 tproxyポートを特定のIPv6アドレスにバインドして、すべてのファイアウォール/ルーティングマジックが機能することを期待することはできません。ポートのみを指定できます。つまり、squidはこれらのポート上のすべてのアドレス/インターフェースにバインドします。必要に応じて、これらの開いているポートをロックするファイアウォールルールを追加します。
パーカマーク

回答:


1

私はこれが古いことを理解しており、これに対する完全な回答はありませんが、私はあなたに非常に似たようなことをしており、ほぼ同じ症状を持っています。

最初:test-ipv6.comは、新しいタイプのエラー(今年初めに壊れていた)を処理できるように、やや最近自分自身を更新したようです。もう一度テストしてください。

私の場合、それは私が持っていると思われる問題を説明するURLに私を送りました: パスMTU検出FAQ。これらは、cURLでPMTUDテストを行うために使用できるURLを提供し、次にtpcdump、wireshark を使用してトラフィックを確認できます。

Squidを介してトラフィックがTPROXYされると、ホストでIPv6パスMTU検出が完全に機能しなくなります。(私はまだホストで動作しない理由に取り組んでいるので、決定的な解決策はありません)。

簡単な説明:

  • ICMPはIPv6で非常に重要です。多くの人がICMPをブロックしたいと考えており、最終的には善よりも害をもたらします。
  • パケットが接続に対して「大きすぎる」場合、パケットはドロップされ、ICMPタイプ2(「パケットが大きすぎる」)メッセージが発信元サーバーに送信され、パケットサイズを縮小して再送信するように要求されます。
  • ICMPメッセージがサーバーに届かない場合、サーバーは大きなパケットを再送信し続けますが、大きすぎるためすぐにドロップされます。
  • パケットは宛先に到達しないため、これは「ブラックホール」と呼ばれています。

したがって、ファイアウォールルールがICMPv6メッセージを受け入れるように設定されていることを確認することをお勧めします(「必要な」ICMPタイプのリストについては、RFC4890を参照してください)。

私の場合、ICMPメッセージを許可していますが、まだ問題があります。タオルを投入してネットワークのMTU(核オプション)を減らすだけの準備はできていません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.