1-е что я хоче сказать порты бывают поразным протоколам TCP, UDP..... а не просто список портов, так что изучи для начала кокой протокол использует та или иная служба ...
А если хочешь чтоб все было по взрослому, то дядь в IPTABLES, Там нет ничего сложного, только кажеться. Почитай туториал по IPTABLES все поймешь за пару дней
я тебе чуть помогу для начала чтоб ты не парился, на сколько у мну хватит терпения )))))
Значит смотри сюда
Для начала тебе нужно создать сам скрипт для IPTABLES
обозначить статические переменные
потом тебе нужно определиться с зонами (интерфейсами) Может ты захочешь чтоб все-же на определенных интерфейсах было все открытоЮ, напримеря я себе подымал 4 зоны, одну к клиентам , одну VPN , одну DMZ и одну к инету))))) Так безопастнее ))
Значит вот тебе пример:
Допустим что у тебя есть 3 интерфейса один смотрит к провадеру, воторой смотрит к клиентам к которому они подключаются и авторизируются у тебя на PPTP
и 3-й смотрит к твоему копу или компам на отдельном свитче.
соответсвенно что не думать постоянно какой куда, и не переписывать постоянно весь скрипт, можно их задать в явно виде
к Приверу возмем интерфейс который смотрит на твою машину, пусть он будет у нас eth0
В скрипте мы его обозначим чтоб было проще нам на будеющее
назовем его допустим (название может быть какое тебе угодно хоть и одной буквой)- DMZ_IFACE
в скрипте оно будет выглядеть так DMZ_IFACE="eth0" - это пример задания переменной. Таким же образом ты можешь задать любое значение или выражение, даже целые строки...
Для того чтоб обратиться к переменной, нужно переде ее названием поставить знак "$"
Так вот что у нас получаеться: Я сейчас на елементарном скрипте тебе покажу как строить цепочки и разрешить допустим 80 и 8080 порты для клиентов и PPTP т.е. для двух сетевых интерфесов
и допустим для DMZ разрешим все порты))) Это типа для тебя Так просто чтоб ты понял
################## Все очень просто, не надо боятся в это м разобратся #############
Значит начнем
###################################################################
#!/bin/bash
#Зададим переменную IPT чтоб не писать постоянно iptables так проще
IPT="/sbin/iptables"
######## INTERFACES #########
DMZ_IFACE="eth0" #DMZ zone
CLIENT_IFACE="eth1" #Client interfaces Интерфейс к которому утебя подключена локалка
CLIENT="ppp+" #CLIENTS это у тебя клиенты PPTP. ppp+ означает что это все интерфейсы ppp0, ppp1, ppp2, ppp3.....
INET="eth2" ### ТУт у тебя допустим интернет
######## IP ADDRESS #########
DMZ_IP="192.168.0.99" ты ты можешь к примеру обозаначить себе еще и IP адресса если будешь их использовать, или можешь закоментировать
EXT_IP="$(/sbin/ifconfig eth2 | awk '/inet/ { print $2 } ' | sed -e s/addr://)" ##### 'эта строчка к примеру дает возможность считать твой внешний айпи если он белый но не статический, если тебе например нужно выкидывать какие-то порты в нвружу с серверов которые находятся в DMZ. Если статический, то можешь его просто написать...
CLIENT_IP="192.168.5.1"
############################################################################################
# Начало скрипта
start_fw()
{
# включаем пересылку пакетов
echo 1 > /proc/sys/net/ipv4/ip_forward
# стандартные действия Тут мы закрываем все лишнее
$IPT -P INPUT DROP
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD DROP
# удаляем все имеющиеся правила
$IPT -F
$IPT -F -t nat
$IPT -F -t mangle
$IPT -X
$IPT -X -t nat
$IPT -X -t mangle
######################################
# Enable broadcast echo Protection
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Disable Source Routed Packets
for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
echo 0 > $f
done
# Enable TCP SYN Cookie Protection
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Disable ICMP Redirect Acceptance
for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
echo 0 > $f
done
# Don't send Redirect Messages
for f in /proc/sys/net/ipv4/conf/*/send_redirects; do
echo 0 > $f
done
# Disable ICMP Redirect Acceptance
for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
echo 0 > $f
done
# Drop Spoofed Packets
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 1 > $f
done
##########################################################
# создаем свои цепочки
# отбрасываем tcp с неправильными флагами
$IPT -N bad_tcp_packets
# tcp, прошедшие основную проверку
$IPT -N allowed
# все пакеты соотв. протоколов
$IPT -N tcp_packets
$IPT -N udp_packets
$IPT -N icmp_packets
# безусловно разрешаем соединения по локальному интерфейсу (loopback, 127.0.0.1)
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
# сюда пойдут все tcp-пакеты, и будут отброшены имеющие статус NEW, но не имеющие флагов SYN,ACK
# предохраняет от определенных типов атак, подробности в приложении B4 к Iptables Tutorial
#-$IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j DROP
# принимаем все пакеты, относящиеся к уже установленным соединениям
$IPT -A allowed -p TCP --syn -j ACCEPT
$IPT -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
# а все остальные из этой цепочки сбрасываем
$IPT -A allowed -j DROP
#APACHE-HTTP тут мы дали 80 порт интерфесу CLIENT который у нас PPP+
$IPT -A tcp_packets -p TCP -i $CLIENT -s 0/0 --dport 80 -j allowed
$IPT -A tcp_packets -p TCP -i $CLIENT -s 0/0 --dport 80 -j ACCEPT
#APACHE-HTTP тут мы дали 80 порт интерфесу CLIENT_IFACE -eth1
$IPT -A tcp_packets -p TCP -i $CLIENT_IFACE -s 0/0 --dport 80 -j allowed
$IPT -A tcp_packets -p TCP -i $CLIENT_IFACE -s 0/0 --dport 80 -j ACCEPT
# тут мы дадим в разрешения для всех портов для DMZ
$IPT -A INPUT -p ALL -i $DMZ_IFACE -s 0/0 -j ACCEPT
DNS
$IPT -A tcp_packets -p TCP -i $INET -s 0/0 --dport 53 -j ACCEPT
$IPT -A udp_packets -p UDP -i $INET -s 0/0 --dport 53 -j ACCEPT
$IPT -A udp_packets -p UDP -i $DMZ_IFACE -s 0/0 --dport 53 -j ACCEPT
$IPT -A udp_packets -p UDP -i $CLIENT -s 0/0 --dport 53 -j ACCEPT
$IPT -A udp_packets -p UDP -i $CLIENT_IFACE -s 0/0 --dport 53 -j ACCEPT
# тут я еще добавлю чтоб ты понимал
# и принимаем входящие с 53-го udp (Domain Name Server)
$IPT -A udp_packets -p UDP -s 0/0 --sport 53 -j ACCEPT
# настал черед ICMP
# разрешаем необходимые типы
$IPT -A icmp_packets -p ICMP -i $DMZ_IFACE -s 0/0 --icmp-type 3 -j ACCEPT # Dest unreachable
$IPT -A icmp_packets -p ICMP -i $DMZ_IFACE -s 0/0 --icmp-type 11 -j ACCEPT # Time exceeded
$IPT -A icmp_packets -p ICMP -i $CLIENT -s 0/0 --icmp-type 3 -j ACCEPT # Dest unreachable
$IPT -A icmp_packets -p ICMP -i $CLIENT -s 0/0 --icmp-type 11 -j ACCEPT # Time exceeded
$IPT -A icmp_packets -p ICMP -i $INET -s 0/0 --icmp-type 3 -j ACCEPT # Dest unreachable
$IPT -A icmp_packets -p ICMP -i $INET -s 0/0 --icmp-type 11 -j ACCEPT # Time exceeded
$IPT -A icmp_packets -p ICMP -i $CLIENT_IFACE -s 0/0 --icmp-type 3 -j ACCEPT # Dest unreachable
$IPT -A icmp_packets -p ICMP -i $CLIENT_IFACE -s 0/0 --icmp-type 11 -j ACCEPT # Time exceeded
# и отбрасываем пинг (в принципе, он и так отбрасывается действием
# по умолчанию, но это правило для возможного редактирования)
$IPT -A icmp_packets -p ICMP -i $INET -s 0/0 --icmp-type 8 -j ACCEPT # Ping
$IPT -A icmp_packets -p ICMP -i $DMZ_IFACE -s 0/0 --icmp-type 8 -j ACCEPT # Ping
$IPT -A icmp_packets -p ICMP -i $CLIENT -s 0/0 --icmp-type 8 -j ACCEPT # Ping
$IPT -A icmp_packets -p ICMP -i $CLIENT_IFACE -s 0/0 --icmp-type 8 -j ACCEPT # Ping
# следующим правилом можно заменить предыдущее, тогда при пинговании
# нашей машины вместо сообщения о таймауте будет приходить сообщение
# Host unreachable
#$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j REJECT --reject-with icmp-host-unreachable
# разводим пакеты по соотв. цепочкам
# tcp уходит на доп. проверку
$IPT -A INPUT -p tcp -j bad_tcp_packets
# все пакеты, относящиеся к уже установленным соединениям (для tcp
# из-за отдельной цепочки пришлось это правило еще раз указать выше)
#Разрешаем форвардинг
$IPT -A FORWARD -i $DMZ_IFACE -o $INET -j ACCEPT
$IPT -A FORWARD -i $CLIENT -o $INET -j ACCEPT
$IPT -A INPUT -p ALL -i $DMZ_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p TCP -i $DMZ_IFACE -j tcp_packets
$IPT -A INPUT -p UDP -i $DMZ_IFACE -j udp_packets
$IPT -A INPUT -p ICMP -i $DMZ_IFACE -j icmp_packets
$IPT -A FORWARD -p ALL -i $INET -o $DMZ_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p ALL -i $CLIENT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p TCP -i $CLIENT -j tcp_packets
$IPT -A INPUT -p UDP -i $CLIENT -j udp_packets
$IPT -A INPUT -p ICMP -i $CLIENT -j icmp_packets
$IPT -A INPUT -p ALL -i $CLIENT_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p TCP -i $CLIENT_IFACE -j tcp_packets
$IPT -A INPUT -p UDP -i $CLIENT_IFACE -j udp_packets
$IPT -A INPUT -p ICMP -i $CLIENT_IFACE -j icmp_packets
$IPT -A FORWARD -p ALL -i $CLIENT_IFACE -o $CLIENT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p ALL -i $INET -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p TCP -i $INET -j tcp_packets
$IPT -A INPUT -p UDP -i $INET -j udp_packets
$IPT -A INPUT -p ICMP -i $INET -j icmp_packets
$IPT -A FORWARD -p ALL -i $INET -o $CLIENT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -p TCP -i $INET -o $CLIENT -j tcp_packets
$IPT -A FORWARD -p UDP -i $INET -o $CLIENT -j udp_packets
$IPT -A FORWARD -p TCP -i $INET -o $DMZ_IFACE -j tcp_packets
$IPT -A FORWARD -p UDP -i $INET -o $DMZ_IFACE -j udp_packets
# МАСКАРАДИНГ КЛИЕНТОВ
$IPT -t nat -A POSTROUTING -j MASQUERADE -s 192.168.160.0/24 -d 0.0.0.0/0 -o $INET # Подсеть клиентов на VPN
$IPT -t nat -A POSTROUTING -j MASQUERADE -s 192.168.0.110 -d 0.0.0.0/0 -o $INET #Мой комп
$IPT -t nat -A POSTROUTING -j MASQUERADE -s 192.168.0.150 -d 0.0.0.0/0 -o
}
#############################Скрипт################################
case "$1" in start) echo -n "ЗАПУСК: iptables"
start_fw
echo "."
;;
stop) echo -n "ОСТАНОВКА : iptables"
iptables -F
iptables -X
echo "."
;;
save) echo -n "Сохранение : iptables"
iptables-save > /etc/rules-save
echo "."
;;
restart) echo -n "рестарт : iptables"
iptables -F
iptables -X
start_fw
echo "."
;;
reload|force-reload) echo -n "перезагрузка конфигурации firewall: iptables"
echo "."
;;
*) echo "Usage: /etc/init.d/rc.iptables
start|stop|restart|reload|force-reload"
exit 1
;;
esac
exit 0
############################# это все один файл ########################
я думаю для начала этого будет достаточно, Еще я сталкивался по началу с большой проблемой как сделать так чтоб мой скрипт всегда запускался с системой и работал, и я мог его передергнуть ))))
Вот тебе пример как я это сделал, но учти есть куча методов как это сделать я пошел этим)))
1. для начала создать файл, он может называться как угодно Вам
2. к примеру назовем его rc.iptables
3. теперь создадим файл .mcedit /etc/init.d/rc.iptables
4. сделаем его исполняемым chmod +x /etc/init.d/rc.iptables
5. теперь нужно чтоб он загружался вместе с системой
update-rc.d rc.iptables start 40 S . stop 89 0 6 . (точки не забываем)
6.Теперь закинем наш скриптик который поможет нам управлять этим, это содержимое просто вставляем в /etc/init.d/rc.iptables