Категорії
Linux Misc, staff, other Routers, GW, Internet

[pritunl] Включаємо додатковий захист

Якщо хтось не знає, що таке pritunl, то це openvpn на стероїдах. Він досить зручний для нових користувачів: достатньо просто залогінитися і одразу формується тобі готовий конфіг, який можна додати хоч на телефон, хоч на компʼютер. Але мінуси теж досить значні: працює лише на Linux, бо має жорсткі залежності від команди ip для керування мережевим стеком.

По замовчуванню, єдиний захист – це просто форма login/pass без обмежень в RPS чи капчі, чи чогось іншого. Як результат можливість підбору login/pass без обмежень. Виправимо це.

Класичний підхід такий: міняємо порт і потім проксуємо. Але у випадку pritunl це не спрацює. Чому? Бо pritunl використовує 2 порти: один для коннекту (app.server_port) і один – 443 для авторизації, і останній ніяк не поміняти. Що ж, тоді спробуємо схитрувати і за допомогою файервола просто перенаправляти всі вхідні на 443 порт із-ззовні на порт haproxy.

Міняємо порт для підключень:

# pritunl set app.web_systemd true
app.web_systemd = true
Successfully updated configuration. This change is stored in the database and has been applied to all hosts in the cluster.
# systemctl restart pritunl
# pritunl get app.web_systemd
app.web_systemd = true
# pritunl get app.server_port
app.server_port = 443
# pritunl set app.server_port 8443
app.server_port = 8443
Successfully updated configuration. This change is stored in the database and has been applied to all hosts in the cluster.
# systemctl restart pritunl

Включаємо можливість роутингу для loopback:

# sysctl net.ipv4.conf.eth0.route_localnet=1

і власне роутинг вхідних пакетів ззовні на haproxy:

# iptables -t nat -I PREROUTING -p tcp -i eth0 --dport 443 -j DNAT --to-destination 127.0.0.1:8443

Конфіг haproxy для обмежень на URL /login в 5 requests за 10 секунд:

frontend https_in
    bind 127.0.0.1:8443 ssl crt /etc/ssl/pritunl.pem
    mode http

    # Track clients by IP
    stick-table type ip size 100k expire 30s store http_req_rate(10s),gpc0
    tcp-request connection track-sc0 src

    # ACLs
    acl login_path path -i /login       # Only apply to /login
    acl abuse sc_http_req_rate(0) gt 5   # More than 5 requests in 10s
    acl banned sc_get_gpc0(0) gt 0       # Currently banned

    # Increment ban counter only for /login requests that exceed limit
    http-request sc-inc-gpc0(0) if login_path abuse

    # Deny requests if banned (403) — only for /login
    http-request deny status 403 if login_path banned

    http-response set-header X-Frame-Options DENY
    http-response set-header X-Content-Type-Options nosniff
    http-response set-header Referrer-Policy no-referrer
    http-response set-header Strict-Transport-Security "max-age=63072000"

    default_backend pritunl_web

backend pritunl_web
    mode http
    server pritunl 127.0.0.1:443 ssl verify none

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Домашняя страничка Andy
Записки молодого админа
Самостоятельная подготовка к Cisco CCNA
Самостоятельная подготовка к Cisco CCNP