LINUX.ORG.RU
ФорумAdmin

Перенаправлять запросы в тор, находящийся на другом сервере в локальной сети

 , , ,


1

1

Здравствуйте! Есть роутер с OpenWRT на борту, котоырй смотрит в WAN и обеспечивает локальную сеть (DHCP/DNS/маскарадинг) и есть CentOS сервер в этой сети, на котором запущен tor. Также в сети до десятка Win/Andoid устройств. Нужно, чтоб они шли в интернет на некоторые сайты через tor, а на все остальные - напрямую через роутер в WAN. Часть дела сделано: dnsmasq на роутере вносит в ipset IP адреса, соответствующие сайтам, которые нужно tor'ифицировать. Tor настроен как socks proxy и transparent proxy. Теперь осталось перенаправить запросы, соответствующие ipset'у в tor на CentOS сервер. Это можно сделать с помощью iptables? Если нет, то скажите как это реализовать.

Заранее большое спасибо!


Ну очевидно же что надо сначала у гугла спросить iptables ipset

А потом сделать DNAT для того, что помечено ipset

samson ★★
()

что то вроде

iptables -t nat -A PREROUTING -m set --match-set МЕТКА -j DNAT --to-destination TOR_IP 
iptables -t nat -A POSTROUTING -d TOR_IP -j MASQUERADE
samson ★★
()
Последнее исправление: samson (всего исправлений: 1)
Ответ на: комментарий от samson

Примерно так я и сделал:

iptables -t nat -A PREROUTING -p tcp -m multiport --dports 80,443 -m set --match-set METKA dst -j DNAT --to-destination TOR_IP:TOR_PORT
iptables -t nat -A POSTROUTING -d TOR_IP -j MASQUERADE
Для отладки отключил на CentOS сервере firewalld. Но не работает, с Win 10 выполняю
telnet XXX 443
И в ответ «сбой подключения». Подскажите, как утилитами типа tcpdump посмотреть на сервере приходят ли к нему пакеты от роутера? А то на сервере много всего крутится в выводе tcpdump много всего, не разобрать есть ли там от роутера нужные пакеты.

kt368
() автор топика
Ответ на: комментарий от kt368

man tcpdump там куча ключей, можно фильтровать по ip, протоколу, и т.д.

iptables -t nat -A POSTROUTING -d TOR_IP -j MASQUERADE

еще можно добавить -s LOCAL_NET

--to-destination TOR_IP:TOR_PORT

TOR_IP, без port, тем более если у вас там transparent proxy.

telnet XXX 443

для начала пробуйте 80ый порт (http), вместо https.

samson ★★
()
Ответ на: комментарий от kt368

Подскажите, как утилитами типа tcpdump посмотреть на сервере приходят ли к нему пакеты от роутера?

например tcpdump ..... port TOR_PORT

anc ★★★★★
()
Ответ на: комментарий от anc

С tcpdump, вроде, разобрался. Пакеты до tor'а доходят. А дальше - не идёт, если коротко, то браузер возвращает

ERR_EMPTY_RESPONSE
А если пошагово что было сделано, то: /etc/torrc:
VirtualAddrNetworkIPv4 10.192.0.0/10
AutomapHostsOnResolve 1
TransPort 127.0.0.1:9040
TransPort 192.168.1.101:9040
DNSPort 5353
SOCKSPort 192.168.1.101
При помощи firewall-cmd открыл порт 9040/tcp:
firewall-cmd --add-port 9040/tcp
и пробросил все соединения по 80 и 443 порту на порт 9040 (для проверки):
firewall-cmd --direct --add-rule ipv4 nat OUTPUT 0 -p tcp -m multiport --destination-ports 80,443 -j REDIRECT --to-port 9040
После этого проверил tor, скачав wget'ом файл из интернета. Выключил тор - не качает. Т.е. прозрачное прокси работает (для локальных процессов). Далее на OpenWRT ввёл
iptables -t nat -A PREROUTING -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 192.168.1.101:9040
iptables -t nat -D POSTROUTING -d 192.168.1.101 -j MASQUERADE
И попробовал с Win10 выполнить
telnet ping.pe 80
соединение установилось, но нажав Ctrl+C передо мною девственно чистое окно cmd. Попробовав открыть в браузере любой сайт мне выдаётся
ERR_EMPTY_RESPONSE
Убрав эти два iptables правила и повторив telnet ping.pe 80 Ctrl+C я вижу ответ ping.pe: HTTP/1.1 400 Bad Request и т.д. Что я делаю не так, вроде-бы всё по манам?

kt368
() автор топика
Ответ на: комментарий от anc

Да, конечно, ошибся, на OpenWrt роутере вводил такое:

iptables -t nat -A PREROUTING -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 192.168.1.101:9040
iptables -t nat -A POSTROUTING -d 192.168.1.101 -j MASQUERADE

kt368
() автор топика

/etc/config/firewall

config redirect
	option src 'lan'
	option proto 'tcp'
	option src_dip 'TOR_network_from_VirtualAddrNetworkIPv4'
	option dest_port 'TOR_TransPort'
	option name 'onion'
	option dest 'lan'
	option dest_ip 'TOR_IP_Address'
	option src_ip 'Local_Network_Subnet'

И прекращай насиловать бедный иптаблес, в опенврт все придумано для тебя

pekmop1024 ★★★★★
()
Ответ на: комментарий от pekmop1024
src_dip 'TOR_network_from_VirtualAddrNetworkIPv4'

Сюда вписать то, что в torrc называется VirtualAddrNetworkIPv4? Т.е. в моём случае

config redirect
	option src 'lan'
	option proto 'tcp'
	option src_dip '10.192.0.0/10'
	option dest_port '9040'
	option name 'onion'
	option dest 'lan'
	option dest_ip '192.168.1.101'
	option src_ip '192.168.1.0/24'
Но как HTTP пакеты к сайтам в интернете, идущие к роутеру с Win10 компьютера будут проходить фильтрацию по «option src_dip '10.192.0.0/10'»? Проверил, с этим конфигом запросы не идут на tor, а с роутера сразу в WAN.

kt368
() автор топика
Ответ на: комментарий от kt368

Нет, наверное в src_dip нужно вписать IP адреса, запросы к которым должны идти через tor. Но так тоже не работает - браузер выдаёт «ERR_CONNECTION_TIMED_OUT». Также на сервере крутится nginx, попробовал указать такое в /etc/config/firewall

config redirect
	option src 'lan'
	option proto 'tcp'
	option src_dip '212.47.236.218'
	option dest_port '80'
	option name 'onion'
	option dest 'lan'
	option dest_ip '192.168.1.101'
	option src_ip '192.168.1.0/24'
И при попытке зайти на http://212.47.236.218/ я вижу «Welcome to nginx on Fedora!» и т.д. Т.е. redirect работает. Значит, что-то не так с tor. Порт 9040 открыт:
firewall-cmd --list-ports
443/tcp 80/tcp 9040/tcp 9091/tcp 3390/tcp 9050/tcp 51413/tcp 3389/tcp
Со стороны роутера проверил
nc 192.168.1.101 9040
Команда выполнилась без ошибок, т.е. порт 9040 открыт и tor его слушает, т.к. после выполения (на сервере)
systemctl stop tor
запуск на роутере
nc 192.168.1.101 9040
выдаёт
nc: can't connect to remote host (192.168.1.101): Connection refused
Значит что-то не так с конфигом tor'а? Вот полный конфиг:
ControlSocket /run/tor/control
ControlSocketsGroupWritable 1
CookieAuthentication 1
CookieAuthFile /run/tor/control.authcookie
CookieAuthFileGroupReadable 1

VirtualAddrNetworkIPv4 10.192.0.0/10
AutomapHostsOnResolve 1
TransPort 127.0.0.1:9040
TransPort 192.168.1.101:9040
DNSPort 5353

SOCKSPort 192.168.1.101:9050

Log notice file /var/log/tor/notices.log
Tor успешно запускается, вот его лог:
tail -n 5 /var/log/tor/notices.log
Jun 07 10:58:44.000 [notice] Opening Control listener on /run/tor/control
Jun 07 10:58:45.000 [notice] Bootstrapped 85%: Finishing handshake with first hop
Jun 07 10:58:45.000 [notice] Bootstrapped 90%: Establishing a Tor circuit
Jun 07 10:58:45.000 [notice] Tor has successfully opened a circuit. Looks like client functionality is working.
Jun 07 10:58:45.000 [notice] Bootstrapped 100%: Done
Или, возможно, пакеты до tor'а доходят, он их обрабатывает, а потом они почему-то не доходят то Win10 компа, который их ждёт (на котором запущен браузер)? Или приходят, но, например, не с того узла, на который выполнялся запрос (это задача маскарадинга?)? В общем, ни в какую.

kt368
() автор топика
Ответ на: комментарий от kt368

HTTP пакеты к сайтам в интернете, идущие к роутеру с Win10 компьютера будут проходить фильтрацию по «option src_dip '10.192.0.0/10'»?

Не путай src_ip с src_dip

Трейсить это бесполезно, потому тебе и показалось, что трафик идет не туда. В правиле только tcp, если не заметил.
Единственный способ это проверить - это открыть onion-сайт без tor-прокси. Ну или поснифать трафик, но смысл?
Ну и еще не забудь проверить, что .onion резолвится в фиктивные адреса на клиентах, т.е. nslookup'ом на той же десяточке.

pekmop1024 ★★★★★
()
Ответ на: комментарий от pekmop1024

А для того, чтоб ходить через tor на не .onion сайты не нужно ничего с перенаправлением DNS запросов в tor делать, так? Или для tor'a все DNS запросы должны идти через него? Т.к. сейчас .onion сайты не резолвятся с win10. Но мне, для начала, этого не нужно, пусть хоть обычные сайты через tor пойдут.

в src_dip нужно вписать IP адреса, запросы к которым должны идти через tor

Это верно?

kt368
() автор топика

Как-то так делаю

SQ='--dport 80 -j DNAT --to-destination TOR-HOST:TOR-PORT'
LAN1=192.168.1.0/24
iptables -A PREROUTING -t nat -p tcp -s $LAN1 -d REMOTE-HOST $SQ

Radjah ★★★★★
()
Ответ на: комментарий от kt368

для того, чтоб ходить через tor на не .onion сайты не нужно ничего с перенаправлением DNS запросов в tor делать, так?

Так. Я не понял - тебе нужно ВЕСЬ веб-трафик в тор завернуть или только онионы?

Или для tor'a все DNS запросы должны идти через него?

Если тебе обход блэклистинга нужен, тогда все запросы должны идти через dnsmasq, который должен формировать ipset, который уже нужно форвардить в TransPort тора.

в src_dip нужно вписать IP адреса, запросы к которым должны идти через tor

Это имеет смысл только с виртуальными адресами, которые генерит сам тор, потому что у остальных сайтов адреса меняются, и правильнее будет их пихать в ipset через dnsmasq. Только не забудь для этого поставить dnsmasq-full вместо дефолтного обрезанного.

pekmop1024 ★★★★★
()
Последнее исправление: pekmop1024 (всего исправлений: 1)
Ответ на: комментарий от pekmop1024

ВЕСЬ веб-трафик в тор завернуть или только онионы

Для начала весь веб-трафик

Если тебе обход блэклистинга нужен, тогда все запросы должны идти через dnsmasq, который должен формировать ipset, который уже нужно форвардить в TransPort тора

Так и собирался делать, с dnsmasq и ipset, вроде-бы разобрался, IP-шники в ipset добавляются при попытке зайти на блеклист сайты, вот теперь пытаюсь весь веб-трафик через тор пустить.... Хм, а ответные пакеты от tor'а могут фильтроваться/reject'иться роутером или они должны сразу в Win10 машину идти?

kt368
() автор топика
Ответ на: комментарий от kt368

Так посмотрите tcpdump-ом что улетает при заходе на 80-й порт какого-нидь сайта и что прилетает в ответ.

anc ★★★★★
()
Ответ на: комментарий от anc

Посмотрел, пробую зайти на http://www.otis.com, вот tcpdump с Win10:

C:\Users\User\Downloads>WinDump.exe -q -nn port 80
C:\Users\User\Downloads\WinDump.exe: listening on \Device\NPF_{C151AFB0-3E6D-4D58-99DA-04C58232E523}
21:34:20.414471 IP 192.168.1.100.9777 > 104.45.150.11.80: tcp 0
21:34:20.665416 IP 192.168.1.100.9778 > 104.45.150.11.80: tcp 0
21:34:23.415158 IP 192.168.1.100.9777 > 104.45.150.11.80: tcp 0
21:34:23.666009 IP 192.168.1.100.9778 > 104.45.150.11.80: tcp 0
21:34:29.414357 IP 192.168.1.100.9777 > 104.45.150.11.80: tcp 0
21:34:29.666993 IP 192.168.1.100.9778 > 104.45.150.11.80: tcp 0
А вот tcpdump на сервере с тором:
[root@server ~]# tcpdump -q -i enp1s0 -nn port 9040
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp1s0, link-type EN10MB (Ethernet), capture size 65535 bytes
21:33:03.308617 IP 192.168.1.100.9777 > 192.168.1.101.9040: tcp 0
21:33:03.308723 IP 192.168.1.101.9040 > 192.168.1.100.9777: tcp 0
21:33:03.559707 IP 192.168.1.100.9778 > 192.168.1.101.9040: tcp 0
21:33:03.559801 IP 192.168.1.101.9040 > 192.168.1.100.9778: tcp 0
21:33:04.626565 IP 192.168.1.101.9040 > 192.168.1.100.9777: tcp 0
21:33:04.826599 IP 192.168.1.101.9040 > 192.168.1.100.9778: tcp 0
21:33:06.309332 IP 192.168.1.100.9777 > 192.168.1.101.9040: tcp 0
21:33:06.309400 IP 192.168.1.101.9040 > 192.168.1.100.9777: tcp 0
21:33:06.560211 IP 192.168.1.100.9778 > 192.168.1.101.9040: tcp 0
21:33:06.560314 IP 192.168.1.101.9040 > 192.168.1.100.9778: tcp 0
21:33:08.626565 IP 192.168.1.101.9040 > 192.168.1.100.9777: tcp 0
21:33:08.826588 IP 192.168.1.101.9040 > 192.168.1.100.9778: tcp 0
21:33:12.309030 IP 192.168.1.100.9777 > 192.168.1.101.9040: tcp 0
21:33:12.309090 IP 192.168.1.101.9040 > 192.168.1.100.9777: tcp 0
21:33:12.561491 IP 192.168.1.100.9778 > 192.168.1.101.9040: tcp 0
21:33:12.561553 IP 192.168.1.101.9040 > 192.168.1.100.9778: tcp 0
21:33:16.627585 IP 192.168.1.101.9040 > 192.168.1.100.9777: tcp 0
21:33:16.827570 IP 192.168.1.101.9040 > 192.168.1.100.9778: tcp 0
Т.е. от Win10 к серверу пакеты доходят, сервер отправляет ответные пакеты которые почему-то не доходят до Win10. Может, я что-то в настройках iptables (/etc/config/firewall) пропустил?

kt368
() автор топика
Ответ на: комментарий от kt368

Таксссс... На роутере не был включён маскарадинг. Выполнив

iptables -t nat -A POSTROUTING -d 192.168.1.101 -j MASQUERADE
К Win10 стали доходить ответные пакеты:
C:\Users\User\Downloads>WinDump.exe -q -nn port 80
C:\Users\User\Downloads\WinDump.exe: listening on \Device\NPF_{C151AFB0-3E6D-4D58-99DA-04C58232E523}
22:00:13.533494 IP 192.168.1.100.9827 > 104.45.150.11.80: tcp 0
22:00:13.534376 IP 104.45.150.11.80 > 192.168.1.100.9827: tcp 0
22:00:13.534467 IP 192.168.1.100.9827 > 104.45.150.11.80: tcp 0
22:00:13.534747 IP 192.168.1.100.9827 > 104.45.150.11.80: tcp 687
22:00:13.535962 IP 104.45.150.11.80 > 192.168.1.100.9827: tcp 0
22:00:13.537239 IP 104.45.150.11.80 > 192.168.1.100.9827: tcp 0
22:00:20.602445 IP 192.168.1.100.9828 > 104.45.150.11.80: tcp 0
22:00:20.605335 IP 104.45.150.11.80 > 192.168.1.100.9828: tcp 0
22:00:20.605428 IP 192.168.1.100.9828 > 104.45.150.11.80: tcp 0
22:00:20.605711 IP 192.168.1.100.9828 > 104.45.150.11.80: tcp 687
22:00:20.608836 IP 104.45.150.11.80 > 192.168.1.100.9828: tcp 0
22:00:20.608837 IP 104.45.150.11.80 > 192.168.1.100.9828: tcp 0
22:00:20.608894 IP 192.168.1.100.9828 > 104.45.150.11.80: tcp 0
22:00:20.609246 IP 192.168.1.100.9828 > 104.45.150.11.80: tcp 0
22:00:20.609783 IP 104.45.150.11.80 > 192.168.1.100.9828: tcp 0
22:00:20.609923 IP 104.45.150.11.80 > 192.168.1.100.9828: tcp 0
И браузер снова стал возвращать ERR_EMPTY_RESPONSE. Что бы ещё посмотреть?

kt368
() автор топика
Ответ на: комментарий от kt368

Да, и главное: при попытке зайти из браузера на сайт на 80-м порту, в лог тора пишется следующее:

Jun 07 21:58:56.000 [warn] Rejecting request for anonymous connection to private address [scrubbed] on a TransPort or NATDPort.  Possible loop in your NAT rules?
Я уже и на openwrt wiki нашёл, как нужно настроить /etc/config/firewall для использования external transparent proxy:
config redirect
        option src              lan
        option proto            tcp
        option src_ip           !192.168.1.101
        option src_dport        80
        option dest_ip          192.168.1.101
        option dest_port        9040
        option target           DNAT

config redirect
        option dest             lan
        option proto            tcp
        option src_dip          192.168.1.1
        option dest_ip          192.168.1.101
        option dest_port        9040
        option target           SNAT
Сделал так, поведение не изменилось.

kt368
() автор топика
Ответ на: комментарий от kt368

Всё, проблема в tor. Чтобы это выяснить, установил на сервере tinyproxy, чтоб она слушала порт 8888, и подправил конфиг из предыдущего моего сообщения:

option dest_port        9040
пробую зайти на http сайт: отлично, заходит. Разбираюсь с tor'ом...

kt368
() автор топика

Если что это плохая идея ходить на часть сайтов через тор, а на часть без. Встраиваем на тор-сайт iframe в обычный интернет и получаем твой реальный IP (по совпадению времени обращения, ua, кукам, referer).

Если же тебе хочется просто обхода блокировок, то есть варианты проще и лучше тора.

KivApple ★★★★★
()
Ответ на: комментарий от KivApple

есть варианты проще и лучше тора

А какие, не подскажете, чтоб и трафик был неограниченный, и бесплатно? Да и выходную ноду можно выбрать в желаемой стране.

kt368
() автор топика
8 июля 2018 г.
Ответ на: комментарий от kt368

Обход работает, но хочется улучшить правила iptables

Хоть уже и больше года прошло, но, я считаю, что имеет смысл написать как же я всё это дело настроил - может кому-то пригодится, или для себя самого шпаргалка будет на будущее. Первым делом перекомпилировал для роутера прошивку с поддержкой ipset'ов в dnsmasq. После успешного запуска роутера с новой прошивкой, добавил в /etc/dnsmasq.conf следующее:

ipset=/mail.ru/imgsmail.ru/smailru.net/mradx.net/datacloudmail.ru/ok.ru/odnoklassniki.ru/yastatic.ru/yandex.st/yandex.net/ya.ru/yandex.ru/yandex.ua/yandex.com/yadi.sk/yastatic.net/mycdn.me/vk.com/vkontakte.ru/userapi.com/icq.com/blacklist
Сюда бы ещё kinopoisk добавить как руки дойдут.

Дальше в /etc/rc.local добавил:

sleep 15
ip rule add fwmark 0x1 table 100
ip route add default via 192.168.1.101 table 100
ip route flush cache
Где 192.168.1.101 - адресс Centos сервера с tor клиентом. Перезагрузил роутер, проверил, что ipset blacklist наполняется адресами, при попытке зайти на перечисленные ресурсы. Дальше на сервере с tor клиентом сделал слеюущее:
iptables -t nat -A PREROUTING_direct ! -d 192.168.1.101/32 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8888
iptables -t nat -A PREROUTING_direct ! -d 192.168.1.101/32 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 8888
Настроил tor клиент следующим образом:
VirtualAddrNetworkIPv4 10.192.0.0/16
AutomapHostsOnResolve 1
TransPort 8888
TransListenAddress 192.168.1.101
TransListenAddress 127.0.0.1
ExitNodes {RU}
Ну и открыл порт 8888 для tor'а в firewalld:
firewall-cmd --zone=public --add-port=8888/tcp --permanent
firewall-cmd --reload
Вроде-бы всё, что я делал. После этого с любого устройства, находящегося в моей внутренней локальной сети я могу заходить на заблокированные ресурсы через tor, скорость, кстати, вполне достаточная для сёрфинга, кажется, даже, за год подросла раза в 2 - tor сеть растёт, наверное.

Но теперь захотелось мне на этом же Centos сервере поднять OnlyOffice, который поставляется в Docker контейнере, и правило, перенаправляющее в порт 8888, теперь ломает работу OnlyOffice. В моём существующем правиле

iptables -t nat -A PREROUTING_direct ! -d 192.168.1.101/32 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8888
происходит фильтрация по несовпадению адреса получателя с адресом Centos сервера, но пакеты к офису тоже имеют адрес получателя отличный от адреса Centos сервера - т.к. офис, в докере, он получается за NAT'ом.

Теперь мне бы правило так изменить, чтобы оно перенаправляло в tor пакеты, адрес получателя которых отличный от адреса сервера и адреса офиса. Просто через запятую перечислить два IP адреса не получается - т.к. перед IP адресами стоит инверсия (! -d 192.168.1.101/32,172.17.0.2/32 не работает), Iptables выдаёт следующее:

! not allowed with multiple source or destination IP addresses
Не подскажете, как такое можно реализовать? Подумываю опять применить Ipset, как вам такое решение?

kt368
() автор топика
iptables -t nat -A PREROUTING_direct  -d 192.168.1.101/32 -p tcp -m tcp --dport 80 -j RETURN
iptables -t nat -A PREROUTING_direct -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8888

Лично мне не нравятся условия с ! (not) как раз по этой причине, сегодня написали один not а завтра еще что-то понадобилось.

Подумываю опять применить Ipset, как вам такое решение?

Но можно и так.

anc ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.