LinuxForum.Fans
Тема

iptables проксификация

Автор: Acuk 37 сообщений 10045 просмотров
#166032

Доброго дня.
Нужна помощь. Ситуация такая:
Есть ТВ с Netcast и 2хМБИТНЫЙ канал через прокси. Нужно завернуть траффик с ТВ на прокси
Netcast использует порты 80 и 443
Прокси не требует аутентификации
Маршрутизатор Asus wl-600g со встроенным linux 2.6.8.1
Телевизор подключен к роутеру по проводу к 1-му LAN порту
Собрал такую конструкцию(правил конфиг. файлы в роутере):

text
iptables -t nat -A PREROUTING -i eth0 -p all --dport 80 -j REDIRECT --to-ports 888(Порт прокси) --to-destination (IP прокси)
iptables -t nat -A PREROUTING -i eth0 -p all --dport 443 -j REDIRECT --to-ports 888(Порт прокси) --to-destination (IP прокси)

Но работать такая конструкция отказывается.

Возможно собака зарыта в неверных параметрах или недогруженности некоторых модулей:
пытался сделать "insmod ipt_REDIRECT.ko но рутер пишет, что использование модуля невозможно, хотя это его собственный модуль из папки ядра.
Вообще и-нет АДСЛ, но тарифы моего провайдера оставляют желать и желать, поэтому выкручиваюсь с прокси. На Виндовом компе проблем не возникало, но Линуксовый роутер поставил меня в тупик.
Если есть знатоки iptables, прошу помочь. Заранее признателен за любую помощь.

#166040

Acuk, оба порта => на один? Может 80 => X и 443 = > Y?

#166044

Я же заворачиваю пакеты на прокси. а там как ни крути один порт =)

#166045

Вот кое что про перенаправление:

Перенаправление портов нужно в том случае, если мы хотим «замаскировать» внутреннюю службу, обеспечив к ней доступ извне не по стандартному, а совсем по другому порту. Конечно, можно заставить сам веб-сервер слушать нестандартный порт, но если он используется рядовыми сотрудниками внутри локальной сети, то мы элементарно столкнёмся с человеческим фактором. Сотрудникам будет очень тяжело объяснить, что теперь для доступа к корпоративному сайту надо после его имени вводить набор цифр через двоеточие.

Именно из-за человеческого фактора перенаправление портов используется, в основном, специалистами, для удалённого администрирования.

Пусть $FAKE_PORT - обманный порт на внешнем интерфейсе шлюза, подключившись к которому мы должны попасть на адрес $LAN_IP и порт $SRV_PORT.

Набор правил для iptables будет отличаться несущественно, поэтому приведу сразу пример итогового скрипта для ленивых.
text
#!/bin/bash
EXT_IP="xxx.xxx.xxx.xxx" # Он всё равно чаще всего один и тот же.
INT_IP="xxx.xxx.xxx.xxx" # См. выше.
EXT_IF=eth0 # Внешний и внутренний интерфейсы.
INT_IF=eth1 # Для шлюза они вряд ли изменятся, поэтому можно прописать вручную.
FAKE_PORT=$1  # Вначале передаём скрипту "неправильный" порт на внешнем интерфейсе,
LAN_IP=$2     # затем - локальный адрес сервера
SRV_PORT=$3   # и в конце - реальный порт для подключения к серверу

# Здесь опять надо сделать проверку ввода данных, потому что операции всё ещё серьёзные.

iptables -t nat -A PREROUTING -d $EXT_IP -p tcp -m tcp --dport $FAKE_PORT -j DNAT --to-destination $LAN_IP:$SRV_PORT iptables -t nat -A POSTROUTING -d $LAN_IP -p tcp -m tcp --dport $SRV_PORT -j SNAT --to-source $INT_IP iptables -t nat -A OUTPUT -d $EXT_IP -p tcp -m tcp --dport $SRV_PORT -j DNAT --to-destination $LAN_IP iptables -I FORWARD 1 -i $EXT_IF -o $INT_IF -d $LAN_IP -p tcp -m tcp --dport $SRV_PORT -j ACCEPT

По сути изменилась только первая строчка, поскольку только она отвечает за первичную обработку входящих пакетов. Дальше всё следует по стандартной процедуре таблиц и цепочек правил.

Изменения в остальных правилах сделаны для наглядности и их сути не меняют.

#166051

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

#166056

Сейчас некогда, ну всё - равно щаз Kettler появиться он со сквидом побольше возился, так что подожди. smile

#166063

Нарыл в интернетах кой-какую инфу:

text
Задача: нужно сделать переадресацию с определённого ip порта 6669 на другой ip, только на порт 6667:

Решение: iptables -t nat -A PREROUTING -s 192.168.62.0/24 -d 192.168.100.14 -p tcp --dport 6669 -j DNAT --to-destination 192.168.62.1:6667

'REDIRECT' можно использовать при перенаправлении портов _только_ на локальной машине. Сделать так, как это описано в совете (перенаправить с одного адреса на другой), с REDIRECT не получится.

Похоже как раз мой случай. Буду пробовать завтра, о результатах отпишусь.

#166067

Acuk, я из твоего задания понял, что на одной машине всё делается, тогда редирект, если на разных, то это проброс:
Я тут справочку себе закинул:
http://zenon.sytes.net/probros-porta-v-iptables/

#166117

Спасибо, то что нужно. Действительно не очень четко сформировал цель.
PS не знал, что проксирование тоже натом рулится. Думал для этого какие-то отдельные средства нужны.
Спасибо за помощь.

Добавлено:
Что-то все-равно не получается.
Ввожу дополнительные данные:
Проброс требуется установить до сервиса yota music.
ip 94.25.208.227
пакеты идут на порты 80 и 443
мне нужно пустить их через прокси хх.хх.хх.хх:888, находящийся в интернетах
Телевизору присвоен ip 192.168.1.3(dhcp), ip адрес роутера 192.168.1.1
Как заскриптовать?
Попробовал:
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -d 94.25.208.227 -p tcp/all --dport 80/443 -j DNAT --to-destination xx.xx.xx.xx:888
Без видимого эффекта: пакеты как шли так и идут напрямую, не через прокси.

#166779

ап. Вопрос все еще актуален.

#166809

iptables -t nat -A PREROUTING -s 192.168.1.0/24 --dport 80/443 -j DNAT --to-destination xx.xx.xx.xx:888

При этом ток forward правило accept

или

iptables -t nat -A PREROUTING -p tcp -s 192.168.1.0/24 --dport 80 -j DNAT --to-destination 192.168.0.1:80
iptables -t nat -A PREROUTING -p tcp -s 192.168.1.0/24 --dport 443 -j DNAT --to-destination 192.168.0.1:443

Ток 443 сквозной толком не пашет!

#166811

iptables -t nat -A PREROUTING -s 192.168.1.0/24 --dport 80/443 -j DNAT --to-destination xx.xx.xx.xx:888

При этом ток forward правило accept

То есть к созданному добавить еще одно правило вида:
iptables -A FORWARD -i eth0 -d LOCAL_IP -p All --dport 80/443 -j ACCEPT
Верно понимаю?

#166812

Так читабельнее
#80
iptables -A FORWARD -s 192.168.1.0/24 -d $ipsquid --dport 80 -j ACCEPT
iptables -A FORWARD -s $ipsquid -d 192.168.1.0/24 --sport 80 -j ACCEPT
443
iptables -A FORWARD -s 192.168.1.0/24 -d $ipsquid --dport 443 -j ACCEPT
iptables -A FORWARD -s $ipsquid -d 192.168.1.0/24 --sport 443 -j ACCEPT

#166839

Kettler, у меня нет сквида - ибо линукс встроен в роутер (wl-600g), ресурсы ограничены. Надо обойтись средствами iptables. Но чего-то не получается.
Еще раз подробно:
Имею роутер wl-600g и ADSL интернет к нему 6mbit во внутреннюю сеть провайдера.
В этой сети есть прокси через который надо получить выход в интернеты (конкретизирую - до сервиса yota-music) Прокси незапаролен
Netcast в телевизоре использует порты 80 и 443.
Локальную сеть перенастроил: отключил dhcp: телевизер имеет ip 192.168.1.3

iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination xxxxxxxxx:3128
iptables -t nat -A OUTPUT -p tcp --dport 443 -j DNAT --to-destination xxxxxxxxx:3128

Попробовал такую строчку-безрезультатно. Пакеты тупо идут напрямую (но провайдер ограничивает скорость доступа в интернеты до 64кбит), хотя по идее такой строчкой весь исходящий трафик на указанные порты должен тупо заворачиваться на прокси.

#166840

Не должен и не будет.
Пробуй вот такой скрипт

#!/bin/bash
$ipsquid=10.213.1.1
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -A PREROUTING -p tcp -s 192.168.1.0/24 --dport 80 -j DNAT --to-destination $ipsquid:80
iptables -t nat -A PREROUTING -p tcp -s 192.168.1.0/24 --dport 443 -j DNAT --to-destination $ipsquid:443

#166846

БИНГО!
Видимо дело было в непроброшенном порте и помогли эти строки:

text
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

Огромное спасибо за помощь! Дальше разберусь.

#166851

Теперь надо настраивать firewall
На счёт 443 (https) он не может толком работать в таком режиме.

#166856
Acuk написал:
БИНГО!
Видимо дело было в непроброшенном порте и помогли эти строки:
text
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

Огромное спасибо за помощь! Дальше разберусь.

Значит что-то было закрыто, вообще полностью всё открывать как вы сейчас сделали нельзя, политики по умолчанию хотя бы должны быть:

text
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEP

желательно вот так

text
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

а уже после этого открывать что-то...

#166863

newzenon я стобой согласен но главное найти проблему а потом от неё плясать.
Да и input просто так закрыть нельзя.

#166866

#!/bin/bash
$ipsquid=10.213.1.1
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -s 192.168.1.0/24 --dport 80 -j DNAT --to-destination $ipsquid:80
iptables -t nat -A PREROUTING -p tcp -s 192.168.1.0/24 --dport 443 -j DNAT --to-destination $ipsquid:443

Так выглядит набор на стандартных роутерах.

Войдите или зарегистрируйтесь, чтобы ответить.