Здравствуйте, сам я с iptables`ом не особо дружу, да и обычно юзал готовые скрипты для шлюзов немного правив их под себя. Собственно вот схема:
![]()
Ну и небольшой комментарий. На машине имеется 2 сетевые карты, одна из них идет на внешку и на ней крутится 2 интерфейса - это eth0 (локалка провайдера) и ppp0 (l2tp туннель с выходом в мир). Вторая сетевуха должна отдавать всё на шлюз (роутер) 192.168.1.1/24, ну а шлюз (роутер) в свою очередь будет раздавать инет по вафле (на шлюзе свой DHCP и т.п.). Собственно помогите накидать скрипт. На внешку должно быть открыто определенное количество портов. В общем прошу помощи.
В данный момент я сам начал писать данный сркипт, но всё-же лучше было-бы если бы кто то помог.
Simple gateway iptables.
Здравствуйте, сам я с iptables`ом не особо дружу, да и обычно юзал готовые скрипты для шлюзов немного правив их под себя. Собственно вот схема:
Хм. А в чем проблема и в чем отличие.
У меня точно такая же схема. На железяке разрешил передачу пакетов во всех направлениях. На всех компах подключенных к железяке (и по вайфай и по проводу) поставил в качестве гейта комп с выходом в нет
Впрочем могу привести свой скрипт (правда он сейчас в ходе настройки)
#! /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
voral, спс, щас поюзаю :) а в принципе можно же по сути поднять на серваке VPN и на роутере настроить подключение к впну и без всяких шлюзов обойтись.
а в принципе можно же по сути поднять на серваке VPN и на роутере настроить подключение к впну и без всяких шлюзов обойтись.
а смысл? И так все замечательно работает без всяких впн все ж компы и роутер в одной подсети.
а смысл? И так все замечательно работает без всяких впн все ж компы и роутер в одной подсети.
ну я не особо люблю мудрости с iptablesом, просто это как альтернативный вариант :)
ну я не особо люблю мудрости с iptablesом, просто это как альтернативный вариант :)
в том то и фишка, что тут ни какой "мудрости" нет. Единственное, что нужно для этих целей, на машине раздающей интернет: настроить маскарадинг и все. Как это сделать (раздать интренет) куча тем с решениями (точнее все сводится к одному):
$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
в железяке настроить что бы пакеты ходили между вайфаем и езернетом (без этого у вас вообще ни чего работать не будет). Ну и на машинах клиентах в качестве гейта указать не железяку а машину с выходом
в железяке настроить что бы пакеты ходили между вайфаем и езернетом (без этого у вас вообще ни чего работать не будет). Ну и на машинах клиентах в качестве гейта указать не железяку а машину с выходом
про маскардинг я читал и немного работал с ним (перенаправлял запросы с 80 порта на ранг ипов), на клиентке по сути вобще ничего не надо указывать, т.к. роутер сам вышлет все настройки, достаточно будет лишь подключиться к своей сети, а вот по поводу форвардинга пакетов между езернетом и вафлей можно поподробнее?
ethX и wlanX это сетевые интерфейсы и если форвардинг включен, то и пакеты между ними будут ходить.
а вот по поводу форвардинга пакетов между езернетом и вафлей можно поподробнее?
У меня за это (как я понял и у вас) отвечает железяка. У меня если, быть точным, adsl интернет станция (только ADSL я сейчас не использую). Так вот у меня в ее настройка есть прямо "галочки": Разрешить пакеты адсл - лан, адсл - влан, лан-влан, лан-лан. И все :)
и кроме того, как я и говорил, у меня железяка, клиенты по езернету и клиенты по вайфаю находятся в одной подсети
Оговорюсь снова, что интерфейса wlanX не будет, т.к. раздавать инет по вайле будет роутер который в своб очередь подключен к eth0 - тобишь к локалке. Ну в общем попробую накатать свой скрипт используя скрипт от voral. В общем основное, что нужно это по сути маскардинг и всё?
В общем основное, что нужно это по сути маскардинг и всё?
Да. Вашу задачу стоит разделить на несколько (по объекту настройки):
1. Настройка компа раздающего интернет. Вполне можете представить, что вообще только один клтиент к нему подключен (но с изменяющимся в рамках одной поcети ip) т.е маскарадинг.
2. На клиентских компах. (Устанавливаем в качесвте гейта раздающий комп)
3. Добейтесь чтоб со всех компов был пинг на раздающий по локальному адресу. (это в настройках вашего роутера)
Еще из опций. (Я сделал так у себя) Можно установить на раздающем компе DNS сервер (bind9) и на клиентах прописать этот комп в качеcтве dns.
voral, да по большому счету на клиентских машинах всё будет получаться через DHCP, а DHCP на роутере я настрою и внесу туда ранг выдаваемых IP адресов и т.п. Главное что-бы с этой локалки был выход на сервер ну и собственно сам интернет. Ну касаемо самого сервера раздающего инет, там задействован лишь маскардинг как я понимаю? остальное это излишки. Ну и собственно клиенты через шлюз 192.168.1.1 должны иметь доступ к серверу по локалке (то есть сервер тоже должен быть в этой локалке и иметь локальный ип)