caddyserver / forwardproxy

Forward proxy plugin for the Caddy web server
Apache License 2.0
582 stars 218 forks source link

Allow use of wildcard outside of `*.` prefix #102

Open mogul opened 1 year ago

mogul commented 1 year ago

Problem

From the docs:

For hostname, you can specify *. as a prefix to match domain and subdomains. For example, *.caddyserver.com will match caddyserver.com, subdomain.caddyserver.com, but not fakecaddyserver.com.

Active word: prefix.

This implementation is constraining how well I can address a real-world example: New Relic says that their agent traffic is ingested via collector*.newrelic.com. If I try to specify that pattern, I get this from Caddy:

2023-05-04T18:10:04.94+0000 [APP/PROC/WEB/0] ERR run: loading initial config: loading new config: loading http app module: provision http: server srv0: setting up route handlers: route 0: loading handler modules: position 0: loading module 'subroute': provision http.handlers.subroute: setting up subroutes: route 0: loading handler modules: position 0: loading module 'forward_proxy': provision http.handlers.forward_proxy: *-[api.newrelic.com](http://api.newrelic.com/) could not be parsed as either IP, IP network, or domain: character * is not allowed

Since I can't specify collector*.newrelic.com for an acl directive I instead have to allow traffic to all of *.newrelic.com which is very overbroad for what I want!

Proposed solution

acl patterns like collector*.newrelic.com and *-api.newrelic.com should be supported.

mholt commented 1 year ago

The restriction is defined by TLS certificate validation rules regarding wildcards. The Caddyfile conflates the TLS certificate name and the Host for routing HTTP requests. But you can probably do what you want with a regex matcher inside a site block. I'm mobile at the moment but you can probably find what you need in our docs.

mholt commented 1 year ago

Oh, you know -- my bad. This is an ACL rule, duh. (See, I was mobile, I should just wait until I'm at my computer.)

I think the ACL rules don't currently support any wildcard characters. But they probably should. Want to submit a PR?

mogul commented 1 year ago

Given my Go skills, I don't think you want me to do that. ;)

mogul commented 1 year ago

I think the ACL rules don't currently support any wildcard characters.

I've tested that it works with things like *.newrelic.com and *.google.com; it's only when the * is in the middle of a subdomain that's not accepted.

mholt commented 1 year ago

@mogul Only *. as a prefix works, not * in isolation.