LinuxForum.Fans
Тема

Simple gateway iptables.

Автор: u_snif 12 сообщений 6797 просмотров
#14565

Здравствуйте, сам я с iptables`ом не особо дружу, да и обычно юзал готовые скрипты для шлюзов немного правив их под себя. Собственно вот схема:

Ну и небольшой комментарий. На машине имеется 2 сетевые карты, одна из них идет на внешку и на ней крутится 2 интерфейса - это eth0 (локалка провайдера) и ppp0 (l2tp туннель с выходом в мир). Вторая сетевуха должна отдавать всё на шлюз (роутер) 192.168.1.1/24, ну а шлюз (роутер) в свою очередь будет раздавать инет по вафле (на шлюзе свой DHCP и т.п.). Собственно помогите накидать скрипт. На внешку должно быть открыто определенное количество портов. В общем прошу помощи.
В данный момент я сам начал писать данный сркипт, но всё-же лучше было-бы если бы кто то помог.

#14577
.snif написал:
Здравствуйте, сам я с iptables`ом не особо дружу, да и обычно юзал готовые скрипты для шлюзов немного правив их под себя. Собственно вот схема:

Хм. А в чем проблема и в чем отличие.
У меня точно такая же схема. На железяке разрешил передачу пакетов во всех направлениях. На всех компах подключенных к железяке (и по вайфай и по проводу) поставил в качестве гейта комп с выходом в нет

Впрочем могу привести свой скрипт (правда он сейчас в ходе настройки)

text
#! /bin/sh
# rc.fw версии 20100203, Воробьев Александр aka voral (http://va-soft.com)
#
# rc.fw версии 20050914, Copyright (c) 2005 Дмитрий Кулаков aka morda <morda89@list.ru>, так-же при участии>:
# Журкин Владимир icCE aka Tuliss (icce@mail.ru)
#
# Чтобы запустить iptables введите команду:
# [root]# /etc/init.d/rc.fw start
#
# Для остановки:
# /etc/init.d/rc.fw stop
#
# Для сохранения списка правил в /etc/rules-save
# /etc/init.d/rc.fw save
#
# Для перезапуска iptables, с восстановлением правил из /etc/rules-save
# /etc/init.d/rc.fw restart
#
#

# Переменная, задающая путь к файлу запуска iptables. IPT=/sbin/iptables

# Ваш сетевой интерфейс. INET_IFACE="eth1" LOCL_IFACE="eth0" VPN_IFACE="ppp0"

# Номера непривилегированных портов UNPRIPORTS="1024:65535"

# Задайте в этой переменной порты, которые должны быть открыты в системе. # Для получения информации обо всех службах, которые могут открыть порты в системе введите команду: # $ cat /etc/services | grep нужная служба # Некоторые службы: # FTP клиент 20, 21 # SMPT клиент 25 # Telnet 23 # Whois 43 # Gopher 70 # Finger 79 # HTTP клиент 80 # POP3 клиент 110 # IMAP4 клиент 143 # Wais 210 # HTTPS клиент 443 OPENPORTS="20,21,25,23,43,70,79,80,110,210,443" #OPENPORTS="20,21,25,23,43,70,79,80,110,210,443" # SSH клиент SSH="22" SSHADR="192.168.1.0/24"

# Прописываем порты, которые открыты в системе, но которые не должны быть открыты на сетевых интерфейсах: CLOSEPORTS="630,640,783,3310,10000"

start_fw() {

# Включить перенаправление пакетов через ядро. echo 1 > /proc/sys/net/ipv4/ip_forward

# Загружаем некторое модули. Ip_nat_ftp требуется, чтобы преобразование сетевых адресов (Network Adress Translation) # производилось корректно с протоколами FTP /sbin/modprobe ip_nat_ftp /sbin/modprobe ip_conntrack_ftp echo 1 > /proc/sys/net/netfilter/nf_conntrack_acct

# Удаление правил $IPT -F $IPT -t nat -F $IPT -t mangle -F

# Очищаем нестандартные правила $IPT -X $IPT -t nat -X $IPT -t mangle -X

# Политики по умолчанию. $IPT -P INPUT DROP $IPT -P FORWARD DROP $IPT -P OUTPUT ACCEPT

# Samba $IPT -N SMB $IPT -A SMB -p tcp -m tcp -m multiport --dports 137,138,139,445 -s 192.168.1.0/24 -j ACCEPT $IPT -A SMB -p udp -m udp -m multiport --dports 137,138,139,445 -s 192.168.1.0/24 -j ACCEPT $IPT -A SMB -p tcp -m tcp -m multiport --sports 137,138,139,445 -s 192.168.1.0/24 -j ACCEPT $IPT -A SMB -p udp -m udp -m multiport --sports 137,138,139,445 -s 192.168.1.0/24 -j ACCEPT $IPT -A SMB -p tcp -m tcp -m multiport --dports 137,138,139,445 -j REJECT $IPT -A SMB -p udp -m udp -m multiport --dports 137,138,139,445 -j REJECT $IPT -A SMB -p tcp -m tcp -m multiport --sports 137,138,139,445 -j REJECT $IPT -A SMB -p udp -m udp -m multiport --sports 137,138,139,445 -j REJECT

# Разрешаем прохождение любого трафика по интерфейсу обратной петли. $IPT -A INPUT -i lo -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT

# Отбрасывать все пакеты, которые не могут быть идентифицированы и поэтому не могут иметь определенного статуса. $IPT -A INPUT -m state --state INVALID -j DROP $IPT -A FORWARD -m state --state INVALID -j DROP

# Существует одна из разновидностей спуфинг-атак, которая называется "Предсказание номера TCP-последовательности". # Смысл атак такого рода заключается в использовании чужого IP-адреса для нападения на какой либо узел сети. $IPT -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset

# Пакеты со статусом NEW и со сброшенным битом SYN. $IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

# Принимать все пакеты, которые инициированы из уже установленного соединения, и имеющим признак ESTABLISHED. # Состояние ESTABLISHED говорит о том, что это не первый пакет в соединении. $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# SYN наводнение. # Приводит к связыванию системных ресурсов, так что реальных обмен данными сsshтановится не возможным. #$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j ULOG #$IPT -A OUTPUT -p tcp ! --syn -m state --state NEW -j ULOG # $IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP # $IPT -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP

# DNS сервер имен разрешаем. # $IPT -A INPUT -p udp -s 192.168.1.11 -m udp --dport 53 -j ACCEPT # $IPT -A OUTPUT -p udp -m udp -o $INET_IFACE --dport 53 --sport $UNPRIPORTS -j ACCEPT # $IPT -A OUTPUT -p tcp -m tcp -o $INET_IFACE --dport 53 --sport $UNPRIPORTS -j ACCEPT # $IPT -A INPUT -p udp -m udp -i $INET_IFACE --dport $UNPRIPORTS --sport 53 -j ACCEPT # $IPT -A INPUT -p tcp -m tcp -i $INET_IFACE --dport $UNPRIPORTS --sport 53 -j ACCEPT # UDP наводнение # $IPT -A INPUT -p TCP -s 0/0 --destination-port 113 --syn -j ACCEPT

# Службы использующие UDP, очень часто становятся мишенью для атак с целью вывода системы из строя. #$IPT -A INPUT -p UDP -s 0/0 --destination-port 138 -j ULOG # $IPT -A INPUT -p UDP -s 0/0 --destination-port 138 -j DROP # $IPT -A INPUT -p UDP -s 0/0 --destination-port 113 -j REJECT # $IPT -A INPUT -p UDP -s 0/0 --source-port 67 --destination-port 68 -j ACCEPT # $IPT -A INPUT -p UDP -j RETURN # $IPT -A OUTPUT -p UDP -s 0/0 -j ACCEPT

# ICMP - перенаправление # ICMP- сообщение указывает системе изменить содержимое таблиц маршрутизации с тем, что бы направлять # пакеты по более короткому маршруту. Может быть использовано взломщиком для пере-направления вашего трафика через свою машину. #$IPT -A INPUT --fragment -p ICMP -j ULOG #$IPT -A OUTPUT --fragment -p ICMP -j ULOG # $IPT -A INPUT --fragment -p ICMP -j DROP # $IPT -A OUTPUT --fragment -p ICMP -j DROP

#Для VPN $IPT -A INPUT -p 47 -m state --state ESTABLISHED,RELATED -i $INET_IFACE -j ACCEPT $IPT -A OUTPUT -p TCP --dport 1723 -o $INET_IFACE -j ACCEPT $IPT -A OUTPUT -p 47 -o $INET_IFACE -j ACCEPT

# Разрешаем ICMP соединение. Значительная часть ICMP используется для передачи сообщений о # том, что происходит с тем или иным или TCP соединением. # $IPT -A INPUT -p icmp -m icmp -i $INET_IFACE --icmp-type source-quench -j ACCEPT # $IPT -A OUTPUT -p icmp -m icmp -o $INET_IFACE --icmp-type source-quench -j ACCEPT

# Разрешаем себе ping наружу, полностью запрещаем ping своей машины. #$IPT -A INPUT -p icmp -m icmp -i $INET_IFACE --icmp-type echo-reply -j ACCEPT #$IPT -A OUTPUT -p icmp -m icmp -o $INET_IFACE --icmp-type echo-request -j ACCEPT

# $IPT -A INPUT -p icmp -m icmp -i $INET_IFACE --icmp-type echo-reply -j ACCEPT # $IPT -A OUTPUT -p icmp -m icmp -o $INET_IFACE --icmp-type echo-request -j ACCEPT

# $IPT -A INPUT -p icmp -m icmp -i $VPN_IFACE --icmp-type echo-reply -j ACCEPT # $IPT -A OUTPUT -p icmp -m icmp -o $VPN_IFACE --icmp-type echo-request -j ACCEPT

# $IPT -A INPUT -p icmp -m icmp -i $LOCL_IFACE --icmp-type echo-reply -j ACCEPT # $IPT -A OUTPUT -p icmp -m icmp -o $LOCL_IFACE --icmp-type echo-request -j ACCEPT

# Разрешаем себе ping наружу, ставим ограничение на ping своей машины. #$IPT -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 2 -j ACCEPT #$IPT -A INPUT -p icmp --icmp-type echo-request -j DROP #$IPT -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 2 -j ACCEPT #$IPT -A FORWARD -p icmp --icmp-type echo-request -j DROP #$IPT -A INPUT -p icmp -j ACCEPT #$IPT -A FORWARD -p icmp -j ACCEPT

# Разрешаем передачу пакета - некорректный параметр - используется, если в заголовке пакета содержится недопустимая запись, # или если контрольная сумма заголовка не соответствует контрольной сумме, указанной передающим узлом. # $IPT -A INPUT -p icmp -m icmp -i $INET_IFACE --icmp-type parameter-problem -j ACCEPT # $IPT -A OUTPUT -p icmp -m icmp -o $INET_IFACE --icmp-type parameter-problem -j ACCEPT

# Запрещаем подключение к X серверу через сетевые интерфейсы. $IPT -A INPUT -p tcp -m tcp -i $INET_IFACE --dport 6000:6063 -j DROP --syn

# Прописываем порты, которые открыты в системе, но которые не должны быть открыты на сетевых интерфейсах: # $IPT -A INPUT -p tcp -m tcp -m multiport -i $INET_IFACE -j DROP --destination-ports $CLOSEPORTS

# Разрешаем AUTH-запросы на удаленные сервера, на свой же компьютер - запрещаем. # $IPT -A OUTPUT -p tcp -m tcp -o $INET_IFACE --dport 113 --sport $UNPRIPORTS -j ACCEPT # $IPT -A INPUT -p tcp -m tcp -i $INET_IFACE --dport $UNPRIPORTS --sport 113 -j ACCEPT ! --syn # $IPT -A INPUT -p tcp -m tcp -i $INET_IFACE --dport 113 -j DROP

# $IPT -A OUTPUT -p tcp -m tcp -o $VPN_IFACE --dport 113 --sport $UNPRIPORTS -j ACCEPT # $IPT -A INPUT -p tcp -m tcp -i $VPN_IFACE --dport $UNPRIPORTS --sport 113 -j ACCEPT ! --syn # $IPT -A INPUT -p tcp -m tcp -i $VPN_IFACE --dport 113 -j DROP # Открываем некоторые порты:

# Открытые порты

# $IPT -A OUTPUT -p tcp -m tcp -m multiport -o $INET_IFACE --destination-ports $OPENPORTS --sport $UNPRIPORTS -j ACCEPT # $IPT -A OUTPUT -p tcp -m tcp -m multiport -o $VPN_IFACE --destination-ports $OPENPORTS --sport $UNPRIPORTS -j ACCEPT

# $IPT -A OUTPUT -p tcp -m tcp -o $INET_IFACE --sport 20 -j ACCEPT # $IPT -A OUTPUT -p tcp -m tcp -o $VPN_IFACE --sport 20 -j ACCEPT

# $IPT -A INPUT -p tcp -m tcp -m multiport -i $INET_IFACE --dport $UNPRIPORTS --source-ports $OPENPORTS -j ACCEPT --syn # $IPT -A INPUT -p tcp -m tcp -m multiport -i $VPN_IFACE --dport $UNPRIPORTS --source-ports $OPENPORTS -j ACCEPT --syn

# SSH клиент # $IPT -A OUTPUT -p tcp -m tcp -m multiport -o $INET_IFACE --destination-ports $SSH --sport $UNPRIPORTS -j ACCEPT #$IPT -A INPUT -p tcp -s $SSHADR -m tcp -m multiport -i $INET_IFACE --dport $UNPRIPORTS --source-ports $SSH -j ACCEPT ! --syn #$IPT -A OUTPUT -p tcp -m tcp -m multiport -o $INET_IFACE --destination-ports $SSH --sport 1020:1023 -j ACCEPT #$IPT -A INPUT -p tcp -s $SSHADR -m tcp -m multiport -i $INET_IFACE --dport 1020:1023 --source-ports $SSH -j ACCEPT ! --syn # $IPT -A OUTPUT -p tcp -m tcp -m multiport --destination-ports $SSH --sport $UNPRIPORTS -j ACCEPT #$IPT -A INPUT -p tcp -s $SSHADR -m tcp -m multiport --dport $UNPRIPORTS --source-ports $SSH -j ACCEPT #$IPT -A OUTPUT -p tcp -m tcp -m multiport --destination-ports $SSH --sport 1020:1023 -j ACCEPT #$IPT -A INPUT -p tcp -s $SSHADR -m tcp -m multiport --dport 1020:1023 --source-ports $SSH -j ACCEPT

#$IPT -A OUTPUT -p tcp -m tcp -m multiport --destination-ports $SSH --sport 1020:1023 -j ACCEPT # $IPT -A INPUT -p tcp -s $SSHADR -m tcp -m multiport --dport 1020:1023 --source-ports $SSH -j ACCEPT # Samba $IPT -A INPUT -j SMB $IPT -A OUTPUT -j SMB

# $IPT -A OUTPUT -p udp -m udp -m multiport -o $INET_IFACE --destination-ports 139,4444,5554,5555 --sport $UNPRIPORTS -j ACCEPT # $IPT -A INPUT -p udp -m udp -m multiport -i $INET_IFACE --dport $UNPRIPORTS --source-ports 139,4444,5554,5555 -j ACCEPT

#traseroute #$IPT -A OUTPUT -p udp -m udp -o $INET_IFACE --dport 33434:33523 --sport 32769:65535 -j ACCEPT

# Разрешаем прохождение DHCP запросов через iptables. Нужно, если IP адрес динамический. # $IPT -A OUTPUT -p udp -m udp -o $INET_IFACE --dport 67 --sport 68 -j ACCEPT # $IPT -A INPUT -p udp -m udp -i $INET_IFACE --dport 68 --sport 67 -j ACCEPT

$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A FORWARD -i $LOCL_IFACE -j ACCEPT

$IPT -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE $IPT -t nat -A POSTROUTING -o $VPN_IFACE -j MASQUERADE $IPT -t nat -A POSTROUTING -o $LOCL_IFACE -j MASQUERADE

#$IPT -A INPUT -s 10.0.0.1 -j ACCEPT #$IPT -A OUTPUT -j ACCEPT #$IPT -A INPUT -s 10.0.0.1 -j ACCEPT #$IPT -A OUTPUT -j ACCEPT

# $IPT -A FORWARD -j LOG --log-prefix "IPT DEF" #$IPT -A OUTPUT -j LOG --log-prefix "IPT LOG " }

case "$1" in start) echo -n "Starting firewall: iptables." start_fw echo "." ;; stop) echo -n "Stopping firewall: iptables\n" # Удаление правил. $IPT -F $IPT -t nat -F $IPT -t mangle -F

# Очищаем нестандартные правила. $IPT -X $IPT -t nat -X $IPT -t mangle -X

# Разрешаем весь трафик. $IPT -P INPUT ACCEPT $IPT -P FORWARD ACCEPT $IPT -P OUTPUT ACCEPT echo "." ;; save) echo -n "Saving firewall: iptables\n" /sbin/iptables-save -c > /etc/iptables echo "."

;; restart) echo -n "Restarting firewall: iptables\n" # Удаление правил. $IPT -F $IPT -t nat -F $IPT -t mangle -F

# Очищаем нестандартные правила. $IPT -X $IPT -t nat -X $IPT -t mangle -X start_fw echo "." ;; *) echo "Usage: /etc/init.d/rc.fw start|stop|save\n" exit 1 ;; esac exit 0

#14596

voral, спс, щас поюзаю :) а в принципе можно же по сути поднять на серваке VPN и на роутере настроить подключение к впну и без всяких шлюзов обойтись.

#14605
.snif написал:
а в принципе можно же по сути поднять на серваке VPN и на роутере настроить подключение к впну и без всяких шлюзов обойтись.

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

#14619
voral написал:
а смысл? И так все замечательно работает без всяких впн все ж компы и роутер в одной подсети.

ну я не особо люблю мудрости с iptablesом, просто это как альтернативный вариант :)

#14624
.snif написал:
ну я не особо люблю мудрости с iptablesом, просто это как альтернативный вариант :)

в том то и фишка, что тут ни какой "мудрости" нет. Единственное, что нужно для этих целей, на машине раздающей интернет: настроить маскарадинг и все. Как это сделать (раздать интренет) куча тем с решениями (точнее все сводится к одному):

text

    $IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
    $IPT -A FORWARD -i $LOCL_IFACE -j ACCEPT
    $IPT -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE
    $IPT -t nat -A POSTROUTING -o $VPN_IFACE -j MASQUERADE
    $IPT -t nat -A POSTROUTING -o $LOCL_IFACE -j MASQUERADE

в железяке настроить что бы пакеты ходили между вайфаем и езернетом (без этого у вас вообще ни чего работать не будет). Ну и на машинах клиентах в качестве гейта указать не железяку а машину с выходом

#14635
voral написал:
в железяке настроить что бы пакеты ходили между вайфаем и езернетом (без этого у вас вообще ни чего работать не будет). Ну и на машинах клиентах в качестве гейта указать не железяку а машину с выходом

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

#14913

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

#14926
.snif написал:
а вот по поводу форвардинга пакетов между езернетом и вафлей можно поподробнее?

У меня за это (как я понял и у вас) отвечает железяка. У меня если, быть точным, adsl интернет станция (только ADSL я сейчас не использую). Так вот у меня в ее настройка есть прямо "галочки": Разрешить пакеты адсл - лан, адсл - влан, лан-влан, лан-лан. И все :)

и кроме того, как я и говорил, у меня железяка, клиенты по езернету и клиенты по вайфаю находятся в одной подсети

#15107

Оговорюсь снова, что интерфейса wlanX не будет, т.к. раздавать инет по вайле будет роутер который в своб очередь подключен к eth0 - тобишь к локалке. Ну в общем попробую накатать свой скрипт используя скрипт от voral. В общем основное, что нужно это по сути маскардинг и всё?

#15118
.snif написал:
В общем основное, что нужно это по сути маскардинг и всё?

Да. Вашу задачу стоит разделить на несколько (по объекту настройки):

1. Настройка компа раздающего интернет. Вполне можете представить, что вообще только один клтиент к нему подключен (но с изменяющимся в рамках одной поcети ip) т.е маскарадинг.

2. На клиентских компах. (Устанавливаем в качесвте гейта раздающий комп)

3. Добейтесь чтоб со всех компов был пинг на раздающий по локальному адресу. (это в настройках вашего роутера)

Еще из опций. (Я сделал так у себя) Можно установить на раздающем компе DNS сервер (bind9) и на клиентах прописать этот комп в качеcтве dns.

#15213

voral, да по большому счету на клиентских машинах всё будет получаться через DHCP, а DHCP на роутере я настрою и внесу туда ранг выдаваемых IP адресов и т.п. Главное что-бы с этой локалки был выход на сервер ну и собственно сам интернет. Ну касаемо самого сервера раздающего инет, там задействован лишь маскардинг как я понимаю? остальное это излишки. Ну и собственно клиенты через шлюз 192.168.1.1 должны иметь доступ к серверу по локалке (то есть сервер тоже должен быть в этой локалке и иметь локальный ип)

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