Есть рабочая схема -- использовать nginx в качестве https reverse-proxy и отлавливать неуспешные попытки в access.log fail2ban'ом.
В результате transmission доступен откуда угодно через публичное имя, удобно использовать андроид-приложение transmission-remote на телефоне, не нужно подключаться к vpn.
Пара дней полет нормальный!
nginx конфиг (/etc/nginx/sites-enabled/reverse):
(10.8.0.2 заменить на localhost при необходимости; не уверен в необходимости создавания всех locations, однако так работает и трогать уже не хочется)
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://10.8.0.2:9091;
}
location /d/transmission/rpc {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://10.8.0.2:9091/d/transmission/rpc;
}
location /d/transmission/web {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://10.8.0.2:9091/d/transmission/web;
}
}
server {
listen 80;
server_name yourdomain.com;
return 301 https://yourdomain.com$request_uri;
return 403;
}
Конфигурация лога в nginx.conf: логировать только ошибки
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
map $status $loggable
{
~^[2] 0;
default 1;
}
access_log /var/log/nginx/access.log main if=$loggable;
Конфигурация jail для Fail2Ban:
при необходимости адаптировать failregex; также можно создать filter transmission.local и вместо failregex сделать filter = transmission
[transmission]
banaction = iptables-allports
enabled = true
port = 443
protocol = tcp
filter =
failregex = <HOST>.*\[.*\]\s\"GET.*\"\s40[1,3]\s.*
logpath = /var/log/nginx/access.log
maxretry = 5