---
# System prepended metadata

title: '**IPtables** **Linux**'
tags: [Attack]

---

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