Tôi gặp sự cố khi TPROXY hoạt động với Squid và IPv6 trên máy chủ CentOS 7. Trước đây tôi đã sử dụng một thiết lập chặn chung với NAT, nhưng nó chỉ giới hạn ở IPv4. Tôi hiện đang mở rộng thiết lập để bao gồm IPv6 với TPROXY.
Tôi đã sử dụng bài viết wiki Squid chính thức về chủ đề này để định cấu hình mọi thứ:
http://wiki.squid-cache.org/Features/Tproxy4
Cho đến nay, cấu hình TPROXY dường như đang hoạt động cho IPv4 mà không gặp vấn đề gì. Tuy nhiên, với IPv6, các kết nối đã hết thời gian và không hoạt động đúng. Tôi sẽ chia nhỏ thiết lập để hiểu rõ hơn.
Lưu ý tất cả các quy tắc tường lửa và định tuyến hoàn toàn giống nhau đối với IPv4, sự khác biệt duy nhất là inet6
và ip6tables
để định cấu hình các quy tắc dựa trên IPv6 trong các ví dụ bên dưới.
- Hệ điều hành và hạt nhân: CentOS 7 (3.10.0-229.14.1.el7.x86_64)
- Tất cả các gói được cập nhật theo yum
- Phiên bản mực: 3.3.8 (Cũng đã thử 3.5.9)
- Tường lửa: iptables / ip6tables 1.4.21
- libcap-2.22-8.el7.x86_64
Kết nối IPv6 hiện đang thông qua một đường hầm 6in4 thông qua Hurricane Electric, điều này được cấu hình trên bộ định tuyến DD-WRT và sau đó tiền tố được chỉ định được ủy quyền cho khách hàng thông qua radvd
. Hộp Squid có một số địa chỉ IPv6 tĩnh được cấu hình.
Hộp mực nằm trong mạng LAN chính mà nó đang phục vụ. Các máy khách đang có lưu lượng truy cập trên cổng 80 bị chặn (chủ yếu là các máy khách không dây) đang được đẩy đến hộp Mực thông qua bộ định tuyến DD-WRT của tôi với các quy tắc tường lửa và định tuyến sau, được điều chỉnh từ bài viết wiki Chính sách định tuyến và wiki DD-WRT
- 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
Điều này dường như hoạt động tốt về mặt truyền lưu lượng truy cập vào hộp Mực. Một quy tắc bổ sung mà tôi phải thêm vào bộ định tuyến DD-WRT ngoài các quy tắc trên là quy tắc ngoại lệ đối với các địa chỉ IPv4 và IPv6 gửi đi được định cấu hình trên hộp Mực, nếu không, tôi gặp sự cố vòng lặp điên rồ và lưu lượng truy cập bị phá vỡ cho tất cả các máy khách bao gồm mạng LAN chính sử dụng Squid trên 3128
.
ip6tables -t mangle -I PREROUTING -p tcp --dport 80 -s "$OUTGOING_PROXY_IPV6" -j ACCEPT
Trên hộp Mực tôi sau đó sử dụng các quy tắc định tuyến sau và chuỗi DIVERT để xử lý lưu lượng phù hợp. Tôi cần thêm các quy tắc bổ sung để ngăn chặn bất kỳ lỗi nào với chuỗi đã tồn tại trong quá trình thử nghiệm. Tường lửa của tôi là CSF
, tôi đã thêm vào saucsfpre.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
được cấu hình cho hai cổng:
http_proxy 3128
http_proxy 3129 tproxy
Ngoài ra, tôi cũng đang sử dụng Privoxy và phải thêm no-tproxy
vào dòng cache_peer của mình, nếu không tất cả lưu lượng truy cập không thể được chuyển tiếp cho cả hai giao thức.
cache_peer localhost parent 8118 7 no-tproxy no-query no-digest
Tôi không sử dụng bất kỳ tcp_outgoing_address
chỉ thị nào vì Privoxy, thay vào đó tôi đang kiểm soát các địa chỉ gửi đi thông qua CentOS và thứ tự ràng buộc.
giá trị 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
Tôi không chắc chắn nếu các rp_filter
sửa đổi là cần thiết vì thiết lập hoạt động trên IPv4 có hoặc không có chúng và tạo ra kết quả tương tự cho IPv6.
TỰ ĐỘNG
SELINUX được bật trên hộp Mực, nhưng các chính sách đã được định cấu hình để cho phép thiết lập TPROXY, do đó, nó không bị chặn (dù sao hoạt động của IPv4 cũng hiển thị điều này). Tôi đã kiểm tra grep squid /var/log/audit/audit.log | audit2allow -a
và nhận<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;
Tôi cũng đã thiết lập các booleans sau:
setsebool squid_connect_any 1
setsebool squid_use_tproxy 1
Kết nối IPv6 bị hỏng
Cuối cùng, kết nối IPv6 bị hỏng hoàn toàn cho các máy khách TPROXY (máy khách LAN trên cổng 3128
sử dụng tệp WPAD / PAC có IPv6 hoạt động hoàn toàn). Mặc dù có vẻ như lưu lượng truy cập đang được chuyển đến hộp Mực theo một cách nào đó, không có yêu cầu nào qua IPv6 thông qua TPROXY xuất hiện trong access.log
. Tất cả IPv6 yêu cầu cả IPv6 và DNS theo nghĩa đen, hết thời gian. Tôi có thể truy cập các máy khách IPv6 nội bộ nhưng một lần nữa, lưu lượng này cũng không được ghi lại.
Tôi đã thực hiện một số thử nghiệm bằng cách sử dụng test-ipv6.com và thấy rằng nó đã phát hiện địa chỉ Squid IPv6 gửi đi của tôi nhưng các thử nghiệm IPv6 hiển thị là xấu / chậm hoặc hết thời gian. Tôi đã tạm thời kích hoạt tiêu đề thông qua và thấy tiêu đề Squid HTTP có thể nhìn thấy được, vì vậy lưu lượng truy cập ít nhất là vào hộp Squid nhưng không được định tuyến chính xác khi nó ở đó.
Tôi đã cố gắng để nó hoạt động được một thời gian và không thể tìm ra vấn đề là gì, tôi thậm chí đã hỏi trong danh sách gửi thư của Mực, nhưng không thể chẩn đoán vấn đề thực sự hoặc giải quyết nó. Dựa trên thử nghiệm của tôi, tôi khá chắc chắn rằng một trong những lĩnh vực sau đây và hộp Mực có vấn đề:
- định tuyến
- Hạt nhân
- Bức tường lửa
Mọi ý tưởng và các bước bổ sung mà tôi có thể thực hiện để TPROXY và IPv6 hoạt động sẽ được đánh giá rất cao!
Thông tin thêm
quy tắc 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
Bảng định tuyến IPv6 (tiền tố bị che khuất)
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