LINUX.ORG.RU
ФорумAdmin

IPTABLES нужна помощь

 


2

2

Есть сервер, хочу реализовать на нем проксмокс с виртуалками. Но и хочу ограничить доступ на него. Настраиваю IPTABLES делаю порт кнокинг по пингу и добавляю айпишник в разрешенный лист на 2 минуты потом правило INPUT - ESTABLISHED,RELATED и правило доступа к порту 8006 для управления веб мордой Проксмокса с адресами разрешенными из списка порткнокинга. Пока адрес висит в этом списке то все работает но через 2 минуты перестает работать. почему не работает правило ESTABLISHED,RELATED? Где ошибка ткните носом пожалуйста. Вот конфиг.


#!/bin/bash
# Объявление переменных
export IPT="iptables"

# Активный сетевой интерфейс
export WAN=vmbr0

# Очистка всех цепочек iptables
$IPT -F
$IPT -F -t nat
$IPT -F -t mangle
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X

# Установим политики по умолчанию для трафика, не соответствующего ни одному из правил
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP


#Запрет любого трафика по ipv6
ip6tables -P INPUT DROP
ip6tables -P OUTPUT DROP
ip6tables -P FORWARD DROP

# разрешаем локальный траффик для loopback
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

#Port Knockung

$IPT -A INPUT -p icmp --icmp-type echo-request -m length --length 65 -j SET --add-set knock_step_1 src
$IPT -A INPUT -p icmp --icmp-type echo-request -m length --length 854 -m set --match-set knock_step_1 src -j SET --add-set knock_step_2 src
$IPT -A INPUT -p icmp --icmp-type echo-request -m length --length 254 -m set --match-set knock_step_2 src -j SET --add-set knock_allow src --exist

# разрешаем пинги
$IPT -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT


# Разрешаем исходящие соединения самого сервера
$IPT -A OUTPUT -o $WAN -j ACCEPT

# Состояние ESTABLISHED говорит о том, что это не первый пакет в соединении.
# Пропускать все уже инициированные соединения, а также дочерние от них
$IPT -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
# Пропускать новые, а так же уже инициированные и их дочерние соединения
$IPT -A OUTPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
# Разрешить форвардинг для уже инициированных и их дочерних соединений
$IPT -A FORWARD -p all -m state --state ESTABLISHED,RELATED -j ACCEPT

# Включаем фрагментацию пакетов. Необходимо из за разных значений MTU
$IPT -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

# Отбрасывать все пакеты, которые не могут быть идентифицированы
# и поэтому не могут иметь определенного статуса.
$IPT -A INPUT -m state --state INVALID -j DROP
$IPT -A FORWARD -m state --state INVALID -j DROP

# Приводит к связыванию системных ресурсов, так что реальный
# обмен данными становится не возможным, обрубаем
$IPT -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP

#Защита от SYN-flood:

$IPT -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
$IPT -A INPUT -p tcp --syn -j DROP

#Защита от сканеров портов:

$IPT -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
$IPT -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j DROP

#Защита от Ping of death:

$IPT -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type echo-request -j DROP



# Открываем порт для Proxmox 
$IPT -A INPUT -i $WAN -p tcp --dport 8006 -m set --match-set knock_allow src -j ACCEPT
# Открываем порт для DNS
$IPT -A INPUT -i $WAN -p udp --dport 53 -j ACCEPT
# Открываем порт для NTP
$IPT -A INPUT -i $WAN -p udp --dport 123 -j ACCEPT

# Записываем правила в файл
/sbin/iptables-save > /etc/iptables_rules



Последнее исправление: Wild_Tigra (всего исправлений: 4)

Ответ на: комментарий от Wild_Tigra

Явного косяка я не заметил.

iptables -t raw -A PREROUTING -p tcp --dport 8006 -m set ! --match-set knock_allow -j TRACE

покажет какие правила сработали после протухания адреса.

Посмотри Как сделать сервер маршрутизации? (комментарий) про sysctl и скрипт.

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 1)
Ответ на: комментарий от vel

После добавление правила в логах вот такое

0 6 - 29/Aug/2023:17:40:29 +0300 TRACE: filter:INPUT:policy:19 IN=vmbr0 MAC=00-00 SRC=84.Х.Х.21 DST=42.Х.Х.32 LEN=52 TOS=0x00 PREC=0x00 TTL=120 ID=46185 DF PROTO=TCP SPT=11578 DPT=8006 SEQ=2759234571 ACK=0 WINDOW=64240 SYN
0 6 - 29/Aug/2023:17:40:30 +0300 TRACE: raw:PREROUTING:policy:2 IN=vmbr0 MAC=00-00 SRC=84.Х.Х.21 DST=42.Х.Х.32 LEN=52 TOS=0x00 PREC=0x00 TTL=120 ID=46186 DF PROTO=TCP SPT=11579 DPT=8006 SEQ=4157780011 ACK=0 WINDOW=64240 SYN
0 6 - 29/Aug/2023:17:40:30 +0300 TRACE: mangle:PREROUTING:policy:1 IN=vmbr0 MAC=00-00 SRC=84.Х.Х.21 DST=42.Х.Х.32 LEN=52 TOS=0x00 PREC=0x00 TTL=120 ID=46186 DF PROTO=TCP SPT=11579 DPT=8006 SEQ=4157780011 ACK=0 WINDOW=64240 SYN
0 6 - 29/Aug/2023:17:40:30 +0300 TRACE: nat:PREROUTING:policy:1 IN=vmbr0 MAC=00-00 SRC=84.Х.Х.21 DST=42.Х.Х.32 LEN=52 TOS=0x00 PREC=0x00 TTL=120 ID=46186 DF PROTO=TCP SPT=11579 DPT=8006 SEQ=4157780011 ACK=0 WINDOW=64240 SYN
0 6 - 29/Aug/2023:17:40:30 +0300 TRACE: mangle:INPUT:policy:1 IN=vmbr0 MAC=00-00 SRC=84.Х.Х.21 DST=42.Х.Х.32 LEN=52 TOS=0x00 PREC=0x00 TTL=120 ID=46186 DF PROTO=TCP SPT=11579 DPT=8006 SEQ=4157780011 ACK=0 WINDOW=64240 SYN
0 6 - 29/Aug/2023:17:40:30 +0300 TRACE: filter:INPUT:policy:19 IN=vmbr0 MAC=00-00 SRC=84.Х.Х.21 DST=42.Х.Х.32 LEN=52 TOS=0x00 PREC=0x00 TTL=120 ID=46186 DF PROTO=TCP SPT=11579 DPT=8006 SEQ=4157780011 ACK=0 WINDOW=64240 SYN

Wild_Tigra
() автор топика
Ответ на: комментарий от Wild_Tigra

Тяжело на работе к концу рабочего дня.

iptables -t raw -A PREROUTING -p tcp --dport 8006 -m set ! --match-set knock_allow src -j TRACE

src пропустил :(

#Защита от SYN-flood:

$IPT -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
$IPT -A INPUT -p tcp --syn -j DROP

IMHO это косяк.

Оно пропускает 1 раз в секунду любой tcp-коннект, а все остальные tcp-соединения дропает.

vel ★★★★★
()
Ответ на: комментарий от vel

то что пропущен src я заметил, вывод не изменился. он же и показывает попытки конекта от моего айпи на айпи сервера. только я если честно ниче не понимаю в этом логе.

Wild_Tigra
() автор топика
#Защита от SYN-flood:

$IPT -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
$IPT -A INPUT -p tcp --syn -j DROP

#Защита от сканеров портов:

$IPT -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
$IPT -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j DROP

Мусьё знает толк в отстреливании ног.

MagicMirror
()
Ответ на: комментарий от vel

iptables -nvxL INPUT

Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP 0  — * * 0.0.0.0/0 0.0.0.0/0 match-set BLACK_List_ip src
0 0 ACCEPT 0  — lo * 0.0.0.0/0 0.0.0.0/0
0 0 SET 1  — * * 0.0.0.0/0 0.0.0.0/0 icmptype 8 length 65 add-set knock_step_1 src
0 0 SET 1  — * * 0.0.0.0/0 0.0.0.0/0 icmptype 8 length 854 match-set knock_step_1 src add-set knock_step_2 src
0 0 SET 1  — * * 0.0.0.0/0 0.0.0.0/0 icmptype 8 length 254 match-set knock_step_2 src add-set knock_allow src exist
0 0 ACCEPT 1  — * * 0.0.0.0/0 0.0.0.0/0 icmptype 0
0 0 ACCEPT 1  — * * 0.0.0.0/0 0.0.0.0/0 icmptype 3
0 0 ACCEPT 1  — * * 0.0.0.0/0 0.0.0.0/0 icmptype 11
4 240 ACCEPT 1  — * * 0.0.0.0/0 0.0.0.0/0 icmptype 8
8 576 ACCEPT 0  — * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 DROP 0  — * * 0.0.0.0/0 0.0.0.0/0 state INVALID
0 0 DROP 6  — * * 0.0.0.0/0 0.0.0.0/0 tcp flags:!0x17/0x02 state NEW
0 0 ACCEPT 6  — vmbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
0 0 ACCEPT 6  — vmbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8006 match-set knock_allow src
0 0 ACCEPT 17  — vmbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
0 0 ACCEPT 17  — vmbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:123

iptables -nvxL OUTPUT
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT 0  — * lo 0.0.0.0/0 0.0.0.0/0
268 52428 ACCEPT 0  — * vmbr0 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT 0  — * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 DROP 6  — * * 0.0.0.0/0 0.0.0.0/0 tcp flags:!0x17/0x02 state NEW

Wild_Tigra
() автор топика
Ответ на: комментарий от Wild_Tigra

Замечательно! Но пока не видно попыток порт-кнокинга и срабатывания правила с «match-set knock_allow src»

Чтобы ты понимал происходящее, нужно добавить перед

ACCEPT 0 — * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED

правила

iptables -A INPUT -p tcp --dport 8006
iptables -A INPUT -p tcp --dport 8006 -m state --state NEW
iptables -A INPUT -p tcp --dport 8006 -m state --state ESTABLISHED

Счетчики этих правил показали бы сколько пакетов пришло на этот порт, сколько попыток установки соединений было и сколько пакетов относилось к установленным соединениям.

А ты тестируешь эти правила с этой же машины или есть какой-то внешний хост?

vel ★★★★★
()
Ответ на: комментарий от vel

не видно попыток порт-кнокинга и срабатывания правила с «match-set knock_allow src»

Только перегрузил сервер и не пробовал подключиться, поэтому счетчики пустые были

добавил правила. До запуска порткнокинга были пакеты на первое правило где просто порт указан и на второе где НЬЮ. После порткнокинга добавились на мое правило со списком и пошли естаблишмет на порту. После того как время работы списка закончилось, прекратились пакеты на естаблишет и начались НЬЮ.

817 190033 6  — * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8006
55 2860 6  — * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8006 state NEW
762 187173 6  — * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8006 state ESTABLISHED
1899 495685 ACCEPT 0  — * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 DROP 0  — * * 0.0.0.0/0 0.0.0.0/0 state INVALID
0 0 DROP 6  — * * 0.0.0.0/0 0.0.0.0/0 tcp flags:!0x17/0x02 state NEW
23 1196 ACCEPT 6  — vmbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8006 match-set knock_allow src

Wild_Tigra
() автор топика
Ответ на: комментарий от Wild_Tigra

IMHO все работает так как и должно работать. Что не так?

web-интерфейс - это обычно короткие запросы. Как только ip в порт-кнокинг протух, так сразу новые запросы и перестали пускать.

Это в ssh сессии могут быть длинными и там бы открытая сессия продолжала бы работать, а новые не принимали.

Для удобства можно добавить правило

$IPT -A INPUT -i $WAN -p tcp --dport 8006 -m set --match-set knock_allow src -j SET --add-set knock_allow src --exist
перед
$IPT -A INPUT -i $WAN -p tcp --dport 8006 -m set --match-set knock_allow src -j ACCEPT

vel ★★★★★
()
Ответ на: комментарий от vel

IMHO все работает так как и должно работать. Что не так?

web-интерфейс - это обычно короткие запросы. Как только ip в порт-кнокинг протух, так сразу новые запросы и перестали пускать.

Это в ssh сессии могут быть длинными и там бы открытая сессия продолжала бы работать, а новые не принимали.

Я так и думал, но не хватает знаний и поэтому спросил тут. Спасибо большое за помощь.

$IPT -A INPUT -i $WAN -p tcp --dport 8006 -m set --match-set knock_allow src -j SET --add-set knock_allow src --exist

А что это правило делает?

Wild_Tigra
() автор топика
Ответ на: комментарий от Wild_Tigra

Поддерживает ip в порт-кнокинге.

Адрес будет удален спустя 2 минут после последнего открытого соединения на этот порт, а не через 2 минуты после порт-кнокинга.

vel ★★★★★
()
Ответ на: комментарий от vel

Адрес будет удален спустя 2 минут после последнего открытого соединения на этот порт, а не через 2 минуты после порт-кнокинга.

Понял, но я могу просто увеличить время нахождения в списке. Так и сделаю или сделаю постоянный для конкретных айпи. Еще раз спасибо за помощь.

Wild_Tigra
() автор топика