รับ Squid และ TPROXY ด้วย IPv6 ที่ทำงานบน CentOS 7


18

ฉันมีปัญหาในการที่ TPROXY ทำงานกับ Squid และ IPv6 บนเซิร์ฟเวอร์ CentOS 7 ก่อนหน้านี้ฉันใช้การตั้งค่าการสกัดกั้นทั่วไปกับ NAT แต่ จำกัด เฉพาะ IPv4 เท่านั้น ตอนนี้ฉันกำลังขยายการตั้งค่าเพื่อรวม IPv6 กับ TPROXY

ฉันใช้บทความ Squid wiki อย่างเป็นทางการในหัวเรื่องเพื่อกำหนดค่าทุกอย่าง:

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

จนถึงตอนนี้การกำหนดค่า TPROXY ดูเหมือนจะใช้งานได้กับ IPv4 โดยไม่มีปัญหา ด้วย IPv6 อย่างไรก็ตามการเชื่อมต่อหมดเวลาและทำงานไม่ถูกต้อง ฉันจะทำลายการตั้งค่าเพื่อความเข้าใจที่ดีขึ้น

หมายเหตุไฟร์วอลล์และกฎการกำหนดเส้นทางจะเหมือนกันทุกประการสำหรับ IPv4 ข้อแตกต่างเพียงอย่างเดียวคือinet6และip6tablesสำหรับการกำหนดค่ากฎที่อิงตาม IPv6 ในตัวอย่างด้านล่าง

  • ระบบปฏิบัติการและเคอร์เนล: 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 ของฉันด้วยไฟร์วอลล์และกฎการกำหนดเส้นทางต่อไปนี้ดัดแปลงจากบทความ wiki การกำหนดเส้นทางนโยบาย

ดูเหมือนว่าจะทำงานได้ดีในแง่ของการส่งปริมาณข้อมูลไปยังกล่อง Squid กฎเพิ่มเติมอีกข้อหนึ่งที่ฉันต้องเพิ่มในเราเตอร์ DD-WRT นอกเหนือจากข้างต้นคือกฎข้อยกเว้นสำหรับที่อยู่ IPv4 และ IPv6 ขาออกที่กำหนดค่าไว้ในกล่อง Squid ไม่เช่นนั้นฉันจะได้รับปัญหาวงวนอย่างบ้าคลั่งและปริมาณการใช้งาน ระบบ LAN 3128หลักที่ใช้ในปลาหมึก

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

ในกล่อง Squid ฉันใช้กฎการจัดเส้นทางต่อไปนี้และ DIVERT chain เพื่อจัดการปริมาณข้อมูลตามนั้น ฉันต้องการเพิ่มกฎเพิ่มเติมเพื่อป้องกันข้อผิดพลาดใด ๆ ที่มีอยู่แล้วระหว่างการทดสอบ ไฟร์วอลล์ของฉันคือ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 ถูกกำหนดค่าสำหรับสองพอร์ต:

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

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 ที่ใช้งานไม่ได้

ในที่สุดการเชื่อมต่อ IPv6 นั้นใช้งานไม่ได้อย่างสมบูรณ์สำหรับไคลเอนต์ TPROXY (ไคลเอนต์ LAN บนพอร์ต3128ที่ใช้ไฟล์ WPAD / PAC มีการทำงานอย่างเต็มที่ IPv6) ในขณะที่มันปรากฏขึ้นการจราจรจะถูกส่งไปยังกล่องปลาหมึกในบางวิธีการร้องขอไม่เกิน IPv6 ผ่าน TPROXY access.logจะปรากฏใน IPv6 ทั้งหมดร้องขอทั้งตัวอักษร IPv6 และ DNS หมดเวลา ฉันสามารถเข้าถึงไคลเอนต์ IPv6 ภายใน แต่อีกครั้งการรับส่งข้อมูลนี้ไม่ได้ถูกบันทึกไว้เช่นกัน

ฉันทำการทดสอบโดยใช้ test-ipv6.com และพบว่ามันตรวจพบที่อยู่ Squid IPv6 ขาออกของฉัน แต่การทดสอบ IPv6 นั้นแสดงว่าไม่ดี / ช้าหรือหมดเวลา ฉันเปิดใช้งานส่วนหัวผ่านชั่วคราวและพบส่วนหัว Squid HTTP ปรากฏขึ้นดังนั้นการรับส่งข้อมูลอย่างน้อยก็ไปที่กล่อง Squid แต่ไม่ได้กำหนดเส้นทางอย่างถูกต้องเมื่ออยู่ที่นั่น

ฉันพยายามที่จะทำให้มันใช้งานได้ในบางครั้งและไม่สามารถหาสิ่งที่เป็นปัญหาได้ฉันยังถามในรายชื่อผู้รับจดหมาย Squid แต่ไม่สามารถวินิจฉัยปัญหาที่เกิดขึ้นจริงหรือแก้ไขได้ จากการทดสอบของฉันฉันค่อนข้างมั่นใจว่ามันเป็นหนึ่งในพื้นที่ต่อไปนี้และปัญหา Squid box:

  • เส้นทาง
  • เมล็ด
  • ไฟร์วอลล์

ความคิดและขั้นตอนเพิ่มเติมที่ฉันสามารถทำเพื่อให้ 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) ในภายหลังเพื่อแยกแยะข้อบกพร่อง / ปัญหาการเปิดตัว แต่ปัญหายังคงอยู่
James White

1
เพิ่งแสดงความคิดเห็นว่าฉันได้ทำงานนี้ประมาณหนึ่งปีที่ผ่านมาในกล่อง CentOS 6 อย่างไรก็ตามทันใดนั้นก็หยุดทำงานหนึ่งวัน (หลังจากที่ฉันคิดว่าเคอร์เนลอัพเดต) และฉันก็ไม่สามารถจัดการให้มันทำงานได้ ถ้าฉันเปิดใช้งานการตั้งค่า IPv6 TPROXY โดยทั่วไปแล้วมันจะแบ่งการรับส่งข้อมูลพอร์ต 80 ทั้งหมดและไม่มีอะไรถึงปลาหมึก ฉันได้ยอมแพ้กับมันในขณะนี้ เคอร์เนลที่ฉันใช้อยู่ในปัจจุบันคือ 2.6.32 - ฉันทราบว่าในwiki.squid-cache.org/Features/Tproxy4พวกเขาแสดงรายการเคอร์เนลขั้นต่ำที่ 2.6.37 ดังนั้นฉันจึงขาดมัน ถ้าฉันเคยพูดออกไปฉันจะอัพเดทที่นี่พร้อมกับสิ่งที่ฉันค้นพบ
parkamark

ในที่สุดฉันก็ได้งานนี้ ปัญหาเกิดขึ้นจากการที่พอร์ต "ตัด" ของ IPv4 เท่ากับพอร์ต IPv6 "tproxy" ใน squid.conf - นี่เป็นรายละเอียดในเอกสารประกอบ แต่ฉันคิดว่าฉันสามารถหลีกเลี่ยงได้เพราะไม่ได้ทำเช่นนี้เพราะฉันมีพอร์ตเหล่านี้คอยรับฟัง ที่อยู่เฉพาะ / สแต็คพร้อมกับพอร์ตดังนั้นจึงไม่มีเหตุผลที่เฉพาะเจาะจงว่าทำไมพวกเขาควรขัดแย้งกันใช่ไหม? ดูเหมือนว่าจะเป็นข้อสันนิษฐานที่ผิดพลาด อ่านต่อ ...
parkamark

ฉันได้กำหนด "http_port 192.168.0.1:3128 การสกัดกั้น" และ "http_port [fd00 :: 2]: 3128 tproxy" ใน squid.conf - อย่าทำอย่างนี้! ต้องเป็นเพียง "http_port 3128 intercept" และ "http_port 3129 tproxy" คุณไม่สามารถมีพอร์ต IPv6 tproxy ผูกกับที่อยู่ IPv6 ที่เฉพาะเจาะจงและคาดว่าไฟร์วอลล์ / มายากลเส้นทางทั้งหมดจะทำงาน คุณสามารถระบุพอร์ตได้เพียงอย่างเดียวหมายความว่า squid จะผูกกับที่อยู่ / อินเตอร์เฟสทั้งหมดในพอร์ตเหล่านี้ ฉันจะเพิ่มกฎไฟร์วอลล์เพื่อล็อคพอร์ตที่เปิดเหล่านี้ตามต้องการ
parkamark

คำตอบ:


1

ฉันรู้ว่านี่เก่าแล้วและฉันก็ไม่ได้ตอบคำถามนี้อย่างเต็มตัว แต่ฉันกำลังทำสิ่งที่คล้ายกับคุณมากและมีอาการเกือบเหมือนกัน

ข้อแรก: test-ipv6.com ดูเหมือนจะอัปเดตตัวเองเมื่อไม่นานมานี้เพื่อให้สามารถจัดการกับข้อผิดพลาดประเภทใหม่ได้ (มันพังเมื่อต้นปีนี้) ให้ทดสอบอีกครั้ง

ในกรณีของผมมันส่งฉันไปยัง URL ที่อธิบายถึงปัญหาที่ฉันดูเหมือนจะมี: เส้นทาง MTU การตรวจสอบคำถามที่พบบ่อย พวกเขามี URL ที่คุณสามารถใช้กับ cURL เพื่อทำการทดสอบ PMTUD จากนั้นคุณสามารถตรวจสอบปริมาณข้อมูลของคุณโดยใช้tpcdumpหรือใช้wireshark

เมื่อปริมาณการใช้งาน TPROXY ผ่าน Squid การตรวจจับ MTU ของเส้นทาง IPv6 จะไม่ทำงานกับโฮสต์ของคุณทั้งหมด (ฉันยังคงทำงานต่อไปทำไมมันไม่ทำงานบนโฮสต์ของฉันดังนั้นฉันจึงไม่มีวิธีแก้ปัญหาที่ชัดเจน)

คำอธิบายอย่างรวดเร็ว:

  • ICMP มีความสำคัญอย่างยิ่งใน IPv6 ผู้คนจำนวนมากต้องการบล็อก ICMP และจบลงด้วยการก่อให้เกิดอันตรายมากกว่าดี
  • หากแพ็กเก็ตมีขนาด "ใหญ่เกินไป" สำหรับการเชื่อมต่อของคุณแพ็กเก็ตจะถูกดร็อปและข้อความ ICMP ประเภท 2 ("แพ็คเก็ตใหญ่เกินไป") ควรถูกส่งไปยังเซิร์ฟเวอร์ต้นทางเพื่อขอให้ลดขนาดแพ็คเก็ตและส่งซ้ำ
  • หากข้อความ ICMP ไม่ได้ส่งไปยังเซิร์ฟเวอร์เซิร์ฟเวอร์จะส่งแพ็กเก็ตจำนวนมากซึ่งจะลดลงทันทีเนื่องจากมีขนาดใหญ่เกินไป
  • สิ่งนี้ถูกอธิบายว่าเป็น"หลุมดำ"เพราะแพ็คเก็ตไม่เคยไปถึงปลายทาง

ดังนั้นคุณอาจต้องการตรวจสอบให้แน่ใจว่ากฎไฟร์วอลล์ของคุณถูกตั้งค่าให้รับข้อความ ICMPv6 (ดู RFC4890 สำหรับรายการประเภท ICMP ที่ "จำเป็น")

ในกรณีของฉันฉันอนุญาตข้อความ ICMP และยังมีปัญหาอยู่ ฉันยังไม่พร้อมที่จะโยนผ้าเช็ดตัวและลด MTU ของเครือข่ายของฉัน (ซึ่งเป็นตัวเลือกนิวเคลียร์)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.