Commit 71304234 authored by Citronalco's avatar Citronalco

Neue Rolle: gateways_http_redirect

parent 9d4912f9
# gateways_http_redirect
Diese Rolle installiert einen Nginx-Webserver auf dem Gateway, der auf HTTP lauscht und zu anderen Webseiten (z.B. ein Grafana-Dashboard oder die Homepage) weiterleitet.
## Konfiguration
Gateways haben neben ihren normalen öffentlichen IPv4- und IPv6-Adressen zusätzlich pro Domäne eine öffentliche IPv6-Adresse und IPv4-Adresse, die nur aus dem Freifunk-Netz erreicht werden kann.
Mit `public` wird konfiguriert, auf welche URL beim Zugriff auf die öffentlichen IP-Adressen weitergeleitet werden soll.
Mit `per_domain` wird das Weiterleitungsziel für Zugriffe auf die Freifunk-IP-Adressen gesetzt.
Taucht in der URL der String "NODEID" auf, wird dieser durch die Node-ID, d.h. durch die MAC-Adresse des Batman-Devices der Domäne, ersetzt.
```
http_redirect:
public: <URL>
per_domain: <URL>
```
Es muss mindestens `public` oder `per_domain` konfiguriert sein.
**Beispiel:**
```
http_redirect:
public: https://ingolstadt.freifunk.net
per_domain: https://grafana.freifunk-ingolstadt.de/d/00000003/freifunk-ingolstadt-gateways?orgId=1&from=now-24h&to=now-1m&refresh=30s&var-node=NODEID
```
- name: restart nginx
service:
name: nginx
state: restarted
- name: Install nginx-light
apt:
pkg: [ 'nginx-light' ]
- name: Copy Nginx config files
template:
src: "{{ item }}.j2"
dest: "/etc/nginx/conf.d/{{ item }}"
loop:
- anonymize-ip.conf
- hardening.conf
notify: restart nginx
- name: Create http config
template:
src: redirect.j2
dest: /etc/nginx/sites-available/redirect
notify: restart nginx
- name: Enable http config
file:
src: /etc/nginx/sites-available/redirect
dest: /etc/nginx/sites-enabled/redirect
state: link
notify: restart nginx
ignore_errors: "{{ ansible_check_mode }}"
- name: Get all enabled site configs
find:
paths: '/etc/nginx/sites-enabled/'
file_type: link
register: find_enabledsites
- name: Disable all unneeded site configs
file:
path: /etc/nginx/sites-enabled/{{ item.path | basename }}
state: absent
loop: "{{ find_enabledsites.files }}"
when: item.path | basename != "redirect"
notify: restart nginx
# {{ ansible_managed }}
# Anonymize IP addresses in access.log
# Usage:
# access_log /var/log/nginx/access.log anonymized;
map $remote_addr $ip_anonym1 {
default 0.0.0;
"~(?P<ip>(\d+)\.(\d+)\.(\d+))\.\d+" $ip;
"~(?P<ip>[^:]+:[^:]+):" $ip;
}
map $remote_addr $ip_anonym2 {
default .0;
"~(?P<ip>(\d+)\.(\d+)\.(\d+))\.\d+" .0;
"~(?P<ip>[^:]+:[^:]+):" ::;
}
map $ip_anonym1$ip_anonym2 $ip_anonymized {
default 0.0.0.0;
"~(?P<ip>.*)" $ip;
}
log_format anonymized '$ip_anonymized - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
access_log off;
# {{ ansible_managed }}
server_tokens off;
client_max_body_size 32m;
client_body_buffer_size 1m;
large_client_header_buffers 4 8k;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
proxy_buffer_size 32k;
proxy_buffers 8 16k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
real_ip_header X-Forwarded-For;
set_real_ip_from 172.16.0.0/12;
# Security
proxy_cookie_path / "/; SameSite=Strict; HttpOnly; Secure";
#proxy_cookie_path / "/; SameSite=Strict; Secure";
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options SAMEORIGIN;
add_header X-XSS-Protection "1; mode=block";
# {{ ansible_managed }}
{% if http_redirect.public is defined %}
server {
listen {{ ipv4 }}:80;
listen [{{ ipv6 }}]:80;
server_name _;
return 301 https://{{ http_redirect.public }};
access_log /var/log/nginx/access.log anonymized;
}
{% endif %}
{% if http_redirect.per_domain is defined %}
{% for item in domaenenliste|dictsort %}
server {
listen [{{ domaenen[item[0]].ffv6_network | ipaddr(item[1].server_id) | ipaddr('address') }}]:80;
listen {{domaenen[item[0]].ffv4_network | ipaddr(item[1].server_id) | ipaddr('address') }}:80;
server_name _;
{% if item[0] | length > 2 %}
{% if item[1].server_id >= 10 %}
return 301 {{ http_redirect.per_domain | replace("NODEID","f2beef"+item[0][0:2]+item[0][2:]|string+item[1].server_id|string) }};
{% else %}
return 301 {{ http_redirect.per_domain | replace("NODEID","f2beef"+item[0][0:2]+item[0][2:]|string+"0"+item[1].server_id|string) }};
{% endif %}
{% else %}
{% if item[1].server_id >= 10 %}
return 301 {{ http_redirect.per_domain | replace("NODEID","f2beef00"+item[0]+item[1].server_id|string) }};
{% else %}
return 301 {{ http_redirect.per_domain | replace("NODEID","f2beef00"+item[0]+"0"+item[1].server_id|string) }};
{% endif %}
{% endif %}
access_log /var/log/nginx/access.log anonymized;
}
{% endfor %}
{% endif %}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment