I found a partial solution to my problem. With the following configuration, the source client IP is correctly printed by a php script (getip.php), but not in httpd logs.
Does anyone has an example with "transparent forward" please ? relayd.conf : http protocol "http" { tcp { nodelay, sack, socket buffer 65536, backlog 100 } include "/etc/relayd.proxy.conf" pass } http protocol "https" { tcp { nodelay, sack, socket buffer 65536, backlog 100 } include "/etc/relayd.proxy.conf" tls { \ cipher-server-preference,\ no tlsv1.0\ } pass } relay "www" { listen on 127.0.0.1 port 8080 protocol "http" forward to destination } relay "wwwtls" { listen on 127.0.0.1 port 8443 tls protocol "https" forward with tls to destination } /etc/relayd.proxy.conf: return error match header set "X-Forwarded-For" value "$REMOTE_ADDR" match header set "X-Forwarded-By" value "$SERVER_ADDR:$SERVER_PORT" match header set "Keep-Alive" value "$TIMEOUT" match query hash "sessid" match request header remove "Proxy" match response header set "Cache-Control" value "max-age=1814400" match response header set "X-Xss-Protection" value "1; mode=block" match response header set "Frame-Options" value "SAMEORIGIN" match response header set "X-Frame-Options" value "SAMEORIGIN" match response header set "X-Robots-Tag" value "index,nofollow" match response header set "X-Powered-By" value "Powered with electricity on OpenBSD" match response header set "X-Permitted-Cross-Domain-Policies" value "none" match response header set "X-Download-Options" value "noopen" match response header set "X-Content-Type-Options" value "nosniff" ~ ~ /etc/pf.conf: ... pass in quick on $ext_if proto tcp to port www divert-to 127.0.0.1 port 8080 flags S/SA modulate state pass in quick on $ext_if proto tcp to port https divert-to 127.0.0.1 port 8443 flags S/SA modulate state # tout ouvert en sortie pass out on $ext_if proto { tcp udp icmp ipv6-icmp } all modulate state /etc/httpd.conf: listen on * port 80 listen on * tls port 443 hsts preload tls { certificate "/etc/ssl/acme/yeuxdelibad.net-fullchain.pem" key "/etc/ssl/acme/private/yeuxdelibad.net-privkey.pem" ticket lifetime default } ... getip.php: <?php header('Cache-Control: public, max-age=3600'); if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip = $_SERVER['REMOTE_ADDR']; } echo $ip ;