Как я могу гарантировать, что трафик передачи использует VPN?

31

Я хотел бы убедиться, что передача отправляет / получает трафик только тогда, когда сервер, на котором он работает, подключен к VPN.

Я нашел этот вопрос похожим, но я не хочу форсировать весь трафик через VPN, и я не смог найти хорошего руководства о том, как использовать firestarter из командной строки.

Вместо этого я думал об использовании UFW, но у меня практически нет опыта работы с брандмауэрами, и я надеюсь, что сообщество может помочь мне.

Одна из моих идей заключалась в том, чтобы заставить передачу использовать определенный порт, скажем, 33442, и затем разрешать трафик на этот порт и с него только с IP-адреса VPN-сервера. Я проверил руководство сервера Ubuntu, и я думаю, что может сделать что-то вроде этого:

sudo ufw enable
sudo ufw deny port tcp from localhost to any port 33442
sudo ufa allow port tcp from localhost to VPNIP port 33442
sudo ufw deny port udp from localhost to any port 33442
sudo ufa allow port udp from localhost to VPNIP port 33442

Эта логика держит свою соль? Как бы вы это сделали? Что бы я использовал для VPNIP, общедоступного IP-адреса VPN-сервера, или я должен указать диапазон локальной подсети, к которому VPN-соединение подключается?

Спасибо за вашу помощь!

Evan
источник

Ответы:

25

Создать vpnrouteгруппу:

sudo groupadd vpnroute

Добавьте iptablesправило, которое отклоняет любое исходящее сетевое соединение, сделанное членами vpnrouteгруппы, которые не проходят через tun0интерфейс:

sudo iptables -A OUTPUT -m owner --gid-owner vpnroute \! -o tun0 -j REJECT

Начать процесс передачи как член vpnrouteгруппы:

sudo -g vpnroute transmission-gtk &
Энн Оним
источник
1
Это именно то, что я искал. Благодарность!
Таерам
3
Предупреждение: это не работает с Deluge, AFAICT, потому что Deluge порождает процессы sup. Я тщательно его протестировал, и мои настройки верны - sudo -g vpnroute ping google.com будет показывать «Место назначения недоступно», пока я не включу VPN на tun0. Но пользовательский интерфейс Deluge всегда может загружать торренты независимо от того, подключен ли VPN или нет. С помощью pgrep -G vpnroute я обнаружил, что это происходит потому, что под GID vpnroute запускается только начальный процесс / usr / bin / python, а порожденные процессы deluge-gtk, похоже, не выполняются.
happyyskeptic
10
Может ли кто-нибудь объяснить, что конкретно делает каждый из этих шагов?
ohnoplus
2
Передача имеет возможность прослушивать определенный адрес, но не конкретный интерфейс. При запуске из командной строки --bind-address-ipv4 $IP_ADDRсообщит Transmission, к какому адресу привязываться. Тогда для этого требуются правильные правила маршрутизации, чтобы трафик попадал в нужное место. Посмотрите на этот вопрос, как мне удалось это сделать.
seanlano
3
@ohnoplus Создает группу под названием «vpnroute»; добавляет правило брандмауэра, которое отклоняет любое исходящее сетевое соединение, сделанное членами этой группы, которые не проходят через VPN (определяется здесь как интерфейс «tun0», но некоторые системы могут отличаться); запускает процесс передачи как член группы "vpnroute".
TommyPeanuts
4

Это работает для безголовой передачи, я ограничиваю трафик в зависимости от пользователя, который запускает службу передачи, 10.0.0.0/8является ли ваша внутренняя сеть, которую вы должны изменить, чтобы она соответствовала вашей сети, tun0ваш интерфейс OpenVPN, eth0ваше подключение к локальной сети.

Добавьте sudoв команды, если вы не root:

iptables -F (Мы использовали ключ -F для сброса всех существующих правил, поэтому мы начинаем с чистого состояния, из которого можно добавлять новые правила.)

iptables -L (список текущих настроек)

NET=10.0.0.0/8
GROUP=debian-transmission
IFACE_INTERNAL=eth0
IFACE_VPN=tun0
ALLOW_PORT_FROM_LOCAL=9091
iptables -A OUTPUT -d $NET -p tcp --sport $ALLOW_PORT_FROM_LOCAL -m owner --gid-owner $GROUP -o $IFACE_INTERNAL -j ACCEPT
iptables -A OUTPUT -d $NET -p udp --sport $ALLOW_PORT_FROM_LOCAL -m owner --gid-owner $GROUP -o $IFACE_INTERNAL -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner $GROUP -o $IFACE_VPN -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner $GROUP -o lo -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner $GROUP -j REJECT

сделать iptables постоянными после перезагрузки

apt-get install iptables-persistent
service iptables-persistent start
TheZeroth
источник
Это дает мне следующее: $ sudo iptables -A OUTPUT -d 10.0.0.0/8 -p tcp --sport 9091 -m владелец -gid-владелец debian-translation -o eth0 -j ПРИНЯТЬ iptables v1.4.12: владелец : Неверное значение для параметра --gid-owner: debian-translation Я что-то упустил?
ohnoplus
Да, @ohnoplus :) Сначала вы должны создать группу (или владельца) для передачи debian. И убедитесь, что вы запускаете приложение как эта группа или пользователь: группа.
Иоахим
Это было именно то, что мне нужно, чтобы включить веб-интерфейс Transmission Remote, спасибо!
Зейн Хупер
4

Вот полное «Как сделать» для NOOBS (с использованием debian), чтобы убедиться, что группа пользователей debian-translation (то есть, передача) только маршрутизирует данные через vpn

НЕ ИСПОЛЬЗУЙТЕ более длинное «Как» для vpn на основе сложных системных скриптов ...! iptables - ЛУЧШИЙ (и надежный) метод !!! - ИСПОЛЬЗОВАНИЕ НЕСКОЛЬКО IPTABLE ПРАВИЛ, основанных на пользователе и группе передачи, для управления vpn (не так, как многие более сложные методы «взлома», использующие сценарии systemd, сценарии вверх и вниз и т. Д.), И это так просто!

Шаг 1 - Настройка: (Предполагается, что передача установлена ​​и, следовательно, существует пользователь передачи debian!)

sudo apt-get install iptables
sudo apt-get install iptables-persistent

Шаг 2 - Создайте файл IP-правил передачи

sudo nano transmission-ip-rules

и добавьте текст в блок кода ниже, начиная с #!/bin/bash

ВАЖНЫЙ

  • Если ваша локальная сеть не имеет формы 192.168.1.x Измените переменную NET в соответствии с вашим собственным форматом адресации локальной сети !!.
  • Также имейте в виду причуду, что 192.168.1.0/25 фактически дает диапазон 192.168.1.0-255!
  • Иногда ваши интерфейсы eth0, tun0 (который является vpn) и т. Д. Могут отличаться - проверьте с помощью 'ifconfig' и измените при необходимости.
#!/bin/bash
# Set our rules so the debian-transmission user group can only route through the vpn
NET=192.168.1.0/25
GROUP=debian-transmission
IFACE_INTERNAL=eth0
IFACE_VPN=tun0
ALLOW_PORT_FROM_LOCAL=9091
iptables -A OUTPUT -d $NET -p tcp --sport $ALLOW_PORT_FROM_LOCAL -m owner --gid-owner $GROUP -o $IFACE_INTERNAL -j ACCEPT
iptables -A OUTPUT -d $NET -p udp --sport $ALLOW_PORT_FROM_LOCAL -m owner --gid-owner $GROUP -o $IFACE_INTERNAL -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner $GROUP -o $IFACE_VPN -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner $GROUP -o lo -j ACCEPT
iptables -A OUTPUT -m owner --gid-owner $GROUP -j REJECT
# not needed - but added these to properly track data to these interfaces....when using iptables -L -v
iptables -A INPUT -i $IFACE_VPN -j ACCEPT
iptables -A INPUT -i $IFACE_INTERNAL -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
# track any forward (NAT) data for completeness - don't care about interfaces
iptables -A FORWARD

Сохраните файл и запустите

sudo iptables -F 
sudo chmod +x transmission-ip-rules
sudo ./transmission-ip-rules

затем убедитесь, что эти правила сохраняются между перезагрузками с помощью:

sudo dpkg-reconfigure iptables-persistent

и нажмите да, чтобы оба запроса. СДЕЛАННЫЙ!

Что хорошо в этом скрипте, так это то, что он будет отслеживать все данные через устройство! Когда вы выпускаете

sudo iptables -L -v

он покажет, сколько данных идет к какому интерфейсу и какой стороне INPUT или OUTPUT, так что вы можете быть уверены, что скрипт vpn работает правильно. Например;

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination                                                                                         
1749K  661M ACCEPT     all  --  tun0   any     anywhere             anywhere                                                                                            
3416K 3077M ACCEPT     all  --  eth0   any     anywhere             anywhere                                                                                            
 362K  826M ACCEPT     all  --  lo     any     anywhere             anywhere                                                                                            

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination                                                                                         
    0     0            all  --  any    any     anywhere             anywhere                                                                                            

Chain OUTPUT (policy ACCEPT 2863K packets, 2884M bytes)
 pkts bytes target     prot opt in     out     source               destination                                                                                         
 1260  778K ACCEPT     tcp  --  any    eth0    anywhere             192.168.1.0/                                                                                        25       tcp spt:9091 owner GID match debian-transmission
    0     0 ACCEPT     udp  --  any    eth0    anywhere             192.168.1.0/                                                                                        25       udp spt:9091 owner GID match debian-transmission
1973K 1832M ACCEPT     all  --  any    tun0    anywhere             anywhere                                                                                                     owner GID match debian-transmission
 8880  572K ACCEPT     all  --  any    lo      anywhere             anywhere                                                                                                     owner GID match debian-transmission
13132  939K REJECT     all  --  any    any     anywhere             anywhere                                                                                                     owner GID match debian-transmission reject-with icmp-port-unreachable

Этот скрипт был полностью протестирован на подключениях, отключениях, перезагрузках с vpn. Это прекрасно работает. Передача может использовать только VPN. Большим преимуществом этого скрипта перед остальными является то, что я убедился, как вы можете видеть (черезiptables -L -v) что ваши данные соответствуют тому, что перетаскивается при передаче (добавляя правила INPUT (все) и Forward (все) для каждого интерфейса eth0, vpn (tun0)). Так что вы точно знаете, что происходит !!! Итоговые данные не будут точно совпадать с передачей - К сожалению, я не могу различить на стороне INPUT пользователя передачи debian, и будут дополнительные издержки и, возможно, другие процессы, использующие ту же VPN, но вы увидите, что данные примерно совпадают на стороне ВХОДА и около половины на ВЫХОДЕ для VPN, подтверждающего его работу. Еще одна вещь, на которую стоит обратить внимание - требуется некоторое время при отключении vpn (весь трафик останавливается при передаче) и повторное подключение для передачи, чтобы «начать работу» на новом vpn, поэтому не беспокойтесь, если для возобновления торрента потребуется около 5 минут. ,

СОВЕТ - Google 'iptables' и посмотрите эту статью о мониторинге пропускной способности, если вы хотите построчно узнать, как работает этот скрипт ...

Musclehead
источник
Диапазон 192.168.1.0/25 составляет 192.168.1.0-127.
Zachary822
3

В идеале вам следует использовать торрент-клиент с функцией привязки к определенному интерфейсу (интерфейсу VPN).

Deluge делает это среди торрент-клиентов. Таким образом, вы можете установить Deluge и настроить интерфейс в настройках, и все готово!

user4124
источник
Спасибо за Ваш ответ. Я на самом деле довольно настроен на использование Transmission на данный момент, вы знаете, возможно ли привязать к определенному интерфейсу или диапазону IP (так что он использует только VPN) с Transmission? Благодарность!
Эван
2
@ user4124 Знаете ли вы, как связать Deluged с конкретным сетевым интерфейсом через командную строку или через webui? Поскольку никто, кажется, не знает, как сделать это с помощью Transmission, я пробовал Deluge, но пока мне не повезло. Благодарность!
Эван
3
@Evan Вы можете указать IP-адрес для привязки в Deluge с помощью listen_interfaceконсоли deluge или Interface в параметрах сети.
Cas
Хотя это и правда, я думаю, что это все еще плохой совет, даже если ваша единственная цель - скрыть ваши нелегальные торрент-загрузки, вы должны охватить вашу анонимность VPN и искать решения, которые являются общесистемными и работают не только для одной программы.
Redanimalwar