CentOS 7 üzerinde çalışan IPv6 ile Squid ve TPROXY'yi alma


18

TPROXY'nin bir CentOS 7 sunucusunda Squid ve IPv6 ile çalışmasında sorun yaşıyorum. Daha önce NAT ile genel bir kesme kurulumu kullanıyordum, ancak sadece IPv4 ile sınırlıydı. Şimdi kurulumu TPROXY ile IPv6 içerecek şekilde genişletiyorum.

Her şeyi yapılandırmak için konuyla ilgili resmi Squid wiki makalesini kullanıyorum:

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

Şimdiye kadar TPROXY yapılandırması IPv4 için sorunsuz çalışıyor. Ancak IPv6 ile bağlantılar zaman aşımına uğruyor ve düzgün çalışmıyor. Daha iyi anlamak için kurulumu bozacağım.

Tüm güvenlik duvarı Not ve yönlendirme kuralları tam olarak IPv4 için aynıdır, tek fark inet6ve ip6tablesaşağıdaki örneklerde IPv6 tabanlı kuralları yapılandırma.

  • İşletim Sistemi ve Çekirdek: CentOS 7 (3.10.0-229.14.1.el7.x86_64)
  • Tüm paketler yum'a göre güncel
  • Squid Version: 3.3.8 (Ayrıca 3.5.9 çalıştı)
  • Güvenlik Duvarı: iptables / ip6tables 1.4.21
  • libcap-2.22-8.el7.x86_64

IPv6 bağlantısı şu anda Hurricane Electric üzerinden 6 inçlik bir tünelden geçiyor, bu DD-WRT yönlendiricide yapılandırılıyor ve daha sonra istemcilere atanan önek radvd. Squid kutusunda birkaç statik IPv6 adresi yapılandırılmıştır.

Squid kutusu, hizmet verdiği ana LAN'ın içinde yer alır. 80 numaralı bağlantı noktasında trafiği olan istemciler (çoğunlukla kablosuz istemciler), İlke Yönlendirme wiki makalesi ve DD-WRT wiki'den uyarlanan aşağıdaki güvenlik duvarı ve yönlendirme kurallarıyla DD-WRT yönlendiricim aracılığıyla Squid kutusuna gönderiliyor

Trafiğin Kalamar kutusuna geçirilmesi açısından bu TAMAM çalışıyor gibi görünüyor. Yukarıdakilere ek olarak DD-WRT yönlendiricisine eklemek zorunda olduğum ek bir kural, Squid kutusunda yapılandırılmış giden IPv4 ve IPv6 adresleri için bir istisna kuralıydı, aksi takdirde çılgın bir döngü sorunu alıyorum ve trafik dahil tüm istemciler için bozuldu Squid'i kullanan ana LAN 3128.

ip6tables -t mangle -I PREROUTING -p tcp --dport 80 -s "$OUTGOING_PROXY_IPV6" -j ACCEPT

Kalamar kutusunda daha sonra aşağıdaki yönlendirme kurallarını ve DIVERT zincirini trafiği uygun şekilde ele almak için kullanıyorum. Test sırasında zaten var olan zincirdeki hataları önlemek için ek kurallar eklemem gerekiyordu. Benim duvarı olup CSF, aşağıdaki yazıyı eklediğinizcsfpre.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 iki bağlantı noktası için yapılandırılmıştır:

http_proxy 3128
http_proxy 3129 tproxy

Ayrıca ben de Privoxy kullanıyorum ve no-tproxycache_peer satır eklemek zorunda kaldı , aksi takdirde tüm trafik her iki protokol için iletilemedi.

cache_peer localhost parent 8118 7 no-tproxy no-query no-digest

tcp_outgoing_addressPrivoxy yüzünden herhangi bir direktif kullanmıyorum , bunun yerine giden adresleri CentOS ve bağlama sırası aracılığıyla kontrol ediyorum.

sysctl değerleri:

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_filterKurulum IPv4'te onlarla veya onsuz çalıştığından ve IPv6 için aynı sonucu ürettiğinden değişikliklerin gerekli olup olmadığından emin değilim .

SELINUX

SELINUX, Squid kutusunda etkinleştirildi, ancak politikalar TPROXY kurulumuna izin verecek şekilde yapılandırıldı, bu yüzden engellenmiyor (IPv4 çalışması bunu yine de gösteriyor). Kontrol ettim grep squid /var/log/audit/audit.log | audit2allow -ave aldım<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;

Ayrıca aşağıdaki booleanları ayarladım:

setsebool squid_connect_any 1
setsebool squid_use_tproxy 1

Bozuk IPv6 bağlantısı

Sonuçta, IPv6 bağlantısı TPROXY istemcileri için tamamen bozulmuştur ( 3128WPAD / PAC dosyası kullanan bağlantı noktasındaki LAN istemcilerinde tam olarak çalışan IPv6 vardır). Trafik bir şekilde Squid kutusuna yönlendiriliyor gibi görünse de, TPROXY üzerinden IPv6 üzerinden hiçbir istek görünmüyor access.log. Tüm IPv6, gerçek IPv6 ve DNS, zaman aşımı ister. Dahili IPv6 istemcilerine erişebilirim ama yine de, bu trafik de günlüğe kaydedilmez.

Test-ipv6.com kullanarak bazı testler yaptım ve giden Squid IPv6 adresimi tespit ettiğini buldum, ancak IPv6 testleri ya kötü / yavaş ya da zaman aşımı olarak gösterdi. Geçici olarak via üstbilgisini etkinleştirdim ve Squid HTTP üstbilgisinin görünür olduğunu gördüm, bu yüzden trafik en azından Squid kutusuna ulaşıyor, ancak bir kez orada düzgün bir şekilde yönlendirilmiyor.

Bunu bir süredir çalıştırmaya çalışıyorum ve sorunun ne olduğunu bulamıyorum, Squid posta listesinde bile sordum, ancak asıl sorunu teşhis edemedim veya çözemedim. Testime dayanarak, aşağıdaki alanlardan biri olduğundan ve Squid'in sorundan eminim:

  • Yönlendirme
  • Çekirdek
  • Firewall

TPROXY ve IPv6'nın çalışması için atabileceğim herhangi bir fikir ve ek adımlar çok takdir edilecektir!

Ek bilgi

ip6tables kuralları:

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 yönlendirme tablosu (önek gizlenmiş)

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

Herhangi bir hata / sürüm sorunları dışlamak için, Squid (3.5) daha sonraki bir sürümü için güncelleme denedim ama sorun devam ediyor.
James White

1
Sadece bir yıl önce bir CentOS 6 kutusu üzerinde bu çalışma var mı söylemek yorum. Ancak, aniden bir gün çalışmayı bıraktı (bence bir çekirdek güncellemesinden sonra) ve o zamandan beri çalışmayı başaramadım. IPv6 TPROXY kurulumunu etkinleştirirsem, temel olarak 80 numaralı bağlantı noktasının tüm trafiğini keser ve hiçbir şey kalamar elde etmez. Bir an için vazgeçtim. Şu anda çalıştırdığım çekirdek 2.6.32 - wiki.squid-cache.org/Features/Tproxy4 üzerinde minimum 2.6.37 çekirdek listesini listelediğimi , bu yüzden zaten bunun kısa olduğunu düşünüyorum. Eğer bunu bir kenara itersem, bulgularımla burada güncelleyeceğim.
parkamark

Sonunda bu işe başladım. Sorun squid.conf IPv4 "kesme" bağlantı noktası IPv6 "tproxy" bağlantı noktasına eşit olması ile oldu - bu belgelerde ayrıntılı, ama ben bu portları dinleme vardı çünkü bunu yapamıyorum düşündüm bağlantı noktasıyla birlikte belirli adresler / yığınlar, bu yüzden çakışmaları için belirli bir neden yoktur, değil mi? Bu yanlış bir varsayım gibi görünüyor. Okumaya devam edin ...
parkamark

Squid.conf içinde "http_port 192.168.0.1:3128 kesişme" ve "http_port [fd00 :: 2]: 3128 tproxy" tanımlamıştım - bunu yapma! Basitçe "http_port 3128 kesişimi" ve "http_port 3129 tproxy" olmalıdır. IPv6 tproxy bağlantı noktasının belirli bir IPv6 adresine bağlanmasını ve ardından tüm güvenlik duvarı / yönlendirme sihrinin çalışmasını bekleyemezsiniz. Yalnızca bağlantı noktalarını belirtebilirsiniz, yani kalamar bu bağlantı noktalarındaki tüm adreslere / arabirimlere bağlanır. Bu açık bağlantı noktalarını gerektiği gibi kilitlemek için güvenlik duvarı kuralları ekleyeceğim.
parkamark

Yanıtlar:


1

Bunun eski olduğunu anlıyorum ve buna tam bir cevabım yok, ama sana çok benzer bir şey yapıyorum ve neredeyse aynı belirtilerim var.

Birincisi: test-ipv6.com, yeni bir tür hatayı işleyebilmek için kısa bir süre önce kendini güncelledi (bu yılın başlarında kırıldı). Tekrar bir test yap.

Benim durumumda, bana sahip olduğum bir sorunu açıklayan bir URL gönderdi: Yol MTU Algılama SSS . Bir PMTUD testi yapmak için cURL ile kullanabileceğiniz bir URL sağlarlar ve sonra trafiğinizi tpcdumpveya wireshark kullanarak kontrol edebilirsiniz .

Trafik Squid üzerinde TPROXY'd olduğunda, IPv6 Yolu MTU Algılama tamamen ana makinenizde çalışmaz. (Hala neden benim ev sahibi üzerinde çalışmıyor üzerinde çalışıyorum , bu yüzden kesin bir çözüm var).

Kısa bir açıklama:

  • IPMP6'da ICMP çok önemlidir. Birçok insan ICMP'yi engellemek istiyor ve sonuçta faydadan çok zarar veriyor.
  • Paketiniz bağlantınız için "çok büyük" ise, paket bırakılır ve kaynak sunucuya paket boyutunu azaltmasını ve yeniden göndermesini isteyen bir ICMP tip 2 ("Paket çok büyük") mesajı gönderilmesi gerekir.
  • ICMP iletisi sunucuya iletmezse, sunucu büyük paketi yeniden göndermeye devam eder - bu çok büyük olduğu için hemen bırakılır.
  • Bu "karadelik" olarak tanımlanmıştır, çünkü paketler asla hedeflerine ulaşmaz.

Bu nedenle, güvenlik duvarı kurallarınızın ICMPv6 iletilerini kabul edecek şekilde ayarlandığından emin olmak isteyebilirsiniz ("gerekli" ICMP türlerinin listesi için bkz. RFC4890).

Benim durumumda, ICMP mesajlarına izin veriyorum ve yine de sorun var. Havlu atmaya ve ağımın MTU'sunu (nükleer seçenek) azaltmaya hazır değilim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.