ฉันมีปัญหาในการที่ 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 การกำหนดเส้นทางนโยบาย
- 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 นอกเหนือจากข้างต้นคือกฎข้อยกเว้นสำหรับที่อยู่ 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