Setting up transparent HTTPS proxying presents unique technical hurdles compared to HTTP. The key issue lies in SSL/TLS encryption - the proxy must intercept encrypted traffic without breaking the secure channel. Here's why your current setup fails on HTTPS:
# Current symptom observation
$ curl https://www.google.com # Hangs indefinitely
$ tcpdump -i eth0 port 443 # Shows TCP handshake but no data flow
For HTTPS transparency, these elements must be properly configured:
- Firehol's NAT redirection rules for port 443
- Tinyproxy's SSL interception capability
- Certificate management for MITM functionality
- Kernel IP forwarding settings
Modify your firehol.conf to handle SSL interception:
# Enable NAT and proper routing
router wan2lan inface eth0 outface eth1
route all accept
# Transparent proxy rules
transparent_proxy "80 443" 8888 proxy ssl
policy return
mark 1
tcpflags syn log "New connection"
The crucial SSL-related additions to tinyproxy.conf:
# Essential SSL interception parameters
SSLCertificate "/etc/ssl/certs/proxy-ca.crt"
SSLKey "/etc/ssl/private/proxy-ca.key"
SSLPort 8888
SSLValidateCert off # For testing only
SSLCiphers "HIGH:!aNULL:!MD5"
SSLProtocol ALL -SSLv2 -SSLv3
Create a CA certificate for SSL interception:
openssl genrsa -out proxy-ca.key 2048
openssl req -new -x509 -days 3650 \
-key proxy-ca.key -out proxy-ca.crt \
-subj "/CN=Transparent Proxy CA"
chmod 600 proxy-ca.key
Essential system configurations:
# Enable IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
# Configure iptables for SSL redirection
iptables -t nat -A PREROUTING -p tcp --dport 443 \
-j REDIRECT --to-ports 8888
# Allow forwarded packets
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
When troubleshooting, check these critical points:
# Verify tinyproxy is handling SSL
netstat -tulnp | grep 8888
# Check firewall rules
firehol status
# Monitor SSL handshake
openssl s_client -connect localhost:8888 \
-CAfile /etc/ssl/certs/proxy-ca.crt
For production environments, add these optimizations:
# In tinyproxy.conf
IdleTimeout 300
MaxClients 200
SSLSessionCacheTimeout 600
SSLCompression off
When setting up a transparent proxy, HTTP traffic typically works out of the box while HTTPS presents unique challenges. The fundamental difference lies in how SSL/TLS encryption operates - the initial CONNECT handshake requires special handling that standard transparent proxy configurations often miss.
For HTTPS transparent proxying to function properly, three key elements must align:
# Required iptables rules for SSL interception
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8888
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8888
The default TinyProxy configuration needs these essential modifications:
# Enhanced tinyproxy.conf for HTTPS support
ConnectPort 443
ConnectPort 563
SSLListen on
SSLCertFile "/path/to/your/cert.pem"
SSLKeyFile "/path/to/your/key.pem"
Upstream corporate.fire.wall:8080
DisableViaHeader Yes
Your current FireHOL configuration needs adjustment for proper SSL handling:
# Improved firehol.conf
transparent_proxy "80 443" 8888 proxy ssl
interface any world
policy return
client all accept
server all accept
When troubleshooting, these diagnostic commands prove invaluable:
# Monitor real-time traffic
tcpdump -i any port 443 or port 8888 -nn -A
tail -f /var/log/tinyproxy/tinyproxy.log | grep -i ssl
For proper SSL interception, you'll need to generate and deploy certificates:
# Generate self-signed cert for testing
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem \
-days 365 -nodes -subj "/CN=proxy.example.com"
Here's a verified configuration that works for both HTTP and HTTPS:
# Final tinyproxy.conf
User nobody
Group nogroup
Port 8888
Listen 0.0.0.0
Timeout 600
LogLevel Connect
ConnectPort 443
SSLListen On
SSLCertFile "/etc/tinyproxy/cert.pem"
SSLKeyFile "/etc/tinyproxy/key.pem"
Upstream none
DisableViaHeader Yes