Mercurial > prosody-modules
comparison mod_net_proxy/README.markdown @ 2930:9a62780e7ee2
mod_net_proxy: New module implementing PROXY protocol versions 1 and 2
| author | Pascal Mathis <mail@pascalmathis.com> |
|---|---|
| date | Thu, 15 Mar 2018 15:26:30 +0100 |
| parents | |
| children | 4bb3a4b726c9 |
comparison
equal
deleted
inserted
replaced
| 2929:3a104a900af1 | 2930:9a62780e7ee2 |
|---|---|
| 1 --- | |
| 2 labels: | |
| 3 - 'Stage-Alpha' | |
| 4 summary: 'Implementation of PROXY protocol versions 1 and 2' | |
| 5 ... | |
| 6 | |
| 7 Introduction | |
| 8 ============ | |
| 9 | |
| 10 This module implements the PROXY protocol in versions 1 and 2, which fulfills | |
| 11 the following usecase as described within the official protocol specifications: | |
| 12 | |
| 13 > Relaying TCP connections through proxies generally involves a loss of the | |
| 14 > original TCP connection parameters such as source and destination addresses, | |
| 15 > ports, and so on. | |
| 16 > | |
| 17 > The PROXY protocol's goal is to fill the server's internal structures with the | |
| 18 > information collected by the proxy that the server would have been able to get | |
| 19 > by itself if the client was connecting directly to the server instead of via a | |
| 20 > proxy. | |
| 21 | |
| 22 You can find more information about the PROXY protocol on | |
| 23 [the official website](https://www.haproxy.com/blog/haproxy/proxy-protocol/) | |
| 24 or within | |
| 25 [the official protocol specifications.](https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt) | |
| 26 | |
| 27 | |
| 28 Usage | |
| 29 ===== | |
| 30 | |
| 31 Copy the plugin into your prosody's modules directory. And add it | |
| 32 between your enabled modules into the global section (modules\_enabled). | |
| 33 | |
| 34 As the PROXY protocol specifications do not allow guessing if the PROXY protocol | |
| 35 shall be used or not, you need to configure separate ports for all the services | |
| 36 that should be exposed with PROXY protocol support: | |
| 37 | |
| 38 ```lua | |
| 39 proxy_ports = {15222, 15269} | |
| 40 proxy_port_mappings = { | |
| 41 [15222] = "c2s", | |
| 42 [15269] = "s2s" | |
| 43 } | |
| 44 ``` | |
| 45 | |
| 46 The above example configuration, which needs to be placed in the global section, | |
| 47 would listen on both tcp/15222 and tcp/15269. All incoming connections to these ports | |
| 48 have to be initiated by a PROXYv1 or PROXYv2 sender and will get mapped to the | |
| 49 configured service name after initializating the connection. | |
| 50 | |
| 51 Please note that each port handled by _mod_net_proxy_ must be mapped to another | |
| 52 service name by adding an item to _proxy_port_mappings_, otherwise a warning will | |
| 53 be printed during module initialization and all incoming connections to unmapped ports | |
| 54 will be dropped after processing the PROXY protocol requests. | |
| 55 | |
| 56 The service name can be found by analyzing the source of the module, as it is the | |
| 57 same name as specified within the _name_ attribute when calling | |
| 58 `module:provides("net", ...)` to initialize a network listener. The following table | |
| 59 shows the names for the most commonly used Prosody modules: | |
| 60 | |
| 61 ------------- -------------------------- | |
| 62 **Module** **Service Name** | |
| 63 c2s c2s (Plain/StartTLS) | |
| 64 s2s s2s (Plain/StartTLS) | |
| 65 proxy65 proxy65 (Plain) | |
| 66 http http (Plain) | |
| 67 net_multiplex multiplex (Plain/StartTLS) | |
| 68 ------------- -------------------------- | |
| 69 | |
| 70 This module should work with all services that are providing ports which either | |
| 71 offer plaintext or StartTLS-based encryption. Please note that instead of using | |
| 72 this module for HTTP-based services (BOSH/WebSocket) it might be worth resorting | |
| 73 to use proxy which is able to process HTTP and insert a _X-Forwarded-For_ header | |
| 74 instead. | |
| 75 | |
| 76 | |
| 77 Example | |
| 78 ======= | |
| 79 | |
| 80 This example provides you with a Prosody server that accepts regular connections on | |
| 81 tcp/5222 (C2S) and tcp/5269 (S2S) while also offering dedicated PROXY protocol ports | |
| 82 for both modules, configured as tcp/15222 (C2S) and tcp/15269 (S2S): | |
| 83 | |
| 84 ```lua | |
| 85 c2s_ports = {5222} | |
| 86 s2s_ports = {5269} | |
| 87 proxy_ports = {15222, 15269} | |
| 88 proxy_port_mappings = { | |
| 89 [15222] = "c2s", | |
| 90 [15269] = "s2s" | |
| 91 } | |
| 92 ``` | |
| 93 | |
| 94 After adjusting the global configuration of your Prosody server accordingly, you can | |
| 95 configure your desired sender accordingly. Below is an example for a working HAProxy | |
| 96 configuration which will listen on the default XMPP ports (5222+5269) and connect to | |
| 97 your XMPP backend running on 192.168.10.10 using the PROXYv2 protocol: | |
| 98 | |
| 99 ``` | |
| 100 defaults d-xmpp | |
| 101 mode tcp | |
| 102 option redispatch | |
| 103 option tcplog | |
| 104 option tcpka | |
| 105 option clitcpka | |
| 106 option srvtcpka | |
| 107 | |
| 108 timeout connect 5s | |
| 109 timeout client 24h | |
| 110 timeout server 60m | |
| 111 | |
| 112 frontend f-xmpp | |
| 113 bind :5222,:5269 | |
| 114 use_backend b-xmpp-c2s if { dst_port eq 5222 } | |
| 115 use_backend b-xmpp-s2s if { dst_port eq 5269 } | |
| 116 | |
| 117 backend b-xmpp-c2s | |
| 118 balance roundrobin | |
| 119 option independant-streams | |
| 120 server mycoolprosodybox 192.168.10.10:15222 send-proxy-v2 | |
| 121 | |
| 122 backend b-xmpp-s2s | |
| 123 balance roundrobin | |
| 124 option independant-streams | |
| 125 server mycoolprosodybox 192.168.10.10:15269 send-proxy-v2 | |
| 126 ``` | |
| 127 | |
| 128 | |
| 129 Limitations | |
| 130 =========== | |
| 131 | |
| 132 It is currently not possible to use this module for offering PROXY protocol support | |
| 133 on SSL/TLS ports, which will automatically initiate a SSL handshake. This might be | |
| 134 possible in the future, but it currently does not look like this could easily be | |
| 135 implemented due to the current handling of such connections. | |
| 136 | |
| 137 | |
| 138 Important Notes | |
| 139 =============== | |
| 140 | |
| 141 Please do not expose any ports offering PROXY protocol to the internet - while regular | |
| 142 clients will be unable to use them anyways, it is outright dangerous and allows anyone | |
| 143 to spoof the actual IP address. It is highly recommended to only allow PROXY | |
| 144 connections from trusted sources, e.g. your loadbalancer. | |
| 145 | |
| 146 | |
| 147 Compatibility | |
| 148 ============= | |
| 149 | |
| 150 ----- ----- | |
| 151 trunk Works | |
| 152 0.10 Works | |
| 153 ----- ----- |
