###### tags: `Attack`
# **IPtables** **Linux**

Настраиваем инфраструктуру согласно рисунка выше, создаем на Linux-машинах Vlan'ы, интернет, добавляем Linux-файерволл.
1. Настраиваем сабинтерфейсы на Linux-FW (ens4)
>nano /etc/network/interfaces

> 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

Расскоментируем эту строчку чтобы 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 - выбрать действие, если правило подошло.

***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).

***Чтобы правила сохранялись после перезагрузки роутера 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 соединения не получиться. Чтобы решить эту проблему нужно модифицировать адрес источника и заменить его на адрес маршрутизатора. Тогда ответ придет маршрутизатору, а тот уже от своего имени передаст его в сеть
>


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
```