2016-03-20 09:40:35 +00:00
|
|
|
# rewrite
|
|
|
|
|
|
2017-07-24 08:24:53 -07:00
|
|
|
*rewrite* performs internal message rewriting.
|
|
|
|
|
|
|
|
|
|
Rewrites are invisible to the client. There are simple rewrites (fast) and complex rewrites
|
|
|
|
|
(slower), but they're powerful enough to accommodate most dynamic back-end applications.
|
2016-03-20 09:40:35 +00:00
|
|
|
|
|
|
|
|
## Syntax
|
|
|
|
|
|
|
|
|
|
~~~
|
2017-02-07 16:53:16 -05:00
|
|
|
rewrite FIELD FROM TO
|
2016-03-20 09:40:35 +00:00
|
|
|
~~~
|
|
|
|
|
|
2017-02-07 16:53:16 -05:00
|
|
|
* **FIELD** is (`type`, `class`, `name`, ...)
|
2016-10-10 20:13:22 +01:00
|
|
|
* **FROM** is the exact name of type to match
|
|
|
|
|
* **TO** is the destination name or type to rewrite to
|
2016-03-20 09:40:35 +00:00
|
|
|
|
2017-02-07 16:53:16 -05:00
|
|
|
When the FIELD is `type` and FROM is (`A`, `MX`, etc.), the type of the message will be rewritten;
|
|
|
|
|
e.g., to rewrite ANY queries to HINFO, use `rewrite type ANY HINFO`.
|
2016-03-20 09:40:35 +00:00
|
|
|
|
2017-02-07 16:53:16 -05:00
|
|
|
When the FIELD is `class` and FROM is (`IN`, `CH`, or `HS`) the class of the message will be
|
|
|
|
|
rewritten; e.g., to rewrite CH queries to IN use `rewrite class CH IN`.
|
2016-04-04 15:45:17 +01:00
|
|
|
|
2017-02-07 16:53:16 -05:00
|
|
|
When the FIELD is `name` the query name in the message is rewritten; this
|
|
|
|
|
needs to be a full match of the name, e.g., `rewrite name miek.nl example.org`.
|
2016-03-20 09:40:35 +00:00
|
|
|
|
2017-03-06 16:32:17 -05:00
|
|
|
When the FIELD is `edns0` an EDNS0 option can be appended to the request as described below.
|
|
|
|
|
|
2016-08-22 14:38:33 -07:00
|
|
|
If you specify multiple rules and an incoming query matches on multiple (simple) rules, only
|
2016-04-07 17:42:35 +01:00
|
|
|
the first rewrite is applied.
|
2016-03-20 10:44:03 +00:00
|
|
|
|
2017-03-06 16:32:17 -05:00
|
|
|
## EDNS0 Options
|
2017-02-07 16:53:16 -05:00
|
|
|
|
2017-03-06 16:32:17 -05:00
|
|
|
Using FIELD edns0, you can set, append, or replace specific EDNS0 options on the request.
|
2016-03-20 09:40:35 +00:00
|
|
|
|
2017-03-06 16:32:17 -05:00
|
|
|
* `replace` will modify any matching (what that means may vary based on EDNS0 type) option with the specified option
|
|
|
|
|
* `append` will add the option regardless of what options already exist
|
|
|
|
|
* `set` will modify a matching option or add one if none is found
|
2016-03-20 09:40:35 +00:00
|
|
|
|
2017-03-06 16:32:17 -05:00
|
|
|
Currently supported are `EDNS0_LOCAL` and `EDNS0_NSID`.
|
2016-03-20 09:40:35 +00:00
|
|
|
|
2017-03-06 16:32:17 -05:00
|
|
|
### `EDNS0_LOCAL`
|
2016-03-20 09:40:35 +00:00
|
|
|
|
2017-08-24 09:34:07 -07:00
|
|
|
This has two fields, code and data. A match is defined as having the same code. Data may be a string or a variable.
|
|
|
|
|
|
|
|
|
|
* A string data can be treated as hex if it starts with `0x`. Example:
|
2016-03-20 09:40:35 +00:00
|
|
|
|
|
|
|
|
~~~
|
2017-03-06 16:32:17 -05:00
|
|
|
rewrite edns0 local set 0xffee 0x61626364
|
2016-03-20 09:40:35 +00:00
|
|
|
~~~
|
|
|
|
|
|
2017-03-06 16:32:17 -05:00
|
|
|
rewrites the first local option with code 0xffee, setting the data to "abcd". Equivalent:
|
2016-03-20 09:40:35 +00:00
|
|
|
|
|
|
|
|
~~~
|
2017-03-06 16:32:17 -05:00
|
|
|
rewrite edns0 local set 0xffee abcd
|
2016-03-20 09:40:35 +00:00
|
|
|
~~~
|
|
|
|
|
|
2017-08-24 09:34:07 -07:00
|
|
|
* A variable data is specified with a pair of curly brackets `{}`. Following are the supported variables:
|
|
|
|
|
* {qname}
|
|
|
|
|
* {qtype}
|
|
|
|
|
* {client_ip}
|
|
|
|
|
* {client_port}
|
|
|
|
|
* {protocol}
|
|
|
|
|
* {server_ip}
|
|
|
|
|
* {server_port}
|
|
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
|
|
~~~
|
|
|
|
|
rewrite edns0 local set 0xffee {client_ip}
|
|
|
|
|
~~~
|
|
|
|
|
|
2017-03-06 16:32:17 -05:00
|
|
|
### `EDNS0_NSID`
|
2016-03-20 09:40:35 +00:00
|
|
|
|
2017-03-06 16:32:17 -05:00
|
|
|
This has no fields; it will add an NSID option with an empty string for the NSID. If the option already exists
|
|
|
|
|
and the action is `replace` or `set`, then the NSID in the option will be set to the empty string.
|