This plugin is very simple: take the client IP and port and write them to some headers.
This is done by using the Go field net/http.Request.RemoteAddr
which is composed of IP:port
of the client connection.
To mimic nginx's behaviour of X-Forwarded-Port
, where it sets that header to the client's port, then use the dynamic middleware config:
middlewares:my-middleware:plugin:remoteaddr:headers:port: X-Forwarded-Port
Alternatively, you could use the non-standard X-Real-Port
to not override Traefik's behavior:
middlewares:my-middleware:plugin:remoteaddr:headers:port: X-Real-Port
Traefik static configuration must define the module name (as is usual for Go packages).
The following declaration (given here in YAML) defines a plugin:
# Static configurationexperimental:plugins:remoteaddr:moduleName: github.com/RiskIdent/traefik-remoteaddr-pluginversion: v0.1.0
# Static configuration--experimental.plugins.remoteaddr.moduleName=github.com/RiskIdent/traefik-remoteaddr-plugin--experimental.plugins.remoteaddr.version=v0.1.0
Here is an example of a file provider dynamic configuration (given here in YAML), where the interesting part is the http.middlewares
section:
# Dynamic configurationhttp:middlewares:my-middleware:plugin:remoteaddr:headers:# if set, then set header "X-Real-Address" to the RemoteAddr (e.g "192.168.1.2:1234")address: X-Real-Address# if set, then set header "X-Real-Ip" to the IP of RemoteAddr (e.g "192.168.1.2")ip: X-Real-Ip# if set, then set header "X-Real-Port" to the port of RemoteAddr (e.g "1234")port: X-Real-Port
# Dynamic configurationapiVersion: traefik.io/v1alpha1kind: Middlewaremetadata:name: my-middlewarespec:plugin:remoteaddr:headers:# if set, then set header "X-Real-Address" to the RemoteAddr (e.g "192.168.1.2:1234")address: X-Real-Address# if set, then set header "X-Real-Ip" to the IP of RemoteAddr (e.g "192.168.1.2")ip: X-Real-Ip# if set, then set header "X-Real-Port" to the port of RemoteAddr (e.g "1234")port: X-Real-Port
Traefik also offers a developer mode that can be used for temporary testing of plugins not hosted on GitHub. To use a plugin in local mode, the Traefik static configuration must define the module name (as is usual for Go packages) and a path to a Go workspace, which can be the local GOPATH or any directory.
The plugins must be placed in ./plugins-local
directory,
which should be in the working directory of the process running the Traefik binary.
The source code of the plugin should be organized as follows:
$ tree ./plugins-local/./plugins-local/└── src└── github.com└── RiskIdent└── traefik-remoteaddr-plugin├── plugin.go├── plugin_test.go├── go.mod├── LICENSE├── Makefile└── README.md
# Static configurationexperimental:localPlugins:remoteaddr:moduleName: github.com/RiskIdent/traefik-remoteaddr-plugin
# Static configuration--experimental.localPlugins.remoteaddr.moduleName=github.com/RiskIdent/traefik-remoteaddr-plugin
(In the above example, the traefik-remoteaddr-plugin
plugin will be loaded from the path ./plugins-local/src/github.com/RiskIdent/traefik-remoteaddr-plugin
.)