Помогите, пожалуйста, поднять брандмауэр!
Вчера на доставшемся мне в наследство шлюзе по моей небрежности безвременно почил скрипт, настраивающий правила ipchains для доступа в инет из локальной сетки :(( Поскольку Линухом начал заниматься по необходимости всего месяц назад, сами понимаете - ситуация аховая...Шлюз на RH Linux 7.2 Имеется локальная сеть 10.0.0.*/255.255.255.0 (eth1), внешний статический IP a.b.c.d (eth0) (подключение по выделенке). На шлюзе стоят SQUID в качестве http прокси на порту 3128, Delegated в качестве прокси для FTP, SMTP и POP3 на портах, соответственно, 8021, 8025 и 8110. Еще стоит Apache - исключительно для использования внутри локалки, на нем юзеры смотрят статистику сквида - кто сколько накачал и не пора ли остановиться.
Требуется закрыть доступ изнутри/снаружи ко всему, кроме вышеперечисленного.
Помогите пожалуйста, уважаемые знатоки Linux! Роюсь в доках, ничего не получается - либо все открыто, либо ни хрена не работает. Желателен готовый скрипт с комментариями, чтобы можно было разобраться.Вот что я наваял сам, читая различные маны, но это не работает (по этой же причини за настройки ftp и прочего пока не брался) :(
firewall.sh
ANY="0/0"
MY_ISP="my_internet_provaider_network"
EXTIP="my_ext_ip"
GATEIP="10.0.0.4"
LOCALNET="10.0.0.0/24"
DNS1="dns_server_1"
DNS2="dns_server_2"
#
echo 1 > /proc/sys/net/ipv4/ip_forward
ipchains -F
ipchains -P input DENY
ipchains -P output DENY
ipchains -P forward DENY
# Enable all loopback traffic
ipchains -A input -i lo -j ACCEPT
ipchains -A forward -i lo -j ACCEPT
ipchains -A output -i lo -j ACCEPT
# ICMP
ipchains -A input -i eth0 -p icmp -s $ANY 0 -d $EXTIP -j ACCEPT
ipchains -A input -i eth0 -p icmp -s $ANY 3 -d $EXTIP -j ACCEPT
ipchains -A input -i eth0 -p icmp -s $ANY 4 -d $EXTIP -j ACCEPT
ipchains -A input -i eth0 -p icmp -s $ANY 11 -d $EXTIP -j ACCEPT
ipchains -A input -i eth0 -p icmp -s $ANY 12 -d $EXTIP -j ACCEPT
ipchains -A input -i eth0 -p icmp -s $MY_ISP 8 -d $EXTIP -j ACCEPT
ipchains -A output -i eth0 -p icmp -s $EXTIP 0 -d $MY_ISP -j ACCEPT
ipchains -A output -i eth0 -p icmp -s $EXTIP 3 -d $MY_ISP -j ACCEPT
ipchains -A output -i eth0 -p icmp -s $EXTIP 4 -d $ANY -j ACCEPT
ipchains -A output -i eth0 -p icmp -s $EXTIP 8 -d $ANY -j ACCEPT
ipchains -A output -i eth0 -p icmp -s $EXTIP 12 -d $ANY -j ACCEPT
ipchains -A output -i eth0 -p icmp -s $EXTIP 11 -d $MY_ISP -j ACCEPT
# DNS
# 1. DNS Full Server
ipchains -A input -s $ANY -d $EXTIP 53 -p udp -i eth0 -j ACCEPT
ipchains -A output -s $EXTIP 53 -d $ANY -p udp -i eth0 -j ACCEPT
# 2. DNS Client
ipchains -A input -s $DNS1 53 -d $EXTIP -p udp -i eth0 -j ACCEPT
ipchains -A input -s $DNS2 53 -d $EXTIP -p udp -i eth0 -j ACCEPT
ipchains -A output -s $EXTIP -d $DNS1 53 -p udp -i eth0 -j ACCEPT
ipchains -A output -s $EXTIP -d $DNS2 53 -p udp -i eth0 -j ACCEPT
# 3. DNS by TCP
ipchains -A input -s $DNS1 53 -d $EXTIP -p tcp ! -y -i eth0 -j ACCEPT
ipchains -A input -s $DNS2 53 -d $EXTIP -p tcp ! -y -i eth0 -j ACCEPT
ipchains -A output -s $EXTIP -d $DNS1 53 -p tcp -i eth0 -j ACCEPT
ipchains -A output -s $EXTIP -d $DNS2 53 -p tcp -i eth0 -j ACCEPT
# SQUID
# Request from localnet to web
ipchains -A input -s $LOCALNET -d $GATEIP 3128 -p tcp -i eth1 -j ACCEPT -l
# Output request to internet
ipchains -A output -s $EXTIP -d $ANY 80 -p tcp -i eth0 -j ACCEPT -l
# Reply from web
ipchains -A input -s $ANY 80 -d $EXTIP -p tcp -i eth0 -j ACCEPT -l
# Return web reply to localnet
ipchains -A output -s $GATEIP 3128 -d $LOCALNET -p tcp -i eth1 -j ACCEPT -l
<----------------------------------------------------------------------------------
any = "0/0"
eth_i = "eth0"
eth_l = "eth1"
ip_i = "a.b.c.d"
ip_l = "10.0.0.4"
ip_l_mask ="24"
p_apache = "80"
p_squid = "3128"
p_ftp = "8021
p_pop = "8110"
p_smtp = "8025"
p_dns = "53"
p_big = "1025:65535"
dns1 = "dns1"
dns2 = "dns2"
echo 1 > /proc/sys/net/ipv4/ip_forward
sbin/ipchains -F
sbin/ipchains -P input DENY
sbin/ipchains -P output DENY
sbin/ipchains -P forward DENY
#############################################
# Input
#############################################
sbin/ipchains -A input -p UDP -i $eth_i -s $dns1 53 -d $any $p_big -j ACCEPT # Ну это К ДНС. Она будет отвечать с 53 порта на хр@н знает какой
sbin/ipchains -A input -p UDP -i $eth_i -s $dns2 53 -d $any $p_big -j ACCEPT # с 1024 и выше
ipchains -A input -p icmp -j icmp-acc # Это дополнительная цепочка для пингов, Админы разрешают : ping, tracert(traceroute)
sbin/ipchains -A input -i lo ACCEPT #Думаю и ежу понятно :-)
sbin/ipchains -A input -i $eth_l -s $ip_l/$ip_l_mask -d $ip_l $p_apache -j ACCEPT
sbin/ipchains -A input -i $eth_l -s $ip_l/$ip_l_mask -d $ip_l $p_squid -j ACCEPT
sbin/ipchains -A input -i $eth_l -s $ip_l/$ip_l_mask -d $ip_l $p_ftp -j ACCEPT
sbin/ipchains -A input -i $eth_l -s $ip_l/$ip_l_mask -d $ip_l $p_smtp -j ACCEPT
sbin/ipchains -A input -i $eth_l -s $ip_l/$ip_l_mask -d $ip_l $p_pop -j ACCEPT # Ну это типа твои Порты для открывания, здеся моно добавлять или удалять!
sbin/ipchains -A input -i $eth_l -s $ip_l/$ip_l_mask -d $ip_l 22 -j ACCEPT # Это типа для SSH, поставь 23 для телнета :-) но SSH лучше! рано или поздно тебе надоест сидеть в консоли!
#для инета
sbin/ipchains -A input -p TCP -i $eth_i -s $any -d $ip_i -y -j REJECT -l # [l] это параметр для логирования отброшеного пакета, а вдруг ломают а я и не узнаю!
sbin/ipchains -A input -p UDP -i $eth_i -s $any -d $ip_i -j REJECT -l # Вместо REJECT можно поставить DENY тогда удаленный хост просто подумает что его посылают на ...
sbin/ipchains -A input -p UDP -i $eth_i -s $any -d $ip_i -j ACCEPT # Теперь про все 3 строки Первая запрещает на машину ПО протоколу ТСП запросы на соединение
# вторая отбрасывает протокол UDP
# А третья разрешает открытые нами соединение!!!!!!! без этой строки пакеты по ТСП ходить не будут с нас на инет.
# Для локалки
sbin/ipchains -A input -p TCP -i $eth_l -s $any -d $ip_l -y -j REJECT # смотри выше!
sbin/ipchains -A input -p UDP -i $eth_l -s $any -d $ip_l -j REJECT
sbin/ipchains -A input -p UDP -i $eth_l -s $any -d $ip_l -j ACCEPT##########################################
# Forward
##########################################
sbin/ipchains -A forward -i $eth_i -p icmp -s $ip_l/$ip_l_mask -d ! $ip_l/$ip_l_mask -j MASQ #Если не хош чтобы юзеры пинговали инет то убери эту строку
##########################################
# Output
##########################################
##########################################
# icmp_acc
##########################################
## Это посмотри в документации, я оттудова это скатал и пока не глючило :-)
sbin/ipchains -A icmp-acc -p icmp --icmp-type destination-unreachable -j ACCEPT
sbin/ipchains -A icmp-acc -p icmp --icmp-type source-quench -j ACCEPT
sbin/ipchains -A icmp-acc -p icmp --icmp-type time-exceeded -j ACCEPT
sbin/ipchains -A icmp-acc -p icmp --icmp-type parameter-problem -j ACCEPT
sbin/ipchains -A icmp-acc -p icmp -j DENY #Пусть дальше по цепочкам не путешевствует :-)
-------------------------------------------------------------------------------------------------------->
Если че пиши на асю! только представся 173905789
>sbin/ipchains -A input -p TCP -i $eth_i -s $any -d $ip_i -y -j REJECT -l # [l] это параметр для логирования отброшеного пакета, а вдруг ломают а я не узнаю!
>sbin/ipchains -A input -p UDP -i $eth_i -s $any -d $ip_i -j REJECT -l # Вместо REJECT можно поставить DENY тогда удаленный хост просто подумает что его посылают на ..
>sbin/ipchains -A input -p UDP -i $eth_i -s $any -d $ip_i -j ACCEPT
># Теперь про все 3 строки Первая запрещает на машину ПО протоколу ТСП
>запросы на соединение вторая отбрасывает протокол UDP А третья разрешает >открытые нами соединение!!!!!!! без этой строки пакеты
>по ТСП ходить не будут с нас на инет.А разве в этом случае в третьей строке не должен указываться протокол tcp?
>-j MASQ #Если не хош чтобы юзеры пинговали инет то убери
>эту строкуТак или иначе, но сетка у нас без маскарадинга работает.
>##########################################
># Output
>##########################################
Вот тут опять стоп - разве при таких настройках эта цепочка ДОЛЖНА быть пустой? А как тогда быть с возвратом наших пакетов? Скажем, юзер из IE запрашивает у сквида страничку, тот отфутболивает запрос в инет - а обратно как?К сожалению, приведенный тобой скрипт НЕ работает, причем после загрузки этих правил шлюз вообще перестает пинговаться из локалки :( Смотрел логи кернела - там почти полная тишина, только появляются такие вот строчки:
Oct 10 08:58:53 proxyuit kernel: Packet log: input REJECT eth0 PROTO=6 69.132.82.161:4665 195.239.235.78:135 L=48 S=0x60 I=10691 F=0x4000 T=103 SYN (#10)
Oct 10 09:02:49 proxyuit kernel: Packet log: input REJECT eth0 PROTO=17 200.203.120.200:1649 195.239.235.78:1434 L=404 S=0x60 I=33496 F=0x0000 T=104 (#11)
Oct 10 09:23:01 proxyuit kernel: Packet log: icmp-acc DENY eth1 PROTO=1 10.0.0.70:8 10.0.0.16:0 L=60 S=0x00 I=947 F=0x0000 T=128 (#5)
Oct 10 09:23:06 proxyuit kernel: Packet log: icmp-acc DENY eth0 PROTO=1 10.0.0.70:8 10.0.0.16:0 L=60 S=0x00 I=948 F=0x0000 T=128 (#5)
Oct 10 09:23:14 proxyuit kernel: Packet log: icmp-acc DENY eth0 PROTO=1 195.241.31.22:8 195.239.235.78:0 L=92 S=0x60 I=34487 F=0x0000 T=111 (#5)
Oct 10 09:29:12 proxyuit kernel: Packet log: input REJECT eth0 PROTO=6 195.239.218.129:4793 195.239.235.78:135 L=48 S=0x00 I=9415 F=0x0000 T=117 SYN (#11)
Oct 10 09:34:19 proxyuit kernel: Packet log: icmp-acc DENY eth1 PROTO=1 195.241.46.153:8 195.239.235.78:0 L=92 S=0x60 I=7689 F=0x0000 T=112 (#5)
Oct 10 09:35:56 proxyuit kernel: Packet log: icmp-acc DENY eth1 PROTO=1 10.0.0.70:8 10.0.0.16:0 L=60 S=0x00 I=978 F=0x0000 T=128 (#5)
Oct 10 09:36:01 proxyuit kernel: Packet log: icmp-acc DENY eth0 PROTO=1 10.0.0.70:8 10.0.0.16:0 L=60 S=0x00 I=979 F=0x0000 T=128 (#5)
Oct 10 09:38:14 proxyuit kernel: Packet log: icmp-acc DENY eth0 PROTO=1 195.237.18.122:8 195.239.235.78:0 L=92 S=0x60 I=28602 F=0x0000 T=113 (#5)
Oct 10 09:38:41 proxyuit kernel: Packet log: icmp-acc DENY eth0 PROTO=1 195.239.40.98:8 195.239.235.78:0 L=92 S=0x00 I=27956 F=0x0000 T=120 (#5)
any = "0/0"
eth_i = "eth0"
eth_l = "eth1"
ip_i = "a.b.c.d"
ip_l = "10.0.0.4"
ip_l_mask ="24"
p_apache = "80"
p_squid = "3128"
p_ftp = "8021
p_pop = "8110"
p_smtp = "8025"
p_dns = "53"
p_big = "1025:65535"
dns1 = "dns1"
dns2 = "dns2"echo 1 > /proc/sys/net/ipv4/ip_forward
sbin/ipchains -F
sbin/ipchains -N icmp-acc
sbin/ipchains -P input DENY
sbin/ipchains -P output DENY
sbin/ipchains -P forward ACCEPT
#############################################
# Input
#############################################
sbin/ipchains -A input -p UDP -i $eth_i -s $dns1 53 -d $any $p_big -j ACCEPT # Ну это К ДНС. Она будет отвечать с 53 порта на хр@н знает какой
sbin/ipchains -A input -p UDP -i $eth_i -s $dns2 53 -d $any $p_big -j ACCEPT # с 1024 и выше
ipchains -A input -p icmp -j icmp-acc # Это дополнительная цепочка для пингов, Админы разрешают : ping, tracert(traceroute)
sbin/ipchains -A input -i lo ACCEPT #Думаю и ежу понятно :-)
sbin/ipchains -A input -i $eth_l -s $ip_l/$ip_l_mask -d $ip_l $p_apache -j ACCEPT
sbin/ipchains -A input -i $eth_l -s $ip_l/$ip_l_mask -d $ip_l $p_squid -j ACCEPT
sbin/ipchains -A input -i $eth_l -s $ip_l/$ip_l_mask -d $ip_l $p_ftp -j ACCEPT
sbin/ipchains -A input -i $eth_l -s $ip_l/$ip_l_mask -d $ip_l $p_smtp -j ACCEPT
sbin/ipchains -A input -i $eth_l -s $ip_l/$ip_l_mask -d $ip_l $p_pop -j ACCEPT # Ну это типа твои Порты для открывания, здеся моно добавлять или удалять!
sbin/ipchains -A input -i $eth_l -s $ip_l/$ip_l_mask -d $ip_l 22 -j ACCEPT # Это типа для SSH, поставь 23 для телнета :-) но SSH лучше! рано или поздно тебе надоест сидеть в консоли!
#для инета
sbin/ipchains -A input -p TCP -i $eth_i -s $any -d $ip_i -y -j REJECT -l # [l] это параметр для логирования отброшеного пакета, а вдруг ломают а я и не узнаю!
sbin/ipchains -A input -p UDP -i $eth_i -s $any -d $ip_i -j REJECT -l # Вместо REJECT можно поставить DENY тогда удаленный хост просто подумает что его посылают на ...
sbin/ipchains -A input -p TCP -i $eth_i -s $any -d $ip_i -j ACCEPT # Теперь про все 3 строки Первая запрещает на машину ПО протоколу ТСП запросы на соединение
# вторая отбрасывает протокол UDP
# А третья разрешает открытые нами соединение!!!!!!! без этой строки пакеты по ТСП ходить не будут с нас на инет.
# Для локалки
sbin/ipchains -A input -p TCP -i $eth_l -s $any -d $ip_l -y -j REJECT # смотри выше!
sbin/ipchains -A input -p UDP -i $eth_l -s $any -d $ip_l -j REJECT
sbin/ipchains -A input -p TCP -i $eth_l -s $any -d $ip_l -j ACCEPT##########################################
# Forward
##########################################
sbin/ipchains -A forward -i $eth_i -p icmp -s $ip_l/$ip_l_mask -d ! $ip_l/$ip_l_mask -j MASQ #Если не хош чтобы юзеры пинговали инет то убери эту строку
##########################################
# Output
##########################################
##########################################
# icmp_acc
##########################################
## Это посмотри в документации, я оттудова это скатал и пока не глючило :-)
sbin/ipchains -A icmp-acc -p icmp --icmp-type destination-unreachable -j ACCEPT
sbin/ipchains -A icmp-acc -p icmp --icmp-type source-quench -j ACCEPT
sbin/ipchains -A icmp-acc -p icmp --icmp-type time-exceeded -j ACCEPT
sbin/ipchains -A icmp-acc -p icmp --icmp-type parameter-problem -j ACCEPT
sbin/ipchains -A icmp-acc -p icmp -j DENY #Пусть дальше по цепочкам не путешевствует :-)
-------------------------------------------------------------------------------------------------------->
А что изменить, если кроме squid`а больше нет прокси, т.е. надо чтобы у пользователей работал SMTP и POP протоколы?