Прошу помочь с перенаправлением на внешний http-proxy

Обсуждение оборудования и его настройки
Ответить
slaver
Сообщения: 25
Зарегистрирован: 14 мар 2013, 12:39

Доброго времени суток. Имеется следующая задача: перенаправить весь http и https-трафик локальной сети за микротиком на sock-прокси. Socks запущен на машине внутри сети. Следующая схема работает успешно: LAN-clients - внутренний Web Proxy микротика - parent http-proxy (polipo или privoxy - без разницы) на машине в LAN - parent Sock-proxy (tor) на этой же машине в LAN. Но стОит вместо redirect на внутренний Web Proxy поставить dst-nat на внешний прокси, и всё, не работает. Причём, если делать не redirect, а dst-nat на внутренний Web-proxy, который потом дальше идёт по цепочке прокси, то тоже всё работает. Схема с собственным Web-proxy микротика не устраивает, т.к. очень медленно работает на этапе: Web-proxy - внешний http-proxy. Если браузеру задать в качестве прокси внешний (который потом выходит на Socks), то скорость в принципе приемлемая. Поэтому собственно и хотелось бы заворачивать весь трафик сразу на внешний прокси, а не на микротик. Вот мои правила файервола и нат:

Код: Выделить всё

[admin@home-router] > ip firewall filter print
Flags: X - disabled, I - invalid, D - dynamic
 0   chain=input action=accept src-address="remote LAN" dst-address="router LAN IP"
 1   chain=output action=accept src-address="router LAN IP" dst-address="remote LAN"
 2   chain=forward action=accept src-address="remote LAN" dst-address="local LAN"
 3   chain=forward action=accept src-address="local LAN" dst-address="remote LAN"
 4   ;;; block access to internal WEB-proxy from WAN
     chain=input action=drop protocol=tcp src-address=0.0.0.0 in-interface=wan dst-port=8080
 5   chain=input action=accept protocol=udp src-port=500
 6   chain=input action=accept protocol=ipsec-esp
 7   chain=input action=accept protocol=tcp dst-port=80
 8   ;;; default configuration
     chain=input action=accept protocol=icmp
 9   ;;; default configuration
     chain=input action=accept connection-state=established
10   ;;; default configuration
     chain=input action=accept connection-state=related
11   ;;; default configuration
     chain=input action=drop in-interface=wan

[admin@home-router] > ip firewall nat print
Flags: X - disabled, I - invalid, D - dynamic
 0   chain=srcnat action=accept src-address="local LAN" dst-address="remote LAN"
 1   chain=dstnat action=accept src-address="local LAN" dst-address="remote LAN"
 2 X ;;; exclude external WEB-proxy from redirecting
     chain=dstnat action=accept protocol=tcp src-address="external proxy in local LAN IP" dst-port=80,443
 3 X ;;; redirect WEB-requests to external WEB-proxy
     chain=dstnat action=dst-nat to-addresses="external proxy in local LAN IP" to-ports=8080 protocol=tcp src-address="local LAN" dst-port=80,443
 4 X ;;; exclude internal WEB-proxy from redirecting
     chain=dstnat action=accept protocol=tcp src-address="router LAN IP" dst-port=80,443
 5 X ;;; redirect WEB-requests to internal WEB-proxy
     chain=dstnat action=redirect to-addresses="external proxy in local LAN IP" to-ports=8080 protocol=tcp src-address="local LAN" dst-port=80,443
 6   ;;; forward DNS querys for remote LAN to remote LAN dns-server IP
     chain=dstnat action=dst-nat to-addresses="remote LAN dns-server IP" connection-mark=mtrele.ru-forward
 7   ;;; default configuration
     chain=srcnat action=masquerade out-interface=wan


Прошу обратить внимание на правило №5 для NAT (оно отключено, но и во включенном состоянии то же самое). У меня в веб-интерфейсе УСТАНОВЛЕН ИМЕННО РЕДИРЕКТ на порт 8080, а консоль зачем-то выдаёт ещё и "to-addresses="external proxy in local LAN IP"!!! Что это такое - вообще ума не приложу! Кто врёт? Может, микротик ещё где-то со мной так же "шутит"? :) WinBox показывает то же, что и веб-интерфейс, т.е. редирект на 8080 (без to-addresses). При включении этого правила редирект идёт, как и полагается, на Web Proxy микротика, а не на внешний.
Последний раз редактировалось simpl3x 19 сен 2013, 11:20, всего редактировалось 1 раз.
Причина: не забывайте про тег CODE, так читать легче


Kola
Сообщения: 49
Зарегистрирован: 02 сен 2013, 13:48

Лучше перепишите здесь все правила с нормальными адресами (напишите левые адреса для внешки и для локалки, если за локалку тоже боитесь), а то так сложно понять, что Вы хотите добиться.


slaver
Сообщения: 25
Зарегистрирован: 14 мар 2013, 12:39

Пожалуйста :) Соответственно, внутренний LAN - 192.168.88.0/24, на 192.168.0.0/22 можно не обращать внимания - это LAN за VPN-ом.

Код: Выделить всё

[admin@home-router] > ip firewall filter print
Flags: X - disabled, I - invalid, D - dynamic
 0   chain=input action=accept src-address=192.168.0.0/22 dst-address=192.168.88.1
 1   chain=output action=accept src-address=192.168.88.1 dst-address=192.168.0.0/22
 2   chain=forward action=accept src-address=192.168.0.0/22 dst-address=192.168.88.0/24
 3   chain=forward action=accept src-address=192.168.88.0/24 dst-address=192.168.0.0/22
 4   ;;; block access to internal WEB-proxy from WAN
     chain=input action=drop protocol=tcp src-address=0.0.0.0 in-interface=wan dst-port=8080
 5   chain=input action=accept protocol=udp src-port=500
 6   chain=input action=accept protocol=ipsec-esp
 7   chain=input action=accept protocol=tcp dst-port=80
 8   ;;; default configuration
     chain=input action=accept protocol=icmp
 9   ;;; default configuration
     chain=input action=accept connection-state=established
10   ;;; default configuration
     chain=input action=accept connection-state=related
11   ;;; default configuration
     chain=input action=drop in-interface=wan

[admin@home-router] > ip firewall nat print   
Flags: X - disabled, I - invalid, D - dynamic
 0   chain=srcnat action=accept src-address=192.168.88.0/24 dst-address=192.168.0.0/22
 1   chain=dstnat action=accept src-address=192.168.88.0/24 dst-address=192.168.0.0/22
 2 X ;;; exclude external WEB-proxy from redirecting
     chain=dstnat action=accept protocol=tcp src-address=192.168.88.23 dst-port=80,443
 3 X ;;; redirect WEB-requests to external WEB-proxy
     chain=dstnat action=dst-nat to-addresses=192.168.88.23 to-ports=8080 protocol=tcp src-address=192.168.88.0/24 dst-port=80,443
 4 X ;;; exclude internal WEB-proxy from redirecting
     chain=dstnat action=accept protocol=tcp src-address=192.168.88.1 dst-port=80,443
 5 X ;;; redirect WEB-requests to internal WEB-proxy
     chain=dstnat action=redirect to-addresses=192.168.88.23 to-ports=8080 protocol=tcp src-address=192.168.88.0/24 dst-port=80,443
 6   ;;; forward DNS querys for remote LAN to 192.168.2.2
     chain=dstnat action=dst-nat to-addresses=192.168.2.2 connection-mark=remote-lan-forward
 7   ;;; default configuration
     chain=srcnat action=masquerade out-interface=wan
Последний раз редактировалось simpl3x 19 сен 2013, 11:21, всего редактировалось 1 раз.
Причина: тег CODE


Аватара пользователя
simpl3x
Модератор
Сообщения: 1532
Зарегистрирован: 19 апр 2012, 14:03

хм, действие redirect не предполагает указания to-address, так как он действительно заворачивает сам на себя. так что тут какая то бага.

*удалено*
утро не задалось =) кофе не попил, пишу всякий бред

вообще, должно работать как то так:

Код: Выделить всё

     chain=dstnat action=accept protocol=tcp src-address=192.168.88.23 dst-port=80,443 
     chain=dstnat action=dst-nat to-addresses=192.168.88.23 to-ports=8080 protocol=tcp src-address=192.168.88.0/24 dst-port=80,443

ну по крайней мере у нас так работает страница заглушки при отрицательном балансе. т.е. весь трафик абонента редиректит в прокси сервер, который отдаёт статическую страницу.


slaver
Сообщения: 25
Зарегистрирован: 14 мар 2013, 12:39

Код: Выделить всё

2 X ;;; exclude external WEB-proxy from redirecting
     chain=dstnat action=accept protocol=tcp src-address=192.168.88.23 dst-port=80,443

вы вот этим правилом не просто делаете Exclude web-proxy from redirecting, вы выкидываете пакеты от прокси из цепочки ната в таком виде, в котором они к вам прилетели, и по итогу они летят в тырнет с адресом 192.168.88.23. собственно дальше думать не стоит, что с ними там происходит.
надо сделать как то так:

Код: Выделить всё

chain=dstnat action=masquerade src-address-list=192.168.88.23
chain=dstnat action=dst-nat to-addresses=192.168.88.23 to-ports=80 protocol=tcp src-address=192.168.88.0/24 dst-port=80


Понял. Спасибо. Приду домой - попробую. Хотя вот это правило "exclude Web proxy from redirecting" я прописал, если память не изменяет, уже ПОСЛЕ того, как dst-nat на прокси не стал работать. Только мне не понятно, почему всё работает для ВНУТРЕННЕГО прокси микротика 192.168.88.1? ТО ЖЕ САМОЕ правило, но с адресом не 192.168.88.23, а 192.168.88.1... Т.е. для внутреннего прокси работает и redirect, и dst-nat. В чём разница то? Под какое правило попадает 192.168.88.1 и выходит в инет, а 192.168.88.23 не попадает? Разве последнее правило chain=srcnat action=masquerade out-interface=wan не распространяется также и на 192.168.88.23 в данном случае?
Упппссс... Попробовал удалённо задать правило, как вы написали:
chain=dstnat action=masquerade src-address-list=192.168.88.23
Получил следующее:
Couldn't change NAT Rule <192.168.88.23->80,443> - dstnat chain can not contain masquerade/snat actions (6)
Последний раз редактировалось slaver 19 сен 2013, 12:24, всего редактировалось 1 раз.


Аватара пользователя
simpl3x
Модератор
Сообщения: 1532
Зарегистрирован: 19 апр 2012, 14:03

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


slaver
Сообщения: 25
Зарегистрирован: 14 мар 2013, 12:39

simpl3x писал(а):вообще, должно работать как то так:

Код: Выделить всё

     chain=dstnat action=accept protocol=tcp src-address=192.168.88.23 dst-port=80,443 
     chain=dstnat action=dst-nat to-addresses=192.168.88.23 to-ports=8080 protocol=tcp src-address=192.168.88.0/24 dst-port=80,443

ну по крайней мере у нас так работает страница заглушки при отрицательном балансе. т.е. весь трафик абонента редиректит в прокси сервер, который отдаёт статическую страницу.


:D так у меня ведь точно так и прописаны правила. Не работает... Для внутреннего - работает, для внешнего - нет. Повторюсь: с внешним прокси всё в порядке. Через браузер напрямую на него всё работает. И в цепочке с внутренним прокси микротика он тоже работает...


Аватара пользователя
simpl3x
Модератор
Сообщения: 1532
Зарегистрирован: 19 апр 2012, 14:03

а если так:

Код: Выделить всё

chain=src-nat action=src-nat to-addresses=192.168.88.1 dst-address=192.168.88.23
chain=dstnat action=accept protocol=tcp src-address=192.168.88.23 dst-port=80,443
     chain=dstnat action=dst-nat to-addresses=192.168.88.23 to-ports=8080 protocol=tcp src-address=192.168.88.0/24 dst-port=80,443

просто под локальным я понимал самого микротика. у вас получается какй то частный случай hairpin nat Нужно сделать. http://wiki.mikrotik.com/wiki/Hairpin_NAT . т.е. нужно поменять не только адрес назначения на прокси, но и адрес источника, чтобы прокси думал что его спрашивает сам микротик.


slaver
Сообщения: 25
Зарегистрирован: 14 мар 2013, 12:39

Прочёл ссылку. Механизм понятен :) Попробую вечером и отпишусь, получилось ли. Хотя странно, почему везде, где ни находил упоминание о редиректе на внешний прокси, не было этого момента с NAT, а были те же правила, что и у меня сейчас прописаны? То ли никто реально не перенаправлял, то ли у меня "особенный" микротик? :)


slaver
Сообщения: 25
Зарегистрирован: 14 мар 2013, 12:39

Итак некоторый прогресс есть :) Имеем следующие правила NAT (оставил только относящиеся к теме):

[admin@home-router] > ip firewall nat print
Flags: X - disabled, I - invalid, D - dynamic
2 chain=srcnat action=src-nat to-addresses=192.168.88.1 protocol=tcp dst-address=192.168.88.23 dst-port=8080
3 ;;; exclude external WEB-proxy from redirecting
chain=dstnat action=accept protocol=tcp src-address=192.168.88.23 dst-port=80,443
4 ;;; redirect WEB-requests to external WEB-proxy
chain=dstnat action=dst-nat to-addresses=192.168.88.23 to-ports=8080 protocol=tcp src-address=192.168.88.0/24 dst-address=!192.168.88.0/24 dst-port=80,443
8 ;;; default configuration
chain=srcnat action=masquerade out-interface=wan

В итоге трафик перенаправляется на порт внешнего прокси, НО при попытке зайти на сайт я получаю страницу, как если бы я входил на порт прокси через браузер, т.е. в случае с прокси polipo получаю страницу настроек прокси, а в случае прокси privoxy получаю пустую страницу с текстом "Invalid header received from client". Если судить по счётчикам пакетов, то весь трафик, заворачиваемый правилом №4, потом попадает под правило №2. Но такое ощущение, что в ходе этих манипуляций теряется адрес запроса сайта в интернете, а получаем ответ с порта прокси-сервера. Т.е. трафик не проксируется, а идёт просто как GET к веб-серверу, но только на порт 8080 прокси.
Есть какие-нибудь идеи? :)


Ответить