LINUX.ORG.RU
ФорумAdmin

Нелегитимный трафик на пул nat адресов в iptables

 ,


0

2

Приветствую! Недавно начал тестировать nat на iptables + ipt_ratelimit + ipt_netflow

Столкнулся, что на вх. интерфейс WAN=«ens1f0.49», который смотрит в интернет прилетают пакеты длинной 0 либо 40B на адреса из пула nat /25 подсети, которые пока что никто из клиентов за локальными адресами не использует, пока что тестируется один клиент из локальной сети и у него другой нат адрес, но интересно можно ли как-то это дропать такие пакеты. В этих пакетах всегда прилетает с флагом tcp S, это никак не влияет на работу доступа в интернет либо самого сервера, но засоряет netflow данные на коллекторе такими пакетами по 40B.

вот немного данных с tcpdump, первые 3 октета нат адрес скрыл xx, но по последним октетам видно, что постоянно идут запросы на нат адреса из пула, которые пока что не используются.

tcpdump -i ens1f0.49

09:00:28.547428 IP 109.205.213.119.46059 > xx.xx.xx.14.12782: Flags [S], seq 3754013231, win 1024, length 0
09:00:28.548055 IP 109.205.213.119.46059 > xx.xx.xx.21.12782: Flags [S], seq 641338050, win 1024, length 0
09:00:28.549743 IP 109.205.213.119.46059 > xx.xx.xx.62.53939: Flags [S], seq 2865560167, win 1024, length 0
09:00:28.550030 IP 109.205.213.119.46059 > xx.xx.xx.35.18270: Flags [S], seq 1831743602, win 1024, length 0
09:00:28.559638 IP 109.205.213.119.46059 > xx.xx.xx.11.57520: Flags [S], seq 825489323, win 1024, length 0
09:00:28.560243 IP 109.205.213.119.46059 > xx.xx.xx.23.42387: Flags [S], seq 2859244899, win 1024, length 0
09:00:28.565678 IP 109.205.213.119.46059 > xx.xx.xx.76.39524: Flags [S], seq 2156982538, win 1024, length 0
09:00:28.577719 IP 109.205.213.119.46059 > xx.xx.xx.73.41118: Flags [S], seq 738077019, win 1024, length 0
09:17:54.119843 IP 109.205.213.90.51638 > xx.xx.xx.38.58368: Flags [S], seq 4016141653, win 1024, length 0
09:30:39.602596 IP 198.235.24.113.50961 > xx.xx.xx.36.2323: Flags [S], seq 2040150752, win 1024, options [mss 1460], length 0

Вот сами правила iptables

#!/bin/bash

# Задаем переменные
IPT="/sbin/iptables"
WAN="ens1f0.49"
LAN="ens1f0.13"
gray_nets="10.12.0.0/16"
our_ips="10.0.0.0/8,172.16.0.0/12,xx.xx.xx.0/19"
nat_ips="xx.xx.xx.0-xx.xx.xx.128"

echo "1" > /proc/sys/net/ipv4/ip_forward

# Clear all

$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT
$IPT -t mangle -P PREROUTING ACCEPT
$IPT -t mangle -P OUTPUT ACCEPT
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X

# NETFLOW START

$IPT -I FORWARD -j NETFLOW
$IPT -I INPUT -j NETFLOW
$IPT -I OUTPUT -j NETFLOW

echo "16777216" > /proc/sys/net/netflow/hashsize
echo "5000000" > /proc/sys/net/netflow/maxflows
echo "16777216" > /proc/sys/net/netflow/sndbuf

# DROP ALL

$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT

## START ##

# ----------------------------------------------------------------------

# INPUT CHAIN 

# Filter lo
$IPT -A INPUT -i lo -j ACCEPT

$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -m state --state INVALID -j DROP

# Limits
$IPT -A INPUT -p tcp --syn -m connlimit --connlimit-above 1000 -j DROP
$IPT -A OUTPUT -s $gray_nets -p icmp -m connlimit --connlimit-above 100 -j DROP
$IPT -A OUTPUT -s $gray_nets -p tcp -m connlimit --connlimit-above 1000 -j DROP

# Permit to me from  our nets
$IPT -A INPUT -s $our_ips -j ACCEPT

# Deny wrong traffic 

$IPT -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
$IPT -A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP

# ----------------------------------------------------------------------

# FORWARD CHAIN

# Speed policing 

$IPT -A FORWARD -m ratelimit --ratelimit-set speed_out --ratelimit-mode src -j DROP
$IPT -A FORWARD -m ratelimit --ratelimit-set speed_in --ratelimit-mode dst -j DROP

# States 

$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -m state --state INVALID -j DROP

# Forward outgoing traffic for gray_nets

$IPT -A FORWARD -o $WAN -s $gray_nets -j ACCEPT

# ----------------------------------------------------------------------

# OUTPUT CHAIN

# Filter out lo

$IPT -A OUTPUT -o lo -j ACCEPT

$IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# ----------------------------------------------------------------------

# POSTROUTING CHAIN

# Rules for SNAT
$IPT -t nat -A POSTROUTING -o $WAN -s $gray_nets -j SNAT --to-source $nat_ips --persistent

## END FOR IPTABLES ##

Может надо что то в цепочке input или forawrd прописать для правила тсп пакетов с флагом syn?

пробовал в цепочке input написать -p tcp –tcp-flags SYN,ACK,FIN,RST SYN -j DROP , но он дропает такие пакеты непосредственно на сам адрес нат сервера, но не на адреса из нат пула.

пробовал в цепочке input написать -p tcp –tcp-flags SYN,ACK,FIN,RST SYN -j DROP , но он дропает такие пакеты непосредственно на сам адрес нат сервера, но не на адреса из нат пула.

Дак, -t filter -A FORWARD же. А если совсем мусор, то -t raw -A PREROUTING

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

Попробовал сначала на цепочку forward

-t filter -A FORWARD p tcp –tcp-flags SYN,ACK,FIN,RST SYN -j DROP

добавил отслеживание в логи, плюс вижу в iptables -L FORWARD -xvn много пакетов по счетчику на это правило. в логах вижу кучу дропов

Aug 29 10:25:17 nattest kernel: [  302.078659] WRONG FORWARDIN=ens1f0.49 OUT=ens1f0.49 MAC=3c:fd:fe:eb:28:5c:6c:20:56:ca:f4:41:08:00 SRC=109.205.213.119 DST=xx.xx.xx.4 LEN=40 TOS=0x00 PREC=0x00 TTL=240 ID=27927 PROTO=TCP SPT=46059 DPT=59975 WINDOW=1024 RES=0x00 SYN URGP=0 
Aug 29 10:25:17 nattest kernel: [  302.081137] WRONG FORWARDIN=ens1f0.49 OUT=ens1f0.49 MAC=3c:fd:fe:eb:28:5c:6c:20:56:ca:f4:41:08:00 SRC=109.205.213.119 DST=xx.xx.xx.83 LEN=40 TOS=0x00 PREC=0x00 TTL=240 ID=11945 PROTO=TCP SPT=46059 DPT=55456 WINDOW=1024 RES=0x00 SYN URGP=0 
Aug 29 10:25:17 nattest kernel: [  302.081678] WRONG FORWARDIN=ens1f0.49 OUT=ens1f0.49 MAC=3c:fd:fe:eb:28:5c:6c:20:56:ca:f4:41:08:00 SRC=109.205.213.119 DST=xx.xx.xx.124 LEN=40 TOS=0x00 PREC=0x00 TTL=240 ID=13767 PROTO=TCP SPT=46059 DPT=55456 WINDOW=1024 RES=0x00 SYN URGP=0 
В tcpdump все равно льются эти запросы 
10:29:30.051010 IP 109.205.213.119.46059 > xx.xx.xx.96.27792: Flags [S], seq 1864613338, win 1024, length 0
10:29:30.056514 IP 109.205.213.119.46059 > xx.xx.xx.101.20231: Flags [S], seq 670555770, win 1024, length 0
10:29:30.057852 IP 104.156.155.11.46383 > xx.xx.xx.79.5984: Flags [S], seq 3037619323, win 1024, length 

Плюс перестает нормально открывать часть ресурсов для легитимного клиента за локальным адресом, скорее всего из-за того, что дропает сразу флаг tcp c SYN без других флагов, то есть такой вариант не помогает, но ещё ломает инет.

Про PREROUTING с -t raw тоже самое.

Предполагаю, что правило -p tcp –tcp-flags SYN,ACK,FIN,RST SYN -j DROP не правильно использовать в этом случае, так как это ломает ещё легитимный трафик, но как тогда дропать такие мусорные трафики на пустые нат адреса из пула?

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

Столкнулся, что на вх. интерфейс WAN=«ens1f0.49», который смотрит в интернет прилетают пакеты длинной 0 либо 40B на адреса из пула nat /25 подсети

Немного не в тему. А пул на реальных IP что ли? Как оно вообще прилетает?

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

есть префикс /22 который анонсится во внешний мир через bgp. на разных нат серверах дробится по /25 пул натов, на L3 коммутаторе куда подключены эти наты указана статика роут к пулу этого нат /25 сервера. типа ip route xx.xx.xx.xx/25 «адрес сервера» который поднят во влане 49, на стороне сервера ens1f0.49 на интерфейс ens1f0.13 прилетают серые адреса, а через ens1f0.49 соотв. натятся.

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

Если у вас для NAT выделен отдельный адрес (адреса), то дропайте всё, что приходит с инета на этот адрес и имеет состояние NEW.

Если вы NAT-адреса назначали на интерфейс, то дропайте в INPUT, иначе в FORWARD.

mky ★★★★★
()

Создать набор (ipset типа hash:ip или bitmap:ip) в котором перечислить все внешние адреса на которых есть реальные клиенты.

В raw/PREROUTING дропать ВСЁ что пришло на внешний интерфейс и не входит в этот набор.

Дальше создать аналогичный набор (hash:ip,port) для всех сервисов (tcp и udp) на всех внешних адресах к которым можно обращаться снаружи.

В raw/PREROUTING дропать tcp(syn) если его нет во втором наборе.

Для udp это можно будет сделать в filter/FORWARD для новых «коннектов» до попадания в netflow

В filter/FORWARD дропать все пришедшее извне что с состоянием INVALID.

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

Я это понимаю. Добавил такое правило в цепочку forward

$IPT -t filter -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT $IPT -t filter -A FORWARD -m state –state INVALID -j DROP

$IPT -A FORWARD -i $WAN -d xx.xx.xx.xx/25 -m state –state NEW -j LOG –log-prefix "DROP FRD: " $IPT -A FORWARD -i $WAN -d xx.xx.xx.xx/25 -m state –state NEW -j DROP

в логах iptables вижу дропы как раз того src,например 109.205.213.119 адреса и dst адреса из пула nat который мусорит в tcpdump на интерфейс вх ens1f0.49

Aug 29 13:04:43 nattest kernel: [ 1302.234918] DROP FRD: IN=ens1f0.49 OUT=ens1f0.49 MAC=3c:fd:fe:eb:28:5c:6c:20:56:ca:f4:41:08:00 SRC=104.156.155.11 DST=xx.xx.xx.99 LEN=40 TOS=0x00 PREC=0x00 TTL=239 ID=29175 PROTO=TCP SPT=46383 DPT=63032 WINDOW=1024 RES=0x00 SYN URGP=0 
Aug 29 13:04:43 nattest kernel: [ 1302.253911] DROP FRD: IN=ens1f0.49 OUT=ens1f0.49 MAC=3c:fd:fe:eb:28:5c:6c:20:56:ca:f4:41:08:00 SRC=109.205.213.119 DST=xx.xx.xx.66 LEN=40 TOS=0x00 PREC=0x00 TTL=240 ID=10803 PROTO=TCP SPT=46059 DPT=26722 WINDOW=1024 RES=0x00 SYN URGP=0 
Aug 29 13:04:43 nattest kernel: [ 1302.254488] DROP FRD: IN=ens1f0.49 OUT=ens1f0.49 MAC=3c:fd:fe:eb:28:5c:6c:20:56:ca:f4:41:08:00 SRC=109.205.213.119 DST=xx.xx.xx.74 LEN=40 TOS=0x00 PREC=0x00 TTL=240 ID=30007 PROTO=TCP SPT=46059 DPT=65320 WINDOW=1024 RES=0x00 SYN URGP=0 

потом смотрю tcpdump -i ens1f0.49 -vvv

13:07:24.280931 IP (tos 0x0, ttl 241, id 44754, offset 0, flags [none], proto TCP (6), length 40)
    109.205.213.119.46059 > xx.xx.xx.18.60267: Flags [S], cksum 0xbe47 (correct), seq 2535523499, win 1024, length 0
13:07:24.286207 IP (tos 0x0, ttl 241, id 7622, offset 0, flags [none], proto TCP (6), length 40)
    109.205.213.119.46059 > xx.xx.xx.xx.15550: Flags [S], cksum 0xe24f (correct), seq 3321978901, win 1024, length 0
13:07:24.289468 IP (tos 0x0, ttl 241, id 42135, offset 0, flags [none], proto TCP (6), length 40)
    109.205.213.119.46059 > xx.xx.xx.86.24835: Flags [S], cksum 0xc55b (correct), seq 2585429186, win 1024, length 0
13:07:24.292830 IP (tos 0x0, ttl 241, id 48629, offset 0, flags [none], proto TCP (6), length 40)
    109.205.213.119.46059 > xx.xx.xx.79.58695: Flags [S], cksum 0x3e23 (correct), seq 131799549, win 1024, length 0
13:07:24.297027 IP (tos 0x0, ttl 241, id 60175, offset 0, flags [none], proto TCP (6), length 40)
    109.205.213.119.46059 > xx.xx.xx.74.51330: Flags [S], cksum 0xa250 (correct), seq 2016240258, win 1024, length 0
13:07:24.314274 IP (tos 0x0, ttl 241, id 7291, offset 0, flags [none], proto TCP (6), length 40)
    109.205.213.119.46059 > xx.xx.xx.5.58650: Flags [S], cksum 0x45d2 (correct), seq 1648080996, win 1024, length 0

Как бы он дропает в цепочке forward , но все равно пакеты присутствуют на внешнем интерфейсе с dst моих пулов , где запрещен NEW. Пробовал на input добавить эти правила, там не срабатывания по дропу, скорее всего из-за того, что трафик проходит внешний через forward. В -t raw prerouting тоже добавлял, не срабатывает.

Мануал читал прохождения пакетов, но не могу понять как тогда пакеты такие все равно попадают на внешний интерфейс на пул натов если он их дропает. Возможно я ошибаюсь и не так понимаю механизм работы iptables

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

Зачем у вас сделана такая дичь:

IN=ens1f0.49 OUT=ens1f0.49

Пропишите blackhole маршрут или ещё что, если ip-адрес выделен для NAT, так он и должен остаться для NAT, чтобы сервер его не отфутболивал обратно.

Насчёт tcpdump я не понял, в логах у вас одни адреса, в дампе другие. Если хотите что-то показать, что лучше по одной строке из лога и из tcpdump, но чтобы там совпадало.

И, надеюсь, вы помнимаете, что пакет откуда-то отправляется и приходит на интерфейс. Сделать с этим на стороне приёма ничего нельзя. Если пакет пришёл на интерфейс, он будет в выводе tcpdump. Файервол (iptables) сработает позже.

Вы всё время пишете ″iptables -A FORWARD ...″ — это означает добавить правило в конец списка. А первым в списке у вас стоит ″-j NETFLOW″. То есть вы сначала отправляете пакет в netflow, а уже потом дропаете? Так и задумано? Вроде, изначально вы с этим хотели бороться.

По идее, вам нужно вынести в начало все DROP правила, потом NETFLOW, а потом один ACCEPT — то что пошло в NETFLOW, то и разрешаем.

Так как в такой логике правила не всегда удобно записывать, то делается отдельная цепочка, все пакеты в начале идут в эту цепочку. В ней вместо ACCEPT ставится RETURN, а DROP отстаётся DROP-ом. Уже после этой цепочки ставится NETFLOW.

mky ★★★★★
()