###### tags: `Attack` # **IPtables** **Linux** ![](https://i.imgur.com/W6wEYEV.png) Настраиваем инфраструктуру согласно рисунка выше, создаем на Linux-машинах Vlan'ы, интернет, добавляем Linux-файерволл. 1. Настраиваем сабинтерфейсы на Linux-FW (ens4) >nano /etc/network/interfaces ![](https://i.imgur.com/P5xxFKb.png) > service networking restart #перезапускаем сеть 2. Настраиваем switch *conf t int e0/0 sw m tr en dot1q sw m tr sw a vl 10* > interface Ethernet0/0 > switchport trunk encapsulation dot1q > switchport mode trunk > > interface Ethernet0/1 > switchport access vlan 10 > > interface Ethernet0/2 > switchport access vlan 20 > switchport mode access > > interface Ethernet0/3 > switchport access vlan 30 > switchport mode access На Linux-FW: >nano /etc/sysctl.conf ![](https://i.imgur.com/POJ2LOI.png) Расскоментируем эту строчку чтобы Linux-FW работал в режиме роутера. >sysctl -p #применяем >nano /etc/hostname >nano /etc/hosts # переименуем машины iptables: > **input/output** трафик относится только к интерфейсу, если трафик идет дальше интерфейса - **Forward** - правило, касаемое перенаправляемого трафика > **PREROUTING** - перед тем как перенаправить трафик > **POSTROUTING** - после того как перенаправить трафик > **NAT**- подмена/замена адреса > **MANGLE**- меняем значение TTL, свойства трафика > **MASQUARADE**-подмена адреса > **-m state**- отслеживаем соединение по первому пакету > **ESTABLISHED**- если пропустили первый пакет > **INVALID**-если первый пакет не пропустили, будут идти пакеты со следующим статусом > **RELATED**-когда используется несколько портов ``` -A - добавить правило в цепочку; -С - проверить все правила; -D - удалить правило; -I - вставить правило с нужным номером; -L - вывести все правила в текущей цепочке; -S - вывести все правила; -F - очистить все правила; -N - создать цепочку; -X - удалить цепочку; -P - установить действие по умолчанию ``` -p - указать протокол, один из tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh; -s - указать ip адрес устройства-отправителя пакета; -d - указать ip адрес получателя; -i - входной сетевой интерфейс; -o - исходящий сетевой интерфейс; -j - выбрать действие, если правило подошло. ![](https://i.imgur.com/NMlH0Sd.png) ***iptables -t таблица действие цепочка дополнительные параметры*** iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE - подменяем адрес, делаем на Linux-FW `Linux-Ext - Kali` **Приоритет правил iptables - сначала то, что сверху** >ip route add 192.168.10.0/24 via 192.168.4.166 #прописываем статический ip на Linux-Ext Linux-Ext: Задачи: 1) Запретить трафик во внутрь периметра. Но из периметра трафик должен выходить. INPUT ens3 DROP FORWARD ens3 --> ens4 > **iptables -A INPUT -i ens3 -j DROP** # входящий трафик интерфейса ens3 блокируется > **iptables -A FORWARD -i ens3 -j DROP** # весь перенаправляемый трафик > интерфейса ens3 блокируется > **iptables -L -nv** - показывает цепочку правил > **iptables -I INPUT 1 -i ens3 -m state --state ESTABLISHED,RELATED -j ACCEPT** - разрешить обратные уже установленые соединения интерфейса ens3 а также вставить это правило 1-й строчкой цепочки INPUT > **iptables -I FORWARD 1 -i ens3 -m state --state ESTABLISHED,RELATED -j ACCEPT** - разрешить обратные уже установленые соединения интерфейса ens3 а также вставить это правило 1-й строчкой цепочки FORWARD > **iptables -D INPUT 3** - удалить правило №3 по списку из цепочки INPUT > **iptables -I INPUT 2 -i ens3 -p tcp --dport 22 -j ACCEPT** - добавляем второе по счету правило, разрешающее подключаться по ssh (22 порт tcp). ![](https://i.imgur.com/B8w2JNE.png) ***Чтобы правила сохранялись после перезагрузки роутера Linux-FW:*** > apt update > apt install iptables-persistent > service netfilter-persistent save # сохраняем правила через netfilter-persistent > /etc/iptables/rules.v4 - путь по которому лежат правила ipv4 2) Проброс портов: ens3:2222 - - --- > linux3:22 ens3:2223 - - --- > linux4:22 ens3:2224 - - --- > linux5:22 > iptables -A FORWARD -i ens3 -o ens4.30 -p tcp --syn --dport 22 -m conntrack --ctstate NEW -j ACCEPT Действие ACCEPT означает, что мы разрешаем это соединение. Но это правило разрешает только первый пакет, а нам нужно пропускать любой следующий трафик в обоих направлениях для порта 22, поэтому добавим правила для ESTABLISHED и RELEATED: > iptables -I FORWARD 3 -i ens4.30 -o ens3 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT - этим правилом мы добавили в цепочку FORWARD на 3-е место разрешение прохода любого следующего трафика от источника сабинтерфейса ens4.30 до интерфейса ens3 > iptables -I FORWARD 3 -i ens3 -o ens4.30 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT - в обратную сторону > iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 2224 -j DNAT --to-destination 192.168.30.1:22 - С помощью этого правила мы перенаправляем все пакеты, пришедшие на порт 2224, к 192.168.30.1 на порт 22: > iptables -t nat -A POSTROUTING -o ens4.30 -p tcp --dport 22 -d 192.168.30.1 -j SNAT --to-source 192.168.30.254 - это правило отправляет обратно на шлюз 192.168.30.254 все пакеты, которые пришли на 192.168.30.1 порт 22 чтобы они дошли до источника. Пакет будет иметь исходный адрес клиента, а значит будет пытаться отправить ответ ему. Так как клиент ожидает получить ответ от маршрутизатора, то нормального TCP соединения не получиться. Чтобы решить эту проблему нужно модифицировать адрес источника и заменить его на адрес маршрутизатора. Тогда ответ придет маршрутизатору, а тот уже от своего имени передаст его в сеть > ![](https://i.imgur.com/aeYl3dU.png) ![](https://i.imgur.com/CdZkwon.png) 3) Перенаправление трафика Изнутри при коннекте на Linux-FW на 80 и 443й порты - Перенаправлял на сайт hackeru.pro. -A PREROUTING -i ens4.30 -p tcp --dport 80 -j DNAT --to-destination 185.146.2.237:80 -A PREROUTING -i ens4.30 -p tcp --dport 443 -j DNAT --to-destination 185.146.2.237:443 -A POSTROUTING -o ens4.30 -p tcp -s 185.146.2.237 -j SNAT --to-source 192.168.30.254 -A POSTROUTING -o ens3 -j MASQUERADE iptables -t nat -A PREROUTING -d 192.168.4.166 -p tcp -m tcp --dport 80 -j DNAT --to-destination 185.146.2.237 iptables -t nat -A POSTROUTING -s 185.146.2.237 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.4.166 Защита локахоста: ### localhost ###### $IPT -A FORWARD ! -i lo -s 127.0.0.1 -j DROP #все что приходит не с локалхоста, но с адреса 127.0.0.1 дропаем $IPT -A INPUT ! -i lo -s 127.0.0.1 -j DROP $IPT -A FORWARD ! -i lo -d 127.0.0.1 -j DROP $IPT -A INPUT ! -i lo -d 127.0.0.1 -j DROP #все что приходит с локалхоста, но не с адреса 127.0.0.1 дропаем $IPT -A INPUT -d 127.0.0.1 -j ACCEPT $IPT -A INPUT -s 127.0.0.1 -j ACCEPT Показать подробно iptables: **iptables -L -v -n -x --line-numbers ** рабочий скрипт: ``` #!/bin/bash IPT=/sbin/iptables IPTR=/sbin/iptables-restore IPTS=/sbin/iptables-save start() { echo -n "starting firewall...." $IPT -P INPUT ACCEPT $IPT -P FORWARD ACCEPT $IPT -P OUTPUT ACCEPT $IPT -F $IPTR -c /etc/network/iptables.rules echo "Done" } stop() { echo -n "Stop firewall..." $IPTS -c > /etc/network/iptables.rules $IPT -P INPUT ACCEPT $IPT -P FORWARD ACCEPT $IPT -P OUTPUT ACCEPT $IPT -F echo "Done" } reset() { $IPT -P INPUT ACCEPT $IPT -P FORWARD ACCEPT $IPT -P OUTPUT ACCEPT $IPT -F #============================================ ### state rules $IPT -A INPUT -m state --state INVALID -j DROP $IPT -A FORWARD -m state --state INVALID -j DROP $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT ### localhost ###### $IPT -A FORWARD ! -i lo -s 127.0.0.1 -j DROP $IPT -A INPUT ! -i lo -s 127.0.0.1 -j DROP $IPT -A FORWARD ! -i lo -d 127.0.0.1 -j DROP $IPT -A INPUT ! -i lo -d 127.0.0.1 -j DROP $IPT -A INPUT -d 127.0.0.1 -j ACCEPT $IPT -A INPUT -s 127.0.0.1 -j ACCEPT ##### enabled ############ $IPT -A INPUT -p icmp -j ACCEPT $IPT -A INPUT -p tcp -i eth1 -m state --state NEW --dport 22 -m recent --update --seconds 20 -j DROP $IPT -A INPUT -p tcp -i eth1 -m state --state NEW --dport 22 -m recent --set -j ACCEPT $IPT -A INPUT -p tcp --dport 22 -j ACCEPT $IPT -P INPUT DROP $IPT -P FORWARD DROP } init() { echo -n "Init firewall..." reset $IPT -A INPUT -p udp --dport 53 -j ACCEPT $IPT -A INPUT -p tcp --dport 53 -j ACCEPT $IPT -A INPUT -p tcp --dport 80 -j ACCEPT $IPT -A INPUT -p tcp --dport 25 -j ACCEPT $IPTS -c > /etc/network/iptables.rules echo "Done" } case $1 in start) start ;; stop) stop ;; init) init ;; reset) reset ;; *) echo "Usage `basename $0` start|stop|init|reset" exit 88 esac ```