Настройка шлюза и firewall на ubuntu/debian из командной строки

Linux > Настройка шлюза и firewall на ubuntu/debian из командной строки
22.12.2014 13:03:32



Статья:

 Настройка шлюза и firewall на ubuntu/debian из командной  строки , настройку DNS/DHCP в данной  статье не расматриваем

Пусть у нас 2  интерфейса

eth0 - INTERNET

eth1 -LOCAL NET

Правим

/etc/network/interfaces

# The loopback network interface
auto lo
iface lo inet loopback

# Моя проводная сеть.
auto eth1 
iface eth1 inet static 
address 192.168.1.1 
netmask 255.255.255.0 
broadcast 192.168.1.255
dns-nameservers 77.88.8.88
dns-search local
iface eth0 inet dhcp 
auto eth0 
Примечание - если надо сменить мак адрес пропишем так
iface eth0 inet dhcp
  hwaddress ether 08:00:00:00:00:01

Разрешите направление пакетов. Чтобы сделать это, отредактируйте /etc/sysctl.conf. Откройте сам файл командой:

sudo gedit /etc/sysctl.conf

А затем вставьте следующую строчку:

net.ipv4.ip_forward=1

Затем добавляем правило для NAT:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Чтобы NAT работал после перезагрузки сохраняем настройки iptables в файл:

iptables-save > /etc/iptables.up.rules

И добавляем в конец файла:

sudo gedit /etc/network/interfaces

Эту строчку, для автоматической подгрузки правил:

pre-up iptables-restore < /etc/iptables.up.rules

Также в этот файл при необходимости добавляем правила роутинга Типа так(не всегда надо):

up route add -net 192.168.1.0 netmask 255.255.255.0 dev eth1
up route add -net 0.0.0.0 netmask 255.255.255.255 dev eth0

Проброс порта:

 # iptables -t nat -A PREROUTING -p tcp -d ВНЕШНИЙ IP --dport 80 -j
DNAT --to-destination 192.168.1.2:80

 # iptables -t nat -A PREROUTING -p tcp -d ВНЕШНИЙ IP --dport 443 -j
DNAT --to-destination 192.168.1.2:443

 

По простому  настроим firewall

IPTABLES -P OUTPUT ACCEPT

IPTABLES -P FORWARD ACCEPT

sudo iptables -P INPUT ACCEPT

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

sudo iptables -I INPUT 1 -i lo -j ACCEPT

 sudo iptables -A INPUT -i eth0 -j DROP

Перед правилом сброса можно вставить ещё  инструкции

sudo iptables -I INPUT 4 новое_правило

sudo iptables -I INPUT 3 -i eth0 -p tcp --dport 22 -j ACCEPT        ssh Доступ открыть

Просомтр правил  iptables -L -n -v --line-numbers

Сохраним наши правила iptables-save > /etc/iptables.up.rules

Для блокировки по спискам удобна IPSET  - apt-get install ipset см IPSET (Типа iptables -v -I INPUT -m set --match-set blacklist_mai src -j DROP)

********************************************

Как удалить iptables правило по номеру
iptables -L INPUT --line-numbers
iptables -D INPUT номер

iptables -t nat -L POSTROUTING --line-numbers
iptables -t nat -D POSTROUTING номер

Подробнее про firewall -примеры

В IPTABLES используется три вида таблиц:

  1. Mangle — обычно эта цепочка используется для внесения изменений в заголовок пакета, например для изменения битов TOS и пр.
  2. Nat — эта цепочка используется для трансляции сетевых адресов (Destination Network Address Translation). Source Network Address Translation выполняется позднее, в другой цепочке. Любого рода фильтрация в этой цепочке может производиться только в исключительных случаях.
  3. Filter — здесь производится фильтрация трафика. Помните, что все входящие пакеты, адресованные нам, проходят через эту цепочку, независимо от того с какого интерфейса они поступили.

Соответственно, нас интересует третья таблица Filter. В этой таблицы имеются три встроенные цепочки:

  1. INPUT — для входящих пакетов.
  2. FORWARD — для проходящих через данную машину к другой.
  3. OUTPUT — для исходящих.

Пакет, проходящий через эти цепочки, исходя из правила может быть пропущен (ACCEPT) или отброшен (DROP):

  • ACCEPT — пропустить пакет; просмотр таблицы завершается
  • DROP — выбросить молча; просмотр завершается не только для текущей цепочки, но и для других таблиц
  • REJECT — выбросить, известив отправителя (—reject-with тип-извещения)

Первое созданное нами правило для цепочки INPUT задаёт поведение по-умолчанию для пакетов, проходящих через этот фильтр. В случае, если ни одно из правил, заданных ниже не будет применено к пакету — он будет отброшен (DROP) без уведомления отправителя:

$IPTABLES  -P INPUT DROP

Пакеты, проходящие фильтр OUTPUT соответственно будут пропущены:

То же самое касается «транзитных» пакетов:

$IPTABLES  -P OUTPUT ACCEPT

Следующее правило:

$IPTABLES  -A INPUT -i lo -j ACCEPT

Задаёт пользовательское правило (-A) в фильтр INPUT для пакетов, проходящих через интерфейс (-i) loopback (lo) и выполняет цель (-j) «принять» (ACCEPT).

В следующем правиле используется модуль (-m) state, который проверяет состояние устанавливаемого соединения — RELATED или ESTABLISHED и если соединение подходит под это правило — разрешает его:

$IPTABLES -A INPUT -m state —state RELATED,ESTABLISHED -j ACCEPT

Возможные состояния: INVALID — пакет не связан с каким-либо известным соединением, ESTABLISHED— пакет связан с соединением, по которому уже проходили пакеты в обоих направлениях, NEW — пакет инициирует новое соединение, либо связан с соединением, по которому ещё не проходили пакеты в обоих направлениях , RELATED — пакет инициирует новое соединение, но также связан с уже существующим соединением, например при передаче данных по FTP или сообщении об ошибке ICMP, SNAT — виртуальное состояние, положительный результат выдаётся если исходный адрес источника отличен от адреса, который должен получить ответ, DNAT — виртуальное состояние, положительный результат выдаётся если исходный адрес получателя отличен от адреса отправителя ответа.

В следующем правиле для фильтра входящих соединений INPUT мы указываем:

$IPTABLES -A INPUT -p tcp -i eth0 —dport 22 -j ACCEPT

Протокол (-p) TCP, интерфейс (-i) eth0, и порт назначения, т.е. порт на нашем сервере, к которому устанавливается соединение (—dport) 22.

Добавим ещё несколько правил:

#Делаем защиту от DOS атак:
$IPTABLES -A INPUT -p tcp -m tcp —tcp-flags SYN,ACK,FIN,RST RST -m limit —limit 1/s -j ACCEPT

# Разрешаем FTP
$IPTABLES -A INPUT -i eth0 -p tcp —dport 21 -j ACCEPT

# Разрешаем HTTP
$IPTABLES -A INPUT -i eth0 -p tcp —dport 80 -j ACCEPT

# Разрешаем HTTPS
$IPTABLES -A INPUT -i eth0 -p tcp —dport 443 -j ACCEPT

# Разрешаем SMTP только из сети 77.120.***.1/24
$IPTABLES -A INPUT -s 77.120.***.1/24 -i eth0 -p tcp —dport 25 -j ACCEPT

# Разрешаем SMTP всем, но запрещаем отправку для адреса 77.120.***.46
$IPTABLES -A INPUT -s ! 77.120.***.46 -i eth0 -p tcp —dport 25 -j ACCEPT

# РазрешаемPOP3 только с IP 77.120.***.46
$IPTABLES -A INPUT -s 77.120.***.46 -i eth0 -p tcp —dport 110 -j ACCEPT

# Разрешаем DNS
$IPTABLES -A INPUT -i eth0 -p udp —sport 53 -j ACCEPT

# Доступ к портам 8081 и 8082 разрешаем только из сетей 91.***.**.0/24, 195.***.***.0/23 и IP 37.***.**.174
for net in 91.***.**.0/24 195.***.***.0/23 37.***.**.174; do
$IPTABLES -A INPUT -p tcp -m tcp -s $net -m multiport —dports 8081,8082 -j ACCEPT
done
$IPTABLES -A INPUT -p tcp -m tcp -m multiport —dports 8081,8082 -j DROP

# Разрешаем ping
$IPTABLES -A INPUT -p icmp -j ACCEPT