Squid im Intercept-Modus via TPROXY mit nftables: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Zeile 5: Zeile 5:
 
* Der Squid-Proxy läuft auf einer separaten Maschine mit der IP 10.88.113.51
 
* Der Squid-Proxy läuft auf einer separaten Maschine mit der IP 10.88.113.51
 
* Der Proxy soll HTTP (Port 80) und HTTPS (Port 443) Verkehr transparent abfangen.
 
* Der Proxy soll HTTP (Port 80) und HTTPS (Port 443) Verkehr transparent abfangen.
* Die Original-Ziel-IP soll erhalten bleiben – daher wird auf der Firewall DNAT gemacht, und **TPROXY erfolgt auf dem Proxyserver**.
+
* Die Original-Ziel-IP soll erhalten bleiben – kein DNAT, sondern reines Routing mit Policy-Markierung.
* Die Firewall nutzt nftables für DNAT.
+
* TPROXY erfolgt ausschließlich auf dem Proxyserver.
* Der Proxyserver setzt nftables und Policy Routing für TPROXY ein.
 
  
 
== nftables-Regeln auf der Firewall ==
 
== nftables-Regeln auf der Firewall ==
;NAT-Tabelle und Weiterleitung an den Proxy:
+
*Tabelle und Set anlegen:
*nft add table ip nat
+
nft add table inet fwmark
*nft add chain ip nat prerouting '{ type nat hook prerouting priority dstnat; policy accept; }'
+
nft add set inet fwmark ports { type inet_service\; flags constant\; elements = { 80, 443 } }
*nft add rule ip nat prerouting tcp dport 80  dnat to 10.88.113.51:3029
+
 
*nft add rule ip nat prerouting tcp dport 443 dnat to 10.88.113.51:3030
+
*Kette für PREROUTING:
 +
nft add chain inet fwmark prerouting '{ type filter hook prerouting priority mangle\; policy accept\; }'
 +
 
 +
*Markierung setzen:
 +
nft add rule inet fwmark prerouting ip daddr != 10.88.113.51 tcp dport @ports meta mark set 0x1
 +
 
 +
== Policy Routing auf der Firewall ==
 +
*ip rule add fwmark 1 lookup 100
 +
*ip route add 10.88.113.51 dev eth0 table 100
  
 
== nftables-Regeln auf dem Proxyserver ==
 
== nftables-Regeln auf dem Proxyserver ==
;Tabelle und Kette erstellen (Name nicht "tproxy", da reserviert):
+
*Tabelle und Kette erstellen:
*nft add table inet myproxy
+
nft add table inet myproxy
*nft add chain inet myproxy prerouting '{ type filter hook prerouting priority mangle; policy accept; }'
+
nft add chain inet myproxy prerouting '{ type filter hook prerouting priority mangle\; policy accept\; }'
  
;TPROXY-Regeln für HTTP und HTTPS:
+
*TPROXY-Regeln:
*nft add rule inet myproxy prerouting ip daddr 10.88.113.51 tcp dport 3029 tproxy ip to :3029 mark set 1
+
nft add rule inet myproxy prerouting ip daddr 10.88.113.51 tcp dport 3129 tproxy ip to :3129 meta mark set 0x1
*nft add rule inet myproxy prerouting ip daddr 10.88.113.51 tcp dport 3030 tproxy ip to :3030 mark set 1
+
nft add rule inet myproxy prerouting ip daddr 10.88.113.51 tcp dport 3130 tproxy ip to :3130 meta mark set 0x1
  
 
== Policy Routing auf dem Proxyserver ==
 
== Policy Routing auf dem Proxyserver ==
Zeile 29: Zeile 36:
 
*ip route add local 0.0.0.0/0 dev lo table 100
 
*ip route add local 0.0.0.0/0 dev lo table 100
  
== Notwendige Kernel-Module auf dem Proxyserver ==
+
== Kernel-Module auf dem Proxyserver laden ==
 
*modprobe nf_conntrack
 
*modprobe nf_conntrack
 
*modprobe nf_tproxy_ipv4
 
*modprobe nf_tproxy_ipv4
Zeile 35: Zeile 42:
 
*modprobe xt_TPROXY
 
*modprobe xt_TPROXY
  
== Squid-Setup auf dem Proxyserver ==
+
== Squid-Konfiguration auf dem Proxy ==
Squid muss mit TPROXY-Support kompiliert sein (mit --enable-linux-netfilter)
+
http_port 3129 tproxy
 
+
https_port 3130 ssl-bump tproxy cert=/etc/squid/certs/squid_proxyCA.pem key=/etc/squid/certs/squid_proxyCA.key
Squid-Konfiguration anpassen:
 
 
 
http_port 3029 tproxy
 
https_port 3030 tproxy ssl-bump cert=/etc/squid/certs/proxy.pem key=/etc/squid/certs/proxy.key
 
  
;Optional: SSL-Bump konfigurieren:
+
;Optional SSL-Bump:
ssl_bump peek all
+
ssl_bump peek all
ssl_bump bump all
+
ssl_bump bump all
sslproxy_cert_error allow all
+
sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER
+
sslproxy_flags DONT_VERIFY_PEER
  
 
== Squid-Rechte anpassen ==
 
== Squid-Rechte anpassen ==
 
*setcap cap_net_admin=eip /usr/sbin/squid
 
*setcap cap_net_admin=eip /usr/sbin/squid
  
== Test & Diagnose ==
+
== Logs & Diagnose ==
;Firewall:
+
*nft list chain inet fwmark prerouting
*nft list chain ip nat prerouting
 
 
 
;Proxyserver:
 
 
*nft list chain inet myproxy prerouting
 
*nft list chain inet myproxy prerouting
 
*ip rule show
 
*ip rule show
Zeile 62: Zeile 62:
 
*tail -f /var/log/squid/access.log
 
*tail -f /var/log/squid/access.log
 
*tail -f /var/log/squid/cache.log
 
*tail -f /var/log/squid/cache.log
 
== Hinweise ==
 
* Diese Konfiguration funktioniert nur, wenn der Proxyserver die Zieladresse 10.88.113.51 lokal empfangen kann.
 
* Clients müssen ggf. die Root-CA akzeptieren, wenn SSL-Bump aktiv ist.
 
* Für produktive Umgebungen ist WPAD mit explizitem Proxy oft die bessere Lösung.
 

Version vom 24. April 2025, 04:55 Uhr

Squid im Intercept-Modus via TPROXY auf separatem Proxyserver

Voraussetzungen

  • Die Firewall hat die interne IP 172.17.113.1
  • Der Squid-Proxy läuft auf einer separaten Maschine mit der IP 10.88.113.51
  • Der Proxy soll HTTP (Port 80) und HTTPS (Port 443) Verkehr transparent abfangen.
  • Die Original-Ziel-IP soll erhalten bleiben – kein DNAT, sondern reines Routing mit Policy-Markierung.
  • TPROXY erfolgt ausschließlich auf dem Proxyserver.

nftables-Regeln auf der Firewall

  • Tabelle und Set anlegen:

nft add table inet fwmark nft add set inet fwmark ports { type inet_service\; flags constant\; elements = { 80, 443 } }

  • Kette für PREROUTING:

nft add chain inet fwmark prerouting '{ type filter hook prerouting priority mangle\; policy accept\; }'

  • Markierung setzen:

nft add rule inet fwmark prerouting ip daddr != 10.88.113.51 tcp dport @ports meta mark set 0x1

Policy Routing auf der Firewall

  • ip rule add fwmark 1 lookup 100
  • ip route add 10.88.113.51 dev eth0 table 100

nftables-Regeln auf dem Proxyserver

  • Tabelle und Kette erstellen:

nft add table inet myproxy nft add chain inet myproxy prerouting '{ type filter hook prerouting priority mangle\; policy accept\; }'

  • TPROXY-Regeln:

nft add rule inet myproxy prerouting ip daddr 10.88.113.51 tcp dport 3129 tproxy ip to :3129 meta mark set 0x1 nft add rule inet myproxy prerouting ip daddr 10.88.113.51 tcp dport 3130 tproxy ip to :3130 meta mark set 0x1

Policy Routing auf dem Proxyserver

  • ip rule add fwmark 1 lookup 100
  • ip route add local 0.0.0.0/0 dev lo table 100

Kernel-Module auf dem Proxyserver laden

  • modprobe nf_conntrack
  • modprobe nf_tproxy_ipv4
  • modprobe nf_tproxy_ipv6
  • modprobe xt_TPROXY

Squid-Konfiguration auf dem Proxy

http_port 3129 tproxy https_port 3130 ssl-bump tproxy cert=/etc/squid/certs/squid_proxyCA.pem key=/etc/squid/certs/squid_proxyCA.key

Optional SSL-Bump

ssl_bump peek all ssl_bump bump all sslproxy_cert_error allow all sslproxy_flags DONT_VERIFY_PEER

Squid-Rechte anpassen

  • setcap cap_net_admin=eip /usr/sbin/squid

Logs & Diagnose

  • nft list chain inet fwmark prerouting
  • nft list chain inet myproxy prerouting
  • ip rule show
  • ip route show table 100
  • tail -f /var/log/squid/access.log
  • tail -f /var/log/squid/cache.log