В прошлой статье я рассказал о том, что такое файрволл iptables и привёл пример файрволла для простейшей конфигурации, когда компьютер подключен к Интернету через DSL-модем, настроенный, как мост. Усложним задачу.
Имеем десктоп с Ubuntu и двумя сетевыми картами eth0 и eth1. Бортовая карта eth0 c адресом 192.168. 1.2 постоянно подключена к DSL-модему, настроенному, как маршрутизатор, имеющий шлюз-адрес 192.168. 1.1. PCI-карта eth1 c адресом 192.168. 2.2 время от времени подключается кроссоверным кабелем к розетке RJ45 нетбука с Windows-XP и с адресом 192.168. 2.1 для обмена файлами. Разумееется, адреса могут быть и другими. Интернет не раздаётся. С помощью сетевого менеджера (штатного или другого, например, рекомендую wicd) десктоп можно программно подключать либо к модему, либо к нетбуку. Предполагается, что десктоп имеет настроенный пакет samba, обеспечивающую взаимный доступ к «расшаренным» ресурсам. Так сделано, чтобы не переключать кабель и не разбивать разъёмы RJ45 на материнской плате и модеме, да и поберечь встроенную карту. Требуется настроить файрволл iptables. Привожу скрипт простой настройки.
#!/bin/bash
# путь к файлу запуска iptables.
IPT="/sbin/iptables"
start_fw()
{
# Сбросить правила и удалить цепочки.
$IPT -F
$IPT -X
# Политики по умолчанию.
$IPT -P INPUT DROP
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT
# Новые пользовательские цепочки:
$IPT -N ENEMY
$IPT -N BOGUS
$IPT -N ALLOW
$IPT -N GOOD_IN
$IPT -N GOOD_OUT
$IPT -N CONNECT
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A INPUT -j GOOD_IN
$IPT -A INPUT -j CONNECT
$IPT -A INPUT -j ENEMY
$IPT -A INPUT -j BOGUS
$IPT -A INPUT -j ALLOW
$IPT -A GOOD_IN -i eth0 -d 192.168.1.2/32 -j RETURN # адрес приёмника м.б. 192.168.1.2
$IPT -A GOOD_IN -i eth1 -d 192.168.2.2/32 -j RETURN # адрес приёмника м.б. 192.168.2.2
$IPT -A GOOD_IN -j DROP
$IPT -A CONNECT -i eth0 -s 192.168.1.1/32 -m state --state NEW -j ACCEPT # или модем может подключаться
$IPT -A CONNECT -i eth1 -s 192.168.2.1/32 -m state --state NEW -j ACCEPT # или комп может подключаться
$IPT -A CONNECT -j RETURN
$IPT -A ENEMY -s 0.0.0.0/32 -j DROP # запретить адрес по умолчанию
$IPT -A ENEMY -s 224.0.0.0/8 -j DROP # запретить мультикаст
$IPT -A ENEMY -s 255.255.255.255/32 -j DROP # запретить бродкаст
# (сюда можно вставить адреса плохих парней)
$IPT -A ENEMY -j RETURN
$IPT -A BOGUS -m state --state INVALID -j DROP
$IPT -A BOGUS -f -m limit --limit 10/min -j DROP # запретить фрагменты
$IPT -A BOGUS -p tcp -m tcp ! --syn -m state --state NEW -j DROP # устранить SYN-наводнение
$IPT -A BOGUS -j RETURN
$IPT -A ALLOW -p icmp -m limit --limit 10/sec -j ACCEPT
$IPT -A ALLOW -m state --state RELATED,ESTABLISHED -j ACCEPT
# (сюда можно вставить номера портов, к которым разрешается обращаться извне)
$IPT -A ALLOW -j RETURN
$IPT -A OUTPUT -o lo -j ACCEPT
$IPT -A OUTPUT -j GOOD_OUT
$IPT -A OUTPUT -m state --state INVALID -j DROP
$IPT -A OUTPUT -d 0.0.0.0/32 -j DROP # запретить адрес по умолчанию
$IPT -A OUTPUT -d 224.0.0.0/8 -j DROP # запретить мультикастинг
$IPT -A OUTPUT -d 255.255.255.255/32 -j DROP # запретить бродкаст
# запросить IP:
$IPT -A OUTPUT -d 192.168.1.1/32 -p tcp -m tcp --dport 53 -j ACCEPT
$IPT -A OUTPUT -d 192.168.1.1/32 -p udp -m udp --dport 53 -j ACCEPT
$IPT -A GOOD_OUT -o eth0 -s 192.168.1.2/32 -j RETURN
$IPT -A GOOD_OUT -o eth1 -s 192.168.2.2/32 -j RETURN
$IPT -A GOOD_OUT -j DROP
}
case "$1" in
start) echo -n "Start firewall: iptables "
start_fw
echo "."
;;
stop) echo -n "Stop firewall: iptables "
iptables -F
iptables -X
echo "."
;;
save) echo -n "Save firewall: iptables "
iptables-save > /etc/rules-save
echo "."
;;
restart) echo -n "Restart firewall: iptables "
iptables -F
iptables -X
cat /etc/rules-save | iptables-restore
echo "."
;;
reload|force-reload) echo -n "Reload firewall: iptables "
echo "."
;;
*) echo "Usage: /etc/init.d/rc.firewall start|stop|restart|reload|force-reload "
exit 1
;;
esac
exit 0
С этим скриптом надо поступить точно так же, как и с предыдущим. Обратите внимание, как пользовательские цепочки GOOD_IN, CONNECT и GOOD_OUT позволяют реализовать мультипроверку адресов источников и приёмников. Обратите также внимание, что в отличие от предыдущего файрволла, в этом файрволле нельзя обойтись без цепочки OUTPUT, так как именно в ней десктоп запрашивает из модема IP-адреса веб-ресурсов. Правила для DHCP отсутствуют, так как процедуру получения динамического адреса взял на себя модем, настроенный, как маршрутизатор.
Кстати, ADSL-модемы минского ОАО «Промсвязь» настраиваются так же, как и модемы ZTE 831, но в настройках модема рекомендую разрешить DHCP и вписать в модем адреса конкретных серверов DNS (не обязательно белорусских).
Горячие темы