Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: iptables + резалка портов = РЕШЕНО!!!  (Прочитано 17316 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн tierpunk

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
iptables + резалка портов = РЕШЕНО!!!
« : 20 Марта 2008, 17:12:55 »
Ребят у меня след картина

Debian 4.0
Squid Cache: Version 2.6.STABLE5
iptables v1.3.6

eth0 - локальная сеть 192....

eth1 - интернет 10....

Задача:
1 Заворачивать запросы с 80 порта на порт прокси 3128
2 Открыть нужные порты
3 Все остальное запретить

Все цели достигнуты! вот скрипт правил iptables...

#!/bin/sh
PATH=/usr/sbin:/sbin:/bin:/usr/bin
#
# удалить все действующие правила
#
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
# Правила по умолчанию
iptables -P INPUT DROP #Запрещаем все входящие!
iptables -P OUTPUT ACCEPT #Разрешаем все исходящие!
iptables -P FORWARD DROP #Запрещаем все проходящие (транзит)!
# Открываем порты
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 8000 -j ACCEPT #Радио
iptables -A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT #Антибаннер для прокси
iptables -A INPUT -p tcp -m tcp --dport 3128 -j ACCEPT #Прокси
# Разрешить соединения, которые инициированы изнутри (eth0)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -i ! eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# Разрешить доступ из LAN-сети к внешним сетям
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 110 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 2525 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 8000 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p udp --dport 53 -j ACCEPT
# Masquerade.
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
# Запретить forward извне во внутреннюю сеть
iptables -A FORWARD -i eth1 -o eth1 -j REJECT
# Включить forward
echo 1 > /proc/sys/net/ipv4/ip_forward
# Transparent
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128

p.s. Я не притендую на самый правельный способ
p.s.s Если у вас это не сработает или что то даже сломаеться то я не несу никакой ответственности за это!
p.s.s.s У меня это заработало после многих попыток и обсуждений, и в какой раз я убеждаюсь, что не linux сломан, а я дурак!
« Последнее редактирование: 15 Апреля 2008, 12:54:00 от tierpunk »

Оффлайн nWo_omsk

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
незнаю где написать но напишу тут .
У меня есть сервер раздающиё инет нужно релизовать с помощью iptables выдачую определённого канала определённым ип адресам как это реализовывать?  желательно с хелпом по установке.
заранее спс

Оффлайн nWo_omsk

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
у меня уже стоит билинг СТГ(старгейзер) мне нужно без дхцпы тупо резать канал от сервера до ипа клиента.

Оффлайн Gundos

  • Новичок
  • *
  • Сообщений: 33
    • Просмотр профиля
Теоретически ваш скрипт должен работать, и в маскву через Владивасток тоже можно ездить, но када говорят "закрыл все порты" имеют в виду установку политики "по умолчанию" для цепочки INPUT таблицы Filter, которая запреща ла бы прохождение любого траффика:

$IPTABLES -P INPUT DROP



При беглом просмотре:

# Переадрисация
iptables -t nat -A PREROUTING -p tcp --dport 8000 -j DNAT --to-destination 192.168.88.230:8000
Здесь ошибка, нельзя указывать порт, создайте отдельное правило для выполнения REDIRECT

# Masquerade.
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
Если внешний ip не изменяется, замените на SNAT

# Запретить forward извне во внутреннюю сеть
iptables -A FORWARD -i eth1 -o eth1 -j REJECT
Указан один и тот же интерфейс

Домашнее задание: http://gazette.linux.ru.net/archive/iptables-tutorial-1.1.19.tar.bz2
« Последнее редактирование: 22 Марта 2008, 14:44:19 от Gundos »

Оффлайн Gundos

  • Новичок
  • *
  • Сообщений: 33
    • Просмотр профиля
Надо полагать, что вся связь с внешним миром из рабочей сети должна осуществляться через proxy, тогда вам подойдёт это:
#!/bin/sh

#
# Путь к iptables
#
IPTABLES="/sbin/iptables"

#
# Очистка таблиц, установка политик в значения "по умолчанию"
#

#
# Установка стандартных политик в таблице filter.
#
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -P OUTPUT ACCEPT

#
# Установка стандартных политик в таблице nat.
#
$IPTABLES -t nat -P PREROUTING ACCEPT
$IPTABLES -t nat -P POSTROUTING ACCEPT
$IPTABLES -t nat -P OUTPUT ACCEPT

#
# Установка стандартных политик в таблице mangle.
#
$IPTABLES -t mangle -P PREROUTING ACCEPT
$IPTABLES -t mangle -P OUTPUT ACCEPT

#
# Удаление всех правил во всех таблицах.
#
$IPTABLES -F
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
#
# Удаление пользовательских правил во всех таблицах.
#
$IPTABLES -X
$IPTABLES -t nat -X
$IPTABLES -t mangle -X
######################################################
# Конфигурационные настройки.
#

# ВЫКЛЮЧИТЬ forward
# Именно ВЫКЛЮЧИТЬ, этим мы запретим движение траффика
# МИМО локальных приложений
echo 0 > /proc/sys/net/ipv4/ip_forward

#
# Конфигурация интернет.
#

INET_IP="10.30.2.77"
INET_IFACE="eth1"

#
# Конфигурация рабочей сети.
#

LAN_IP="192.168.88.1" #    ВНИМАНИЕ!!! Здесь должен быть ip вашего сетевого экрана
LAN_IP_RANGE="192.168.88.0/24"
LAN_IFACE="eth0"

#
# Конфигурация обратной петли Loopback.
#

LO_IFACE="lo"
LO_IP="127.0.0.1"
LO_IP_RANGE="127.0.0.0/8"


#
# Установка политик
#

$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

# Открываем порты НА СЕТЕВОМ ЭКРАНЕ

# Для уже существующих TCP соединений
$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT

# Для вновь открываемых входящих TCP соединений

# Если надо ограничить доступ на определённый порт из какой-то одной сети,
# то правило приобретёт примерно такой вид:
# $IPTABLES -A INPUT -p tcp -m tcp -i $LAN_IFACE --dport 21 -j ACCEPT
# Это правило например разрешает доступ на FTP только из вашей рабочей сети.

$IPTABLES -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
$IPTABLES -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
$IPTABLES -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
$IPTABLES -A INPUT -p tcp -m tcp --dport 8000 -j ACCEPT #Радио
$IPTABLES -A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT #Антибаннер для прокси
$IPTABLES -A INPUT -p tcp -m tcp --dport 3128 -j ACCEPT #Прокси

#
# Фильтруем ИСХОДЯЩИЙ С СЕТЕВОГО ЭКРАНА траффик
#

# Эти правила разрешают уходить С СЕТЕВОГО ЭКРАНА только
# пакетам имеющим исходящий адрес принадлежащий сетевому экрану

$IPTABLES -A OUTPUT -p ALL -s $LO_IP_RANGE -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $INET_IP -j ACCEPT


#
# NAT
#

#
# PREROUTING
#

$IPTABLES -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128

Скрипт имеет следующие свойства:
1, Отвечает требованиям общей политики построения экрана - "Что не разрешено, то запрещено."
2, Чистит таблицы при запуске
3, Позволяет подключаться к указанным портам из ОБЕИХ сетей (см комментарии в коде).
4, Разрешает движение траффика с сетевого экрана в случае если адрес отправителя есть адрес экрана.
5, Переброс запрсов идущих на 80 порт экрана из рабочей сети на 3128 порт.
6, Допускает движение ТОЛЬКО TCP пакетов.
« Последнее редактирование: 25 Марта 2008, 02:29:43 от Gundos »

Оффлайн tierpunk

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: iptables + резалка портов = РЕШЕНО!!!
« Ответ #5 : 15 Апреля 2008, 18:38:01 »
появилась новая проблема, не могу настроить переброс порта через шлюз в инет....
А именно нужно что бы при запросу на 10.30.2.77 или 192.168.88.1 порт 80 запрос переводился на 192.168.88.14 порт 80.....

пробовал добавить в конец вот эти строки, не помогает... укажите пожалуйста на ошибку.

iptables -t nat -A PREROUTING -p tcp -d 10.30.2.77 --dport 80 -j DNAT --to-destination 192.168.88.14:80
iptables -t nat -A POSTROUTING -p tcp --dst 192.168.88.14 --dport 80 -j SNAT --to-source 10.30.2.77



Оффлайн tierpunk

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: iptables + резалка портов = РЕШЕНО!!!
« Ответ #6 : 15 Апреля 2008, 19:43:49 »
появилась новая проблема, не могу настроить переброс порта через шлюз в инет....
А именно нужно что бы при запросу на 10.30.2.77 или 192.168.88.1 порт 80 запрос переводился на 192.168.88.14 порт 80.....

пробовал добавить в конец вот эти строки, не помогает... укажите пожалуйста на ошибку.

iptables -t nat -A PREROUTING -p tcp -d 10.30.2.77 --dport 80 -j DNAT --to-destination 192.168.88.14:80
iptables -t nat -A POSTROUTING -p tcp --dst 192.168.88.14 --dport 80 -j SNAT --to-source 10.30.2.77

Пока что решил проблему установкой nginx на шлюз...
Но хотелось бы найти решение и для iptables...

Оффлайн DYm00n

  • Участник
  • *
  • Сообщений: 191
    • Просмотр профиля
Re: iptables + резалка портов = РЕШЕНО!!!
« Ответ #7 : 15 Апреля 2008, 19:59:22 »
tierpunk а в твоем скрипте торрент клиент будет нормально работать?

Оффлайн tierpunk

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: iptables + резалка портов = РЕШЕНО!!!
« Ответ #8 : 15 Апреля 2008, 22:28:45 »
tierpunk а в твоем скрипте торрент клиент будет нормально работать?
с внутренней сети, которые лазиют в инет через шлюз со скриптом нет! проверял!
и со шлюза тоже не должен работать, по крайне мере на прием (input) информации... а на отдачу (output) может и заработает.  не проверял!

Оффлайн RavIkmgk

  • Новичок
  • *
  • Сообщений: 1
    • Просмотр профиля
Re: iptables + резалка портов = РЕШЕНО!!!
« Ответ #9 : 14 Августа 2008, 10:11:25 »
Так какой скрипт предпочтительней? tierpunk или Gundos? Да и потом не сказано нигде как этот скрипт потом запускать? Куда ложить? Я уже недели две пытаюсь запустить такой вариант... главное просто шлюз (с кэширующим прокси) просто сделать (просто ставишь тупо dnsmasq и ipmasq) со сквидом заворачивашь 80 порт на сквид и всё, а вот такой вариант как у тебя... как замутить?
Мои действия такие.
1. ставим систему
2. настраиваем локалку, нет
3. ставим squid
4. подгружаем твой скрипт?

и тогда у нас получилось, прокси сервер + открытые порты необходимые нам. Правильная последовательность действий или что-то не так?

Оффлайн pehser

  • Активист
  • *
  • Сообщений: 586
  • sidux 64bit + KDE4 svn
    • Просмотр профиля
    • Магазин електро и бытовой техники в николаеве
Re: iptables + резалка портов = РЕШЕНО!!!
« Ответ #10 : 14 Августа 2008, 12:35:11 »
А если у меня инет через ADSL и IP провайдера я не знаю то что надо писать вместо

#
# Конфигурация интернет.
#

INET_IP="10.30.2.77"
INET_IFACE="eth1"

Оффлайн Gundos

  • Новичок
  • *
  • Сообщений: 33
    • Просмотр профиля
Re: iptables + резалка портов = РЕШЕНО!!!
« Ответ #11 : 14 Августа 2008, 16:46:28 »
А если у меня инет через ADSL и IP провайдера я не знаю то что надо писать вместо

#
# Конфигурация интернет.
#

INET_IP="10.30.2.77"
INET_IFACE="eth1"

Скорее всего ип провайдера Вам не пригодиться ( на самом деле в этом примере указан Ваш потенциальный ип). Зато точно можете быть уверены, что надо указать интерфейс, который смотрит во внешний мир и Ваш ип-адрес, если он известен и не изменяется с течением времени. В противном случае используем маскарадинг ( -j MASQUERADE ). Каждый вопрос очень индивидуален, постарайтесь описать проблему подробнее и указать цели которые Вы преследуете, если расчитываете на помощь.



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

Оффлайн pehser

  • Активист
  • *
  • Сообщений: 586
  • sidux 64bit + KDE4 svn
    • Просмотр профиля
    • Магазин електро и бытовой техники в николаеве
Re: iptables + резалка портов = РЕШЕНО!!!
« Ответ #12 : 14 Августа 2008, 17:57:18 »

Скорее всего ип провайдера Вам не пригодиться ( на самом деле в этом примере указан Ваш потенциальный ип). Зато точно можете быть уверены, что надо указать интерфейс, который смотрит во внешний мир и Ваш ип-адрес, если он известен и не изменяется с течением времени. В противном случае используем маскарадинг ( -j MASQUERADE ). Каждый вопрос очень индивидуален, постарайтесь описать проблему подробнее и указать цели которые Вы преследуете, если расчитываете на помощь.



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

Доку я читал уже не раз но писать самому все заново %)
ситуация такая
итнерфес Eth0 смотрит в нет ip динамическирй
Eth1 в локалку IP статический 192.168.100.1

Оффлайн Gundos

  • Новичок
  • *
  • Сообщений: 33
    • Просмотр профиля
Re: iptables + резалка портов = РЕШЕНО!!!
« Ответ #13 : 15 Августа 2008, 02:32:58 »
Не мудрствуя лукаво и не заморачиваясь фильтрацией трафика и пробросом соединений в локалку, всё будет элементарно:


echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o eth0 -j MASQUERADE


Эти две команды обеспечат соответственно включение режима мершрутизации и замену ip адреса отправителя во всех исходящих ip пакетах на адрес интерфейса eth0, обратная подстановка происходит автоматически.

192.168.0.0/16 - укажите длину вашей маски подсети
 
Разумеется в на всех компах в локалке дефолтный маршрут должен указывать на ваш шлюз - 192.168.100.1
« Последнее редактирование: 15 Августа 2008, 02:35:03 от Gundos »

 

Страница сгенерирована за 0.042 секунд. Запросов: 23.