New: Postgres Single-Listener Architecture
The postgres configuration has been redesigned from a list of independent listeners to a single shared listener fronting multiple upstream databases. One bind address serves many upstreams: the client selects the upstream by the dbname it sends in its startup message, and the proxy routes accordingly. A single shared credential handles all client authentication; routing is by database name, so per-database credentials are not required.
Multi-statement Simple Queries are now also supported. The proxy forwards a batch as long as every statement passes the role policy, and rejects the batch only if any statement attempts a role mutation (SET ROLE, set_config('role', ...)) or a DO block.
# Before
postgres:
- name: primary
listen: ":5432"
upstream:
host: "db.internal"
port: 5432
sslmode: "require"
user_env: "PG_UPSTREAM_USER"
password_env: "PG_UPSTREAM_PASSWORD"
database: "appdb"
client:
user: "app_user"
password_env: "PG_PROXY_PASSWORD"
role: "tenant_role"
# After
postgres:
listen: ":5432"
client:
user: app_user
password_env: PG_PROXY_PASSWORD
upstreams:
- database: appdb
dsn:
type: env
var: PG_APPDB_DSN
role: tenant_role
- database: analyticsdb
dsn:
type: env
var: PG_ANALYTICS_DSN
role: analytics_roleThis is a breaking config change for existing Postgres users. Migrate each entry in your postgres: list to an upstream under the new upstreams: key, replacing the per-listener upstream.host/port/... fields with a DSN source block. Postgres support is experimental.
New: File Secret Source
A new file secret source reads the secret from a path on disk. The file is re-read on every POST /v1/reload and on ttl expiry, so a long-lived proxy can pick up a rotated credential without restarting. Write the secret atomically (write-temp + rename) and call reload.
- source:
type: file
path: /etc/iron-proxy/secrets/OPENAI_API_KEY
proxy_value: "proxy-token-123"
match_headers: ["Authorization"]
rules:
- host: "api.openai.com"Optional ttl and failure_ttl are supported. The value is the exact file contents (no trimming), so the writer controls trailing whitespace. Thanks to @drewstone for the contribution.
New: Outbound Proxy Routing
iron-proxy now routes its own outbound connections through an upstream SOCKS5 or HTTP CONNECT proxy. The standard HTTP_PROXY, HTTPS_PROXY, and NO_PROXY environment variables are honored automatically, so most deployments need no config change. An optional upstream_proxy block is available when environment variables aren't convenient.
proxy:
upstream_proxy:
http_proxy: "http://proxy.corp:3128"
https_proxy: "http://proxy.corp:3128"
no_proxy: "localhost,127.0.0.1,.internal.example.com"This covers the HTTP/HTTPS forward data path (including CONNECT in mitm mode) and the OAuth credential-refresh client. Raw TCP tunnels (SNI-only passthrough, WebSocket) still dial directly. Note: when an upstream proxy is in use, upstream_deny_cidrs is enforced against the proxy's address rather than the final target, since the proxy resolves and connects to the target on iron-proxy's behalf.
New: 1Password Config Simplification
The host_env and token_env config fields on the 1password and 1password_connect secret sources have been removed. The SDK environment variable conventions (OP_SERVICE_ACCOUNT_TOKEN for 1password; OP_CONNECT_HOST and OP_CONNECT_TOKEN for 1password_connect) are now the only supported approach.
This is a breaking config change for 1password and 1password_connect users who set host_env or token_env. Remove those fields from your config.
Fixes
- Fixed
aws_authrejecting HTTPS CONNECT tunnel setup with 400/missing_sigv4before the signed request was ever sent. The synthetic CONNECT request used for tunnel policy checks can never carry a SigV4 signature; the transform now passes it through and signs the post-MITM request as intended. This affected boto3 and other clients routing HTTPS through a CONNECT proxy. Thanks to @0xdiid for the contribution. - Fixed percent-encoded reserved characters (e.g.,
%2F) being decoded before the upstream request was constructed, breaking APIs like GCS that route on encoded slashes within a path segment. - Fixed
gcp_auth,hmac_sign, andoauth_tokentransforms being silently dropped in managed mode at startup and on every reload.