iptables: отбросить входящие пакеты UDP, порт назначения 1900

Я пытаюсь использовать iptables, чтобы отбросить пакеты UDP, которые имеют порт назначения 1900. Это влияет на оба направления, поэтому я добавил одно правило для ввода и выводитную цепочку таблицы фильтров.

root@hostname:~# iptables --table filter --list --numeric --verbose
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:1900

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:1900

Это выглядит то, как выглядят входящие пакеты:

root@hostname:~# tcpdump -i enp2s0 -n "udp and port 1900"
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp2s0, link-type EN10MB (Ethernet), capture size 262144 bytes
11:17:35.845252 IP 192.168.0.1.56189 > 239.255.255.250.1900: UDP, length 123
11:17:36.285268 IP 192.168.0.1.36900 > 239.255.255.250.1900: UDP, length 133
11:17:36.285758 IP 192.168.0.1.36900 > 239.255.255.250.1900: UDP, length 127
11:17:36.286157 IP 192.168.0.1.36900 > 239.255.255.250.1900: UDP, length 127
11:17:36.286566 IP 192.168.0.1.36900 > 239.255.255.250.1900: UDP, length 129
11:17:36.286971 IP 192.168.0.1.36900 > 239.255.255.250.1900: UDP, length 129
11:17:36.287390 IP 192.168.0.1.36900 > 239.255.255.250.1900: UDP, length 124
11:17:40.845707 IP 192.168.0.1.56189 > 239.255.255.250.1900: UDP, length 123
11:17:41.285393 IP 192.168.0.1.36900 > 239.255.255.250.1900: UDP, length 133
11:17:41.285810 IP 192.168.0.1.36900 > 239.255.255.250.1900: UDP, length 127
11:17:41.286220 IP 192.168.0.1.36900 > 239.255.255.250.1900: UDP, length 127
11:17:41.286613 IP 192.168.0.1.36900 > 239.255.255.250.1900: UDP, length 129
11:17:41.287029 IP 192.168.0.1.36900 > 239.255.255.250.1900: UDP, length 129
11:17:41.287405 IP 192.168.0.1.36900 > 239.255.255.250.1900: UDP, length 124
^C
14 packets captured
14 packets received by filter
0 packets dropped by kernel

Обычно iptables работает очень хорошо, у меня были другие правила фильтра, которые работали, как ожидалось. Это правило вывода также работает как ожидалось. Следующий вывод показывает, что это правило вывода поймало (и упало) несколько пакетов.

root@hostname:~# iptables --table filter --list OUTPUT --numeric --verbose
Chain OUTPUT (policy ACCEPT 412 packets, 87079 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    6  1128 DROP       udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:1900

Но правило ввода не работает. Теперь я попробовал несколько вариантов правил, чтобы поймать входящие пакеты, не успех.

root@hostname:~# iptables --table filter --list INPUT --numeric --verbose
Chain INPUT (policy ACCEPT 385 packets, 138K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:1900
    0     0 DROP       udp  --  enp0s2 *       0.0.0.0/0            0.0.0.0/0            udp dpt:1900
    0     0 DROP       all  --  *      *       0.0.0.0/0            239.255.255.250     
    0     0 DROP       all  --  enp0s2 *       0.0.0.0/0            239.255.255.250     
    0     0 DROP       udp  --  *      *       0.0.0.0/0            239.255.255.250     
    0     0 DROP       udp  --  enp0s2 *       0.0.0.0/0            239.255.255.250     
    0     0 DROP       all  --  enp0s2 *       0.0.0.0/0            224.0.0.0/4         

Для меня похоже, что правила правильные, но входящие пакеты даже не видны в входную цепочку. Счетчик, отображаемый на цепную политику не соответствует количеству пакетов, которые я вижу в TCPDUMP. В одном случае я видел как 20 пакетов UDP в TCPDUMP, но счетчик показал только 1 пакет: вход цепи (политика принимает 1 пакеты, 52 байта) .

Входящие пакеты также не видны в файле журнала, когда я добавляю правило, которое регистрирует каждый пакет в входной цепи:

Chain INPUT (policy ACCEPT 655 packets, 573K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:1900
   46  5527 LOG        udp  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 0 level 4 prefix "[INPUT UDP] "
  657  573K LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 0 level 4 prefix "[INPUT all] "

. Единственные пакеты в журнале являются HTTPS и DNS.

Мои вопросы:

  1. Почему входное правило не эффективно? Возможно, iptables не обрабатывает входящие пакеты, потому что они обращаются к какому-либо широковещательному адресу?
  2. Как я могу бросить пакеты (UDP, порт назначения 1900) с ipv4?

Это все о IPv4, я не беспокоиться о IPv6.

Linux Kernel версия: 5.8.0-44-Generic # 50 ~ 20.04.1-Ubuntu SMP

2
задан 6 March 2021 в 01:25

1 ответ

Это меньше ответа и больше о поддержке ваших выводов.

Для меня похоже, что правила правильные, но входящие пакеты даже не видны в входную цепочку. Счетчик отображается на Цепная политика не соответствует количеству пакетов, которые я вижу в TCPDUMP. В Один случай я видел как 20 пакетов УДП в TCPDUMP, но счетчик показал Только 1 пакет: вход цепи (политика принимает 1 пакеты, 52 байта).

Я получаю то же самое. Вот мои правила набор скрипта:

doug@rpi2:~ $ cat test-iptables
#!/bin/sh
FWVER=0.01
#
# test_firewall 2021.03.05 Ver:0.01
#       Just some simple rules for a test.
#       Currently for this question:
#       https://askubuntu.com/questions/1321344/iptables-drop-incoming-udp-packets-destination-port-1900
#

echo "Loading test_firewall version $FWVER..\n"

# The location of the iptables program
#
IPTABLES=/usr/sbin/iptables

#Set some stuff
#
EXTIF="eth0"
UNIVERSE="0.0.0.0/0"

#Clearing any previous configuration
#
#echo "  Clearing any existing rules and setting default policies.."
$IPTABLES -P INPUT ACCEPT
$IPTABLES -F INPUT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -F OUTPUT

# Otherwise, I can not seem to delete it later on
$IPTABLES -F
# Delete user defined chains
$IPTABLES -X

# Reset all IPTABLES counters
$IPTABLES -Z
$IPTABLES -t nat -Z

# try to prevent accidental loss of my SSH connection.
# added after I did exactly that.
#
$IPTABLES -A INPUT -i $EXTIF -p tcp --dport 22 -j ACCEPT

# loopback interfaces are valid.
#
$IPTABLES -A INPUT -i lo -s $UNIVERSE -d $UNIVERSE -j ACCEPT

$IPTABLES -A INPUT -i $EXTIF -p udp --dport 1900 -j LOG --log-prefix "U1900:" --log-level info
$IPTABLES -A INPUT -i $EXTIF -p udp --dport 1900 -j DROP

$IPTABLES -A INPUT -d 224.0.0.7 -j LOG --log-prefix "IP224:" --log-level info
$IPTABLES -A INPUT -d 224.0.0.7 -j DROP

$IPTABLES -A INPUT -p udp --dport 8001 -j LOG --log-prefix "U8001:" --log-level info
$IPTABLES -A INPUT -p udp --dport 8001 -j DROP

$IPTABLES -A INPUT -m pkttype --pkt-type broadcast -j LOG --log-prefix "BROAD:" --log-level info
$IPTABLES -A INPUT -m pkttype --pkt-type broadcast -j DROP
$IPTABLES -A INPUT -m pkttype --pkt-type multicast -j LOG --log-prefix "MULTI:" --log-level info
$IPTABLES -A INPUT -m pkttype --pkt-type multicast -j DROP
$IPTABLES -A INPUT -m pkttype --pkt-type UNICAST -j LOG --log-prefix "UNI:" --log-level info
$IPTABLES -A INPUT -m pkttype --pkt-type UNICAST -j DROP
#$IPTABLES -A INPUT -m pkttype --pkt-type ANYCAST -j LOG --log-prefix "ANY:" --log-level info
#$IPTABLES -A INPUT -m pkttype --pkt-type ANYCAST -j DROP

$IPTABLES -A INPUT -s 192.168.111.123  -p udp --sport 8001 -j DROP

$IPTABLES -A INPUT -s 192.168.111.122 -j DROP
$IPTABLES -A INPUT -d 224.0.0.0/4 -j LOG --log-prefix "IP224B:" --log-level info
$IPTABLES -A INPUT -d 224.0.0.0/4 -j DROP

# $IPTABLES -A FORWARD -p udp -i $EXTIF --dport 8001 -j DROP

$IPTABLES -A INPUT -j LOG --log-prefix "CATCH:" --log-level info

echo test_iptables $FWVER done.
echo "test_iptables $FWVER done..." >> /dev/kmsg

в моем случае у меня есть телевизор Samsung в 192.168.111.123 постоянно извергая пакеты в порт 8001:

doug@rpi2:~ $ sudo tcpdump -n -tttt -vvv host 192.168.111.123
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
2021-03-06 13:26:24.073438 IP (tos 0x0, ttl 64, id 57376, offset 0, flags [DF], proto UDP (17), length 63)
    192.168.111.123.36088 > 192.168.111.255.15600: [udp sum ok] UDP, length 35
2021-03-06 13:26:24.840570 IP (tos 0x0, ttl 1, id 35446, offset 0, flags [DF], proto UDP (17), length 232)
    192.168.111.123.8001 > 224.0.0.7.8001: [udp sum ok] UDP, length 204
2021-03-06 13:26:26.849469 IP (tos 0x0, ttl 1, id 35532, offset 0, flags [DF], proto UDP (17), length 232)
    192.168.111.123.8001 > 224.0.0.7.8001: [udp sum ok] UDP, length 204
^C

и я согласен, что они просто не доходят до входной цепочки:

doug@rpi2:~ $ sudo iptables -xvnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
    pkts      bytes target     prot opt in     out     source               destination
     194    15856 ACCEPT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
       0        0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
       0        0 LOG        udp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            udp dpt:1900 LOG flags 0 level 6 prefix "U1900:"
       0        0 DROP       udp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            udp dpt:1900
       0        0 LOG        all  --  *      *       0.0.0.0/0            224.0.0.7            LOG flags 0 level 6 prefix "IP224:"
       0        0 DROP       all  --  *      *       0.0.0.0/0            224.0.0.7
       0        0 LOG        udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:8001 LOG flags 0 level 6 prefix "U8001:"
       0        0 DROP       udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:8001
    1612   173750 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            PKTTYPE = broadcast LOG flags 0 level 6 prefix "BROAD:"
    1612   173750 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            PKTTYPE = broadcast
     460    69304 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            PKTTYPE = multicast LOG flags 0 level 6 prefix "MULTI:"
     460    69304 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            PKTTYPE = multicast
      96    13068 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            PKTTYPE = unicast LOG flags 0 level 6 prefix "UNI:"
      96    13068 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            PKTTYPE = unicast
       0        0 DROP       udp  --  *      *       192.168.111.123      0.0.0.0/0            udp spt:8001
       0        0 DROP       all  --  *      *       192.168.111.122      0.0.0.0/0
       0        0 LOG        all  --  *      *       0.0.0.0/0            224.0.0.0/4          LOG flags 0 level 6 prefix "IP224B:"
       0        0 DROP       all  --  *      *       0.0.0.0/0            224.0.0.0/4
       0        0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 0 level 6 prefix "CATCH:"

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 264 packets, 39247 bytes)
    pkts      bytes target     prot opt in     out     source               destination

и Мы видим, что ничего не связано в файле системного журнала:

doug@rpi2:~ $ grep -a "DPT=8001" /var/log/syslog
doug@rpi2:~ $
1
ответ дан 18 March 2021 в 23:28

Другие вопросы по тегам:

Похожие вопросы: