CentOS 7 서버에서 TPROXY가 Squid 및 IPv6과 함께 작동하는 데 문제가 있습니다. 이전에는 NAT와 함께 일반 인터셉트 설정을 사용하고 있었지만 IPv4로만 제한되었습니다. 이제 TPROXY에 IPv6을 포함하도록 설정을 확장하고 있습니다.
나는 주제에 관한 공식 오징어 위키 기사를 사용하여 모든 것을 구성했습니다.
http://wiki.squid-cache.org/Features/Tproxy4
지금까지 TPROXY 구성은 문제없이 IPv4에서 작동하는 것으로 보입니다. 그러나 IPv6을 사용하면 연결 시간이 초과되어 제대로 작동하지 않습니다. 이해를 돕기 위해 설정을 분석하겠습니다.
모든 방화벽을 참고 라우팅 규칙을 정확히 IPv4의 동일, 유일한 차이 inet6
와 ip6tables
아래의 예에서 IPv6 기반 규칙을 구성.
- OS 및 커널 : CentOS 7 (3.10.0-229.14.1.el7.x86_64)
- 모든 패키지는 yum에 따라 최신 상태입니다.
- 오징어 버전 : 3.3.8 (3.5.9도 시도)
- 방화벽 : iptables / ip6tables 1.4.21
- libcap-2.22-8.el7.x86_64
IPv6 연결은 현재 허리케인 일렉트릭을 통한 6in4 터널을 통해 이루어지며 DD-WRT 라우터에서 구성되고 지정된 접두사가을 통해 클라이언트에 위임됩니다 radvd
. 오징어 상자에는 여러 개의 고정 IPv6 주소가 구성되어 있습니다.
오징어 상자는 서비스를 제공하는 기본 LAN 내에 있습니다. 포트 80에서 트래픽이 차단 된 클라이언트 (주로 무선 클라이언트)는 다음 방화벽 및 라우팅 규칙이있는 DD-WRT 라우터를 통해 Squid 상자로 푸시됩니다. 정책 라우팅 위키 기사 및 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
트래픽을 오징어 상자로 전달한다는 점에서 정상 작동하는 것으로 보입니다. 위의 것 외에도 DD-WRT 라우터에 추가해야 할 하나의 규칙은 오징어 상자에 구성된 발신 IPv4 및 IPv6 주소에 대한 예외 규칙이었습니다. 그렇지 않으면 미친 루프 문제가 발생하여 트래픽을 포함한 모든 클라이언트의 트래픽이 중단됩니다 Squid on을 사용하는 기본 LAN 3128
.
ip6tables -t mangle -I PREROUTING -p tcp --dport 80 -s "$OUTGOING_PROXY_IPV6" -j ACCEPT
오징어 상자에서 다음 라우팅 규칙과 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
두 개의 포트로 구성되어 있습니다.
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는 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 연결이 완전히 끊어졌습니다 ( 3128
WPAD / PAC 파일을 사용하는 포트의 LAN 클라이언트는 IPv6가 완전히 작동합니다). 트래픽이 어떤 방식으로 오징어 상자로 라우팅되고있는 것처럼 보이지만 TPROXY를 통한 IPv6을 통한 요청은에 나타나지 않습니다 access.log
. 모든 IPv6는 리터럴 IPv6 및 DNS를 모두 요청합니다 (시간 종료). 내부 IPv6 클라이언트에 액세스 할 수 있지만이 트래픽도 기록되지 않습니다.
test-ipv6.com을 사용하여 몇 가지 테스트를 수행 한 결과 나가는 Squid IPv6 주소가 감지되었지만 IPv6 테스트는 불량 / 느린 속도 또는 시간 초과로 표시됩니다. via 헤더를 일시적으로 활성화하고 Squid HTTP 헤더가 표시되어 트래픽이 적어도 오징어 상자에 도착했지만 일단 오징어 상자에 제대로 라우팅되지 않았습니다.
나는 이것을 잠시 동안 작동 시키려고 노력했지만 문제가 무엇인지 찾을 수 없었습니다. 오징어 메일 링리스트에 요청했지만 실제 문제를 진단하거나 해결할 수는 없었습니다. 내 테스트를 바탕으로 다음 영역 중 하나와 오징어 상자에 문제가 있다고 확신합니다.
- 라우팅
- 핵심
- 방화벽
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