| @@ -1,3 +1,26 @@ | |||||
| # 2019-03-19 | |||||
| ## TLS support for Coturn | |||||
| We've added TLS support to the Coturn TURN server installed by the playbook by default. | |||||
| The certificates from the Matrix domain will be used for the Coturn server. | |||||
| This feature is enabled by default for new installations. | |||||
| To make use of TLS support for your existing Matrix server's Coturn, make sure to rebuild both Coturn and Synapse: | |||||
| ```bash | |||||
| ansible-playbook -i inventory/hosts setup.yml --tags=setup-coturn,setup-synapse,start | |||||
| ``` | |||||
| People who have an extra firewall (besides the iptables firewall, which Docker manages automatically), will need to open these additional firewall ports: `5349/tcp` (TURN over TCP) and `5349/udp` (TURN over UDP). | |||||
| People who build their own custom playbook from our roles should be aware that: | |||||
| - the `matrix-coturn` role and actually starting Coturn (e.g. `--tags=start`), requires that certificates are already put in place. For this reason, it's usually a good idea to have the `matrix-coturn` role execute after `matrix-nginx-proxy` (which retrieves the certificates). | |||||
| - there are a few variables that can help you enable TLS support for Coturn. See the `matrix-coturn` section in [group_vars/matrix-servers](./group_vars/matrix-servers). | |||||
| # 2019-03-12 | # 2019-03-12 | ||||
| ## matrix-nginx-proxy support for serving the base domain | ## matrix-nginx-proxy support for serving the base domain | ||||
| @@ -12,6 +12,6 @@ | |||||
| - properly configured DNS records for `<your-domain>` (details in [Configuring DNS](configuring-dns.md)) | - properly configured DNS records for `<your-domain>` (details in [Configuring DNS](configuring-dns.md)) | ||||
| - some TCP/UDP ports open. This playbook configures the server's internal firewall for you. In most cases, you don't need to do anything special. But **if your server is running behind another firewall**, you'd need to open these ports: `80/tcp` (HTTP webserver), `443/tcp` (HTTPS webserver), `3478/tcp` (STUN over TCP), `3478/udp` (STUN over UDP), `8448/tcp` (Matrix Federation API HTTPS webserver), the range `49152-49172/udp` (TURN over UDP). | |||||
| - some TCP/UDP ports open. This playbook configures the server's internal firewall for you. In most cases, you don't need to do anything special. But **if your server is running behind another firewall**, you'd need to open these ports: `80/tcp` (HTTP webserver), `443/tcp` (HTTPS webserver), `3478/tcp` (TURN over TCP), `3478/udp` (TURN over UDP), `5349/tcp` (TURN over TCP), `5349/udp` (TURN over UDP), `8448/tcp` (Matrix Federation API HTTPS webserver), the range `49152-49172/udp` (TURN over UDP). | |||||
| When ready to proceed, continue with [Configuring DNS](configuring-dns.md). | When ready to proceed, continue with [Configuring DNS](configuring-dns.md). | ||||
| @@ -93,6 +93,14 @@ matrix_coturn_enabled: true | |||||
| matrix_coturn_turn_external_ip_address: "{{ ansible_host }}" | matrix_coturn_turn_external_ip_address: "{{ ansible_host }}" | ||||
| matrix_coturn_tls_enabled: true | |||||
| matrix_coturn_tls_cert_path: "{{ matrix_ssl_config_dir_path }}/live/{{ matrix_server_fqn_matrix }}/fullchain.pem" | |||||
| matrix_coturn_tls_key_path: "{{ matrix_ssl_config_dir_path }}/live/{{ matrix_server_fqn_matrix }}/privkey.pem" | |||||
| matrix_coturn_container_additional_volumes: | |||||
| - src: "{{ matrix_ssl_config_dir_path }}" | |||||
| dst: "{{ matrix_ssl_config_dir_path }}" | |||||
| options: ro | |||||
| ###################################################################### | ###################################################################### | ||||
| # | # | ||||
| # /matrix-coturn | # /matrix-coturn | ||||
| @@ -351,11 +359,15 @@ matrix_synapse_email_smtp_require_transport_security: false | |||||
| matrix_synapse_email_notif_from: "Matrix <{{ matrix_mailer_sender_address }}>" | matrix_synapse_email_notif_from: "Matrix <{{ matrix_mailer_sender_address }}>" | ||||
| matrix_synapse_email_riot_base_url: "https://{{ matrix_server_fqn_riot }}" | matrix_synapse_email_riot_base_url: "https://{{ matrix_server_fqn_riot }}" | ||||
| # Even if TURN doesn't support TLS (it does by default), | |||||
| # it doesn't hurt to try a secure connection anyway. | |||||
| matrix_synapse_turn_uris: | | matrix_synapse_turn_uris: | | ||||
| {{ | {{ | ||||
| [ | [ | ||||
| 'turn:' + matrix_server_fqn_matrix + ':3478?transport=udp', | |||||
| 'turn:' + matrix_server_fqn_matrix + ':3478?transport=tcp', | |||||
| 'turns:' + matrix_server_fqn_matrix + '?transport=udp', | |||||
| 'turns:' + matrix_server_fqn_matrix + '?transport=tcp', | |||||
| 'turn:' + matrix_server_fqn_matrix + '?transport=udp', | |||||
| 'turn:' + matrix_server_fqn_matrix + '?transport=tcp', | |||||
| ] | ] | ||||
| if matrix_coturn_enabled | if matrix_coturn_enabled | ||||
| else [] | else [] | ||||
| @@ -38,3 +38,10 @@ matrix_coturn_allowed_peer_ips: [] | |||||
| matrix_coturn_denied_peer_ips: [] | matrix_coturn_denied_peer_ips: [] | ||||
| matrix_coturn_user_quota: null | matrix_coturn_user_quota: null | ||||
| matrix_coturn_total_quota: null | matrix_coturn_total_quota: null | ||||
| # To enable TLS, you need to provide paths to certificates. | |||||
| # Paths defined in `matrix_coturn_tls_cert_path` and `matrix_coturn_tls_key_path` are in-container paths. | |||||
| # Files on the host can be mounted into the container using `matrix_coturn_container_additional_volumes`. | |||||
| matrix_coturn_tls_enabled: false | |||||
| matrix_coturn_tls_cert_path: ~ | |||||
| matrix_coturn_tls_key_path: ~ | |||||
| @@ -61,15 +61,40 @@ | |||||
| immediate: yes | immediate: yes | ||||
| permanent: yes | permanent: yes | ||||
| with_items: | with_items: | ||||
| - '3478/tcp' # STUN | |||||
| - '3478/udp' # STUN | |||||
| - '3478/tcp' | |||||
| - '3478/udp' | |||||
| - '5349/tcp' | |||||
| - '5349/udp' | |||||
| - "{{ matrix_coturn_turn_udp_min_port }}-{{ matrix_coturn_turn_udp_max_port }}/udp" # TURN | - "{{ matrix_coturn_turn_udp_min_port }}-{{ matrix_coturn_turn_udp_max_port }}/udp" # TURN | ||||
| when: "matrix_coturn_enabled and ansible_os_family == 'RedHat'" | when: "matrix_coturn_enabled and ansible_os_family == 'RedHat'" | ||||
| # This may be unnecessary when more long-lived certificates are used. | |||||
| # We optimize for the common use-case though (short-lived Let's Encrypt certificates). | |||||
| # Reloading doesn't hurt anyway, so there's no need to make this more flexible. | |||||
| - name: Ensure periodic reloading of matrix-coturn is configured for SSL renewal (matrix-coturn-reload) | |||||
| cron: | |||||
| user: root | |||||
| cron_file: matrix-coturn-ssl-reload | |||||
| name: matrix-coturn-ssl-reload | |||||
| state: present | |||||
| hour: 4 | |||||
| minute: 20 | |||||
| day: "*/5" | |||||
| job: /bin/systemctl reload matrix-coturn.service | |||||
| when: matrix_coturn_enabled and matrix_coturn_tls_enabled | |||||
| # | # | ||||
| # Tasks related to getting rid of Coturn (if it was previously enabled) | # Tasks related to getting rid of Coturn (if it was previously enabled) | ||||
| # | # | ||||
| - name: Ensure matrix-coturn-ssl-reload cronjob removed | |||||
| cron: | |||||
| user: root | |||||
| cron_file: matrix-coturn-ssl-reload | |||||
| state: absent | |||||
| when: "not matrix_coturn_enabled or not matrix_coturn_tls_enabled" | |||||
| - name: Check existence of matrix-coturn service | - name: Check existence of matrix-coturn service | ||||
| stat: | stat: | ||||
| path: "/etc/systemd/system/matrix-coturn.service" | path: "/etc/systemd/system/matrix-coturn.service" | ||||
| @@ -9,15 +9,19 @@ After={{ service }} | |||||
| Type=simple | Type=simple | ||||
| ExecStartPre=-/usr/bin/docker kill matrix-coturn | ExecStartPre=-/usr/bin/docker kill matrix-coturn | ||||
| ExecStartPre=-/usr/bin/docker rm matrix-coturn | ExecStartPre=-/usr/bin/docker rm matrix-coturn | ||||
| ExecStart=/usr/bin/docker run --rm --name matrix-coturn \ | ExecStart=/usr/bin/docker run --rm --name matrix-coturn \ | ||||
| --log-driver=none \ | --log-driver=none \ | ||||
| --user={{ matrix_user_uid }}:{{ matrix_user_gid }} \ | --user={{ matrix_user_uid }}:{{ matrix_user_gid }} \ | ||||
| --cap-drop=ALL \ | --cap-drop=ALL \ | ||||
| --entrypoint=turnserver \ | |||||
| --read-only \ | --read-only \ | ||||
| --tmpfs=/var/tmp:rw,noexec,nosuid,size=100m \ | --tmpfs=/var/tmp:rw,noexec,nosuid,size=100m \ | ||||
| --network={{ matrix_coturn_docker_network }} \ | --network={{ matrix_coturn_docker_network }} \ | ||||
| -p 3478:3478 \ | -p 3478:3478 \ | ||||
| -p 3478:3478/udp \ | -p 3478:3478/udp \ | ||||
| -p 5349:5349 \ | |||||
| -p 5349:5349/udp \ | |||||
| -p {{ matrix_coturn_turn_udp_min_port }}-{{ matrix_coturn_turn_udp_max_port }}:{{ matrix_coturn_turn_udp_min_port }}-{{ matrix_coturn_turn_udp_max_port }}/udp \ | -p {{ matrix_coturn_turn_udp_min_port }}-{{ matrix_coturn_turn_udp_max_port }}:{{ matrix_coturn_turn_udp_min_port }}-{{ matrix_coturn_turn_udp_max_port }}/udp \ | ||||
| -v {{ matrix_coturn_config_path }}:/turnserver.conf:ro \ | -v {{ matrix_coturn_config_path }}:/turnserver.conf:ro \ | ||||
| {% for volume in matrix_coturn_container_additional_volumes %} | {% for volume in matrix_coturn_container_additional_volumes %} | ||||
| @@ -25,8 +29,14 @@ ExecStart=/usr/bin/docker run --rm --name matrix-coturn \ | |||||
| {% endfor %} | {% endfor %} | ||||
| {{ matrix_coturn_docker_image }} \ | {{ matrix_coturn_docker_image }} \ | ||||
| -c /turnserver.conf | -c /turnserver.conf | ||||
| ExecStop=-/usr/bin/docker kill matrix-coturn | ExecStop=-/usr/bin/docker kill matrix-coturn | ||||
| ExecStop=-/usr/bin/docker rm matrix-coturn | ExecStop=-/usr/bin/docker rm matrix-coturn | ||||
| # This only reloads certificates (not other configuration). | |||||
| # See: https://github.com/coturn/coturn/pull/236 | |||||
| ExecReload=/usr/bin/docker exec matrix-coturn kill -USR2 1 | |||||
| Restart=always | Restart=always | ||||
| RestartSec=30 | RestartSec=30 | ||||
| @@ -1,23 +1,35 @@ | |||||
| use-auth-secret | use-auth-secret | ||||
| static-auth-secret={{ matrix_coturn_turn_static_auth_secret }} | static-auth-secret={{ matrix_coturn_turn_static_auth_secret }} | ||||
| realm=turn.{{ matrix_server_fqn_matrix }} | realm=turn.{{ matrix_server_fqn_matrix }} | ||||
| min-port={{ matrix_coturn_turn_udp_min_port }} | min-port={{ matrix_coturn_turn_udp_min_port }} | ||||
| max-port={{ matrix_coturn_turn_udp_max_port }} | max-port={{ matrix_coturn_turn_udp_max_port }} | ||||
| external-ip={{ matrix_coturn_turn_external_ip_address }} | external-ip={{ matrix_coturn_turn_external_ip_address }} | ||||
| log-file=stdout | log-file=stdout | ||||
| pidfile=/var/tmp/turnserver.pid | pidfile=/var/tmp/turnserver.pid | ||||
| userdb=/var/tmp/turnserver.db | userdb=/var/tmp/turnserver.db | ||||
| no-cli | no-cli | ||||
| {% if matrix_coturn_tls_enabled %} | |||||
| cert={{ matrix_coturn_tls_cert_path }} | |||||
| pkey={{ matrix_coturn_tls_key_path }} | |||||
| {% else %} | |||||
| no-tls | no-tls | ||||
| no-dtls | no-dtls | ||||
| {% endif %} | |||||
| prod | prod | ||||
| no-tcp-relay | no-tcp-relay | ||||
| {% if matrix_coturn_user_quota != None %} | {% if matrix_coturn_user_quota != None %} | ||||
| user-quota={{ matrix_coturn_user_quota }} | user-quota={{ matrix_coturn_user_quota }} | ||||
| {% endif %} | {% endif %} | ||||
| {% if matrix_coturn_total_quota != None %} | {% if matrix_coturn_total_quota != None %} | ||||
| total-quota={{ matrix_coturn_total_quota }} | total-quota={{ matrix_coturn_total_quota }} | ||||
| {% endif %} | {% endif %} | ||||
| {% for ip_range in matrix_coturn_denied_peer_ips %} | {% for ip_range in matrix_coturn_denied_peer_ips %} | ||||
| denied-peer-ip={{ ip_range }} | denied-peer-ip={{ ip_range }} | ||||
| {% endfor %} | {% endfor %} | ||||
| @@ -6,7 +6,6 @@ | |||||
| roles: | roles: | ||||
| - matrix-base | - matrix-base | ||||
| - matrix-mailer | - matrix-mailer | ||||
| - matrix-coturn | |||||
| - matrix-postgres | - matrix-postgres | ||||
| - matrix-corporal | - matrix-corporal | ||||
| - matrix-synapse | - matrix-synapse | ||||
| @@ -14,4 +13,5 @@ | |||||
| - matrix-mxisd | - matrix-mxisd | ||||
| - matrix-dimension | - matrix-dimension | ||||
| - matrix-nginx-proxy | - matrix-nginx-proxy | ||||
| - matrix-coturn | |||||
| - matrix-common-after | - matrix-common-after | ||||