iptables Tips & Tricks [закрыто]

60

Я уверен, что системные администраторы Linux хорошо знакомы с iptablesпользовательским интерфейсом для netfilterинфраструктуры фильтрации пакетов.

Теперь этот «Вопрос» призван стать вики-сообществом для сбора различных кусочков iptablesмудрости. Ничто не является слишком распространенным или неясным. Опубликуйте все, что вы знаете, что поможет другим получить максимальную отдачу iptables.

pepoluan
источник

Ответы:

26

Использование белого и черного списков с iptables

#!/bin/bash

WHITELIST=/whitelist.txt
BLACKLIST=/blacklist.txt

#THIS WILL CLEAR ALL EXISTING RULES!
echo 'Clearing all rules'
iptables -F

#
## Whitelist
#

for x in `grep -v ^# $WHITELIST | awk '{print $1}'`; do
        echo "Permitting $x..."
        $IPTABLES -A INPUT -t filter -s $x -j ACCEPT
done

#
## Blacklist
#

for x in `grep -v ^# $BLACKLIST | awk '{print $1}'`; do
        echo "Denying $x..."
        $IPTABLES -A INPUT -t filter -s $x -j DROP
done

Скрипт для открытия портов

#!/bin/bash
ALLOWEDTCP="80 3128 3784"
ALLOWEDUDP="3128 3784"

#
## Permitted Ports
#

for port in $ALLOWEDTCP; do
       echo "Accepting port TCP $port..."
       $IPTABLES -A INPUT -t filter -p tcp --dport $port -j ACCEPT
done

for port in $ALLOWEDUDP; do
        echo "Accepting port UDP $port..."
        $IPTABLES -A INPUT -t filter -p udp --dport $port -j ACCEPT
done

Блокировка портов

# Attempt to block portscans
# Anyone who tried to portscan us is locked out for an entire day.
iptables -A INPUT   -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP

# Once the day has passed, remove them from the portscan list
iptables -A INPUT   -m recent --name portscan --remove
iptables -A FORWARD -m recent --name portscan --remove

# These rules add scanners to the portscan list, and log the attempt.
iptables -A INPUT   -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A INPUT   -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

Поддельные / недействительные пакеты

# Reject spoofed packets
# These adresses are mostly used for LAN's, so if these would come to a WAN-only server, drop them.
iptables -A INPUT -s 10.0.0.0/8 -j DROP
iptables -A INPUT -s 169.254.0.0/16 -j DROP
iptables -A INPUT -s 172.16.0.0/12 -j DROP
iptables -A INPUT -s 127.0.0.0/8 -j DROP

#Multicast-adresses.
iptables -A INPUT -s 224.0.0.0/4 -j DROP
iptables -A INPUT -d 224.0.0.0/4 -j DROP
iptables -A INPUT -s 240.0.0.0/5 -j DROP
iptables -A INPUT -d 240.0.0.0/5 -j DROP
iptables -A INPUT -s 0.0.0.0/8 -j DROP
iptables -A INPUT -d 0.0.0.0/8 -j DROP
iptables -A INPUT -d 239.255.255.0/24 -j DROP
iptables -A INPUT -d 255.255.255.255 -j DROP

# Drop all invalid packets
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP

Блокировать атаки Smurf

# Stop smurf attacks
iptables -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP
iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP
iptables -A INPUT -p icmp -m icmp -j DROP

# Drop excessive RST packets to avoid smurf attacks
iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT

Блок ICMP (он же пинг)

# Don't allow pings through
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j DROP
Барт Де Вос
источник
4
Попробуйте добавить комментарий к «поддельным» комментариям, чтобы менее опытные пользователи знали, почему исходные адреса считаются поддельными (... при переходе на интерфейс wan).
3моло
1
Хороший звонок :-). Готово.
Барт Де Вос
Подождите. Разве линия Block ICMP (он же ping) не является избыточной для линии атаки Block smurf: iptables -A INPUT -p icmp -m icmp -j DROP?
Станн
2
Ре сценарий белого списка: Theres iptablesна строке 8, а затем $IPTABLESпозже. Достаточно ли просто использовать iptablesвезде? В противном случае я полагаю, вам нужно назначить что-то вроде IPTABLES=/sbin/iptablesправильно?
UpTheCreek
1
Я бы не стал так блокировать портсканы. Вместо этого есть что-то, что будет принимать соединения tcp / udp и ищет несколько связанных пакетов. TCP легко, просто посмотрите, установлены ли эти порты. Все остальное, другие могут проверить это с помощью поддельных пакетов и заблокировать все, что вы не занесли в белый список, например, ваш шлюз.
Аарон
25

Оптимизация производительности netfilter с помощью ipset

Если вы пишете много похожих правил, основанных только на IP, порте или обоих, подумайте об использовании ipsetдля оптимизации производительности netfilter.

Например:

iptables -s 192.168.1.11 -j ACCEPT
iptables -s 192.168.1.27 -j ACCEPT
iptables -s 192.168.1.44 -j ACCEPT
... hundreds of similar rules ...
iptables -s 192.168.251.177 -j ACCEPT

Это означает, что пакет с адресом источника 192.168.251.177 должен сначала пройти сотни правил, прежде чем он сможет получить свой вердикт ACCEPT.

Конечно, опытные системные администраторы разделят правила по подсетям. Но это все еще означает сотни правил.

ipset в помощь!

Сначала определите набор IP ipmapтипа:

ipset -N Allowed_Hosts ipmap --network 192.168.0.0/16

Затем заполните его адресами:

for ip in $LIST_OF_ALLOWED_IP; do ipset -A Allowed_Hosts $ip; done

Наконец, замените сотни правил iptables выше одним правилом:

iptables -m set --match-set Allowed_Hosts src -j ACCEPT

Когда пакет прибывает, netfilter выполнит очень быстрый битовый поиск IP-адреса источника (src) пакета по Allowed_HostsIP-набору. Все пакеты, поступающие с 192.168.0.0/16, будут испытывать одно правило. И поверьте мне, что поиск растрового изображения по крайней мере на два порядка быстрее, чем выполнение сотен проверок правил iptables.

ipsetне ограничивается IP-адресами. Он также может совпадать в зависимости от портов, кортежа IP-порта, адресов сети / подсети, кортежа IP-MAC и т. Д. И т. Д. И он может соответствовать этим критериям в качестве источника или места назначения или сочетания обоих (в случае кортежей).

И, наконец, ipsetвы можете автоматически добавлять IP-адреса в черные / белые списки. Эти черные и белые списки могут также «устаревать», таким образом автоматически удаляя IP-адрес по истечении настраиваемого промежутка времени.

Пожалуйста, обратитесь к ipsetсправочной странице для более подробной информации.

ОЧЕНЬ ВАЖНОЕ ПРИМЕЧАНИЕ:

Некоторые дистрибутивы Linux могут не иметь встроенной поддержки ipset(например, в Ubuntu 10.04 была эта проблема). На этих системах один из способов заключается в установке ipsetиз исходного кода.

Вместо этого загрузите ipsetисходный код с его веб-сайта: http://ipset.netfilter.org/install.html.

С другой стороны , если вы используете xtables-addons, ipset будет включен в его источник: http://xtables-addons.sourceforge.net/

pepoluan
источник
3
Жаль, что по умолчанию он не поддерживается в Debian и Ubuntu. Я думал, что вы собираетесь перечислить некоторые неясные дистрибутивы: /
UpTheCreek
@UpTheCreek Я отредактировал свой ответ ... «специальная заметка» была применима во время публикации ответа, но больше не применима сейчас.
pepoluan
21

Добавьте комментарии к своим правилам:

-m comment --comment "Comments help to read output of iptables -nvL"
AlexM
источник
16

Блокировать общеизвестные TCP-атаки

Добавьте следующие правила, желательно в -t raw -A PREROUTING

-p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
-p tcp --tcp-flags SYN,RST SYN,RST -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP

Блокируемые атаки, соответственно:

  • SYN-FIN атака
  • SYN-RST атака
  • Рождественская атака
  • Nmap FIN сканирование
  • NULL Flags Attack
  • ВСЕ флаги атакуют

(не стесняйтесь редактировать названия атак выше)

pepoluan
источник
4
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROPМожет быть удален, как -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROPбудет ловить каждый пакет он может блокировать.
4
Согласно security.stackexchange.com/questions/4603/… . «Нет необходимости отбрасывать недействительные или неправильно сформированные пакеты, всем этим атакам уже десять лет. Разработчики ядра Linux гораздо более современны, чем вы, в отношении того, какие пакеты действительны, а какие нет». «Как насчет будущих ошибок» некоторые могут поспорить. Ну, как вы узнаете, что будущий недостаток будет в обработчике TCP, а не в парсере iptables TCP? "
Мэтт
1
@VlastimilBurian теоретически они больше не нужны. Но добавление этих правил не замедляет работу сети и не увеличивает загрузку процессора, поэтому я не вижу причин, чтобы не добавлять их и не забывать о них them
pepoluan
7

Включение NAT

  1. echo 1 > /proc/sys/net/ipv4/ip_forward
  2. /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Шаг 1 устанавливает параметр ядра, чтобы разрешить пересылку ip, шаг 2 устанавливает правило iptables, которое включает NAT на интерфейсе eth0.

Кенни Рассчарт
источник
4
Это не будет постоянным после перезагрузки, не так ли? Вам нужно отредактировать /etc/sysctl.conf net.ipv4.ip_forward = 1. (Предполагается, что Red Hat или производная.)
Аарон Копли,
6

Блокировать атаки ICMP

Добавьте следующие правила, желательно в -t raw -A PREROUTING

-p icmp -m u32 ! --u32 "4&0x3FFF=0"   -j DROP
-p icmp -m length --length 1492:65535 -j DROP

Первое правило блокирует все пакеты ICMP, чей «флаг фрагментации» не равен 0. (ICMP никогда не должен фрагментироваться; они должны нести небольшие полезные нагрузки)

Второе правило блокирует нерасфрагментированные ICMP-пакеты большого размера.

pepoluan
источник
Разве это не нарушило бы MTU Discovery?
Мэтт
@Matt no, поскольку при обнаружении Path MTU используются пакеты размером не более размера полезной нагрузки Ethernet, т. Е. 1500 байтов, из которых 8 байтов используются заголовком IP и заголовком ICMP.
pepoluan
Спасибо за разъяснения, но 1492-64к? почему это не 1500-65к. Я могу понять 1492 для PPPoE, но прямой Ethernet.
Мэтт
Это все еще применимо?
LinuxSecurityFreak
@VlastimilBurian Я бы сказал, да. По-прежнему нет необходимости в длинных ICMP-пакетах.
pepoluan
4

использование FireHOL - удобная оболочка iptables

Я нашел это намного более интуитивным, чем прямые команды iptables. Специально для людей с опытом работы с другими брандмауэрами:

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

Ophir Yoktan
источник
2
Я предпочитаю Shorewall, который активно разрабатывается, поддерживает IPv4 и IPv6 и может создавать межсетевые экраны для других систем iptables.
BillThor
4

(из моего файла iptables_tricks.txt, перекомпилированного из многих мест: P)

Заставляет iptables ждать 15 секунд между новыми подключениями с того же IP на порту 22 (SSH):

 iptables -A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --update --seconds 15 -j DROP
 iptables -A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --set -j ACCEPT
boris quiroz
источник
1
То же самое, но с подсчетом попыток:-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 --rttl --name SSH -j DROP
alexm
3

IP-наборы пересмотрены

Уже есть ответ, упоминающий наборы IP. Тем не менее, он является скорее одномерным, поскольку в нем основное внимание уделяется повышению производительности по сравнению с классическими правилами, а также тому факту, что наборы IP-адресов смягчают проблему, возникающую при использовании большого количества отдельных IP-адресов, которые нельзя легко выразить как подсеть в нотации CIDR.

Обозначения, используемые ниже

Ибо ipsetя буду использовать обозначения, прочитанные ipset restoreи написанные ipset save.

Соответственно для iptablesip6tables) правил я буду использовать обозначения, которые прочитаны iptables-restoreи написаны iptables-save. Это сокращает нотацию и позволяет выделить потенциальные правила -4только для IPv4 (с префиксом ) или только для IPv6 (с префиксом -6).

В некоторых примерах мы перенаправим поток пакетов в другую цепочку. Предполагается, что цепочка существует в этой точке, поэтому строки для создания цепочек не создаются (не упоминается ни имя таблицы, ни команды COMMITв конце).

Расширенные наборы IP

Наборы IP могут сделать намного больше, чем было упомянуто в другом ответе, и вы обязательно должны прочитать документацию ipset(8)по IP-наборам ( ) вместе с iptables-extensions(8)этой краткой записью здесь.

Например , я буду в основном сосредоточены на три типа набора: hash:ip, hash:netи list:set, но есть больше , чем те , и все они имеют действительные случаи использования.

Например, вы можете также сопоставлять номера портов, а не только IP-адреса .

Сохранение и восстановление наборов IP , как с iptables-saveиiptables-restore

Вы можете создавать декларации IP-наборов и импортировать их по трубопроводу ipset restore. Если вы хотите сделать вашу команду более устойчивой к уже существующим записям, используйте ipset -exist restore.

Если ваши правила находятся в файле, который default.setвы будете использовать:

ipset -exist restore < default.set

Подобный файл может содержать записи в createнаборы и addзаписи в них. Но, как правило, большинство команд из командной строки имеют соответствующую версию в файлах. Пример (создание набора DNS-серверов):

create dns4 hash:ip family inet
create dns6 hash:ip family inet6
# Google DNS servers
add dns4 8.8.8.8
add dns4 8.8.4.4
add dns6 2001:4860:4860::8888
add dns6 2001:4860:4860::8844

Здесь один набор создан для IPv4 ( dns4) и один для IPv6 ( dns6).

Тайм-ауты на наборах IP

Таймауты в наборах IP могут быть установлены по умолчанию для каждого набора, а также для каждой записи. Это очень полезно для сценариев, в которых вы хотите временно заблокировать кого-либо (например, для сканирования портов или попытки перебора вашего SSH-сервера).

Это работает следующим образом (по умолчанию при создании наборов IP):

create ssh_loggedon4 hash:ip  family inet  timeout 5400
create ssh_loggedon6 hash:ip  family inet6 timeout 5400
create ssh_dynblock4 hash:ip  family inet  timeout 1800
create ssh_dynblock6 hash:ip  family inet6 timeout 1800

Мы вернемся к этим конкретным наборам ниже и обоснованию того, почему они установлены так, как они есть.

Если вы хотите установить тайм-аут для определенного IP-адреса, вы можете просто сказать:

add ssh_dynblock4 1.2.3.4 timeout 7200

Блокировать IP 1.2.3.4 на два часа вместо (установить) полчаса по умолчанию.

Если вы посмотрите на это ipset save ssh_dynblock4через некоторое время, вы увидите что-то вроде:

create ssh_dynblock4 hash:ip family inet hashsize 1024 maxelem 65536 timeout 1800
add ssh_dynblock4 1.2.3.4 timeout 6954

Тайм-аут предостережения

  • таймауты - это особенность любого набора. Если набор не был создан с поддержкой тайм-аута, вы получите ошибку (например Kernel error received: Unknown error -1).
  • Тайм-ауты даны в секундах. Например, используйте арифметические выражения Bash, чтобы получать от минут до секунд. Например:sudo ipset add ssh_dynblock4 1.2.3.4 timeout $((120*60))

Проверка, существует ли запись в данном наборе IP

Внутри ваших скриптов может быть полезно посмотреть, существует ли уже запись. Это может быть достигнуто с помощью ipset testкоторого возвращает ноль, если запись существует, и ненулевое в противном случае. Таким образом, обычные проверки могут быть применены в сценарии:

if ipset test dns4 8.8.8.8; then
  echo "Google DNS is in the set"
fi

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

Заполнение наборов IP из iptablesправил

Это, на мой взгляд, одна из самых страшных особенностей IP-комплектов. Вы можете не только сопоставлять записи набора IP, но также добавлять новые записи в существующий набор IP.

Например, в этом ответе на этот вопрос у вас есть:

-A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --update --seconds 15 -j DROP
-A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --set -j ACCEPT

... с целью ограничения скорости попыток подключения к SSH (TCP-порт 22). Используемый модуль recentотслеживает последние попытки подключения. Однако вместо stateмодуля я предпочитаю conntrackмодуль.

# Say on your input chain of the filter table you have
   -A INPUT -i eth+ -p tcp --dport ssh -j SSH
# Then inside the SSH chain you can
# 1. create an entry in the recent list on new connections
   -A SSH -m conntrack --ctstate NEW -m recent --set --name tarpit
# 2. check whether 3 connection attempts were made within 2 minutes
#    and if so add or update an entry in the ssh_dynblock4 IP set
-4 -A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock4 src --exist
-6 -A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock6 src --exist
# 3. last but not least reject the packets if the source IP is in our
#    IP set
-4 -A SSH -m set --match-set ssh_dynblock4 src -j REJECT
-6 -A SSH -m set --match-set ssh_dynblock6 src -j REJECT

В этом случае я перенаправляю поток в SSHцепочку так, что мне не нужно повторяться -p tcp --dport sshдля каждого отдельного правила.

Чтобы повторить:

  • -m setделает в iptablesкурсе , что мы используем переключатели из setмодуля (который обрабатывает IP - наборы)
  • --match-set ssh_dynblock4 srcговорит, iptablesчтобы сопоставить адрес источника ( src) с именованным набором ( ssh_dynblock4)
    • это соответствует sudo ipset test ssh_dynblock4 $IP(где $IPсодержит IP-адрес источника для пакета)
  • -j SET --add-set ssh_dynblock4 src --existдобавляет или обновляет адрес источника ( src) из пакета в набор IP ssh_dynblock4. Если запись существует ( --exist), она будет просто обновлена.
    • это соответствует sudo ipset -exist add ssh_dynblock4 $IP(где $IPсодержит IP-адрес источника для пакета)

Если вы хотите сопоставить адрес назначения / цели вместо этого, вы бы использовали dstвместо src. Консультируйтесь с руководством для большего количества вариантов.

Наборы наборов

Наборы IP могут содержать другие наборы. Теперь, если вы проследовали до этой статьи, вы бы удивились, можно ли комбинировать наборы. И конечно это так. Для наборов IP сверху мы можем создать два совместных набора ssh_dynblockи ssh_loggedonсоответственно содержать наборы только для IPv4 и IPv6:

create ssh_loggedon4 hash:ip  family inet  timeout 5400
create ssh_loggedon6 hash:ip  family inet6 timeout 5400
create ssh_dynblock4 hash:ip  family inet  timeout 1800
create ssh_dynblock6 hash:ip  family inet6 timeout 1800
# Sets of sets
create ssh_loggedon  list:set
create ssh_dynblock  list:set
# Populate the sets of sets
add ssh_loggedon ssh_loggedon4
add ssh_loggedon ssh_loggedon6
add ssh_dynblock ssh_dynblock4
add ssh_dynblock ssh_dynblock6

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

И ответ на это звучит громко: ДА! (увы, это не было задокументировано явно в прошлый раз, когда я проверял)

Следовательно, правила из предыдущего раздела можно переписать так:

-A INPUT -i eth+ -p tcp --dport ssh -j SSH
-A SSH -m conntrack --ctstate NEW -m recent --set --name tarpit
-A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock src --exist
-A SSH -m set --match-set ssh_dynblock src -j REJECT

что намного лаконичнее. И да, это проверено и работает, как шарм.

Собираем все вместе: SSH перебор

На моих серверах у меня есть сценарий, выполняемый как cronзадание, которое принимает несколько имен хостов и разрешает их в IP-адреса, а затем передает их в набор IP для «доверенных хостов». Идея состоит в том, что доверенные хосты получают больше попыток войти на сервер и не обязательно блокируются так долго, как кто-либо еще.

Наоборот, у меня есть целые страны, заблокированные от подключения к моему SSH-серверу, с (потенциальным) исключением доверенных хостов (т. Е. Порядок правил имеет значение).

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

Важно помнить время ожидания по умолчанию: 90 минут ssh_loggedonи 30 минут для ssh_dynblockследующих iptablesправил:

-A INPUT -i eth+ -p tcp --dport ssh -j SSH
-A SSH -m set --match-set ssh_loggedon src -j ACCEPT
-A SSH -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A SSH -m conntrack --ctstate NEW -m recent --set --name tarpit
-A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock src --exist
-A SSH -m set --match-set ssh_dynblock src -j REJECT

Теперь вы должны спросить себя, как подключающийся IP-адрес попадает в ssh_loggedonподмножества. Так что читайте дальше ...

Бонус: добавление IP-адреса, с которым вы входите при входе по SSH

Если вы экспериментировали с sshrcдрузьями и знакомыми, вы узнали о его недостатках. Но PAM приходит на помощь. Модуль с именем pam_exec.soпозволяет нам вызывать скрипт во время входа в SSH в точке, где мы знаем, что пользователь допущен в.

В /etc/pam.d/sshdниже pam_envи pam_selinuxзаписи добавьте следующую строку:

session    optional     pam_exec.so stdout /path/to/your/script

и убедитесь, что ваша версия скрипта ( /path/to/your/scriptвыше) существует и является исполняемой.

PAM использует переменные среды для передачи информации о происходящем, поэтому вы можете использовать простой скрипт, подобный следующему:

#!/bin/bash
# When called via pam_exec.so ...
SETNAME=ssh_loggedon
if [[ "$PAM_TYPE" == "open_session" ]] && [[ -n "$PAM_RHOST" ]]; then
    [[ "x$PAM_RHOST" != "x${PAM_RHOST//:/}" ]] && SETNAME="${SETNAME}6" || SETNAME="${SETNAME}4"
    ipset -exist add $SETNAME "$PAM_RHOST"
fi

К сожалению, ipsetутилита, похоже, не имеет встроенных умений netfilter. Таким образом, мы должны различать IPv4 и IPv6, установленные при добавлении нашей записи. В противном случае ipsetпредположим, что мы хотим добавить другой набор к набору наборов вместо IP. И, конечно, вряд ли найдется набор, названный в честь IP :)

Поэтому мы проверяем :IP-адрес и добавляем 6имя набора в таком случае и в 4противном случае.

Конец.

оборота 0xC0000022L
источник
2

Другим графическим интерфейсом, который можно использовать для настройки iptables, является Firewall Builder . Это позволяет пользователям создавать элементы правил как объекты в базе данных, а затем перетаскивать эти объекты в редактор правил для создания требуемой политики брандмауэра. Затем приложение генерирует файл сценария со всеми командами iptables, необходимыми для реализации правил.

В отличие от некоторых других решений с графическим интерфейсом iptables, где вы можете одновременно управлять только одной конфигурацией iptables, с помощью Firewall Builder вы можете управлять большим количеством конфигураций iptables из одного приложения. Firewall Builder работает на Linux, Windows и Mac OS X, существует уже более 10 лет и имеет тысячи активных пользователей по всему миру.

Полное раскрытие информации. Я являюсь соучредителем NetCitadel, которая разрабатывает Firewall Builder.

Майк Х.
источник
1

войти в исходящее соединение с UID

iptables -A OUTPUT -m state --state NEW -m tcp -p tcp -m limit --limit 5/m -j LOG --log-uid --log-prefix="outgoing connection: "

переадресация портов / соединений:

iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 80 -j DNAT --to 10.0.1.7:80
iptables -A INPUT -p tcp -m state --state NEW --dport 80 -i eth1 -j ACCEPT
kofemann
источник
1
Я предпочитаю NFLOGцель. Это позволяет использовать более длинный префикс строки, и демон пользовательского режима также может регистрироваться в базах данных.
0xC0000022L
1

Сопоставить несколько имен интерфейсов с подстановочным знаком

Пример: у вас есть eth0 и eth1 и хотели бы, чтобы трафик между ними?

iptables -A FORWARD -i eth+ -o eth+ -j ACCEPT

Я использовал это в прошлом, чтобы соответствовать veth<something>интерфейсам, динамически созданным и названным LXC. Таким образом, я могу сопоставить все сразу с veth+.

Я также намеренно назвал некоторые интерфейсы _<something>для сравнения _+.

0xC0000022L
источник
1

Блокировать необычные значения MSS

iptables -t mangle -A PREROUTING -p tcp \
-m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP

Цель SYNPROXY для защиты от DDos

Цель этой цели - проверить, устанавливает ли хост, отправивший пакет SYN, соединение или ничего не предпринимает после инициирования соединения SYN. Если он ничего не делает, он отбрасывает пакет с минимальными усилиями.

Установить синхронизирующие пакеты для таблицы отслеживания соединений в необработанной таблице

iptables -t raw -A PREROUTING -p tcp -m tcp --dport 80 --syn -j CT --notrack

Включить synproxy для http-сервера:

iptables -A INPUT -p tcp -m tcp --dport 80 -m conntrack --ctstate INVALID,UNTRACKED \
-j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460

Ресурс: SYNPROXY target из блога RHEL

беглец
источник
1

Ограничение всех отдельных IP-адресов квотой исходящей полосы пропускания с помощью наборов IP-адресов.

Вы можете настроить свой сервер таким образом, чтобы разрешать каждому отдельному IP-адресу 15 ГБ использования полосы пропускания в месяц в надежде отразить или избежать атаки на использование полосы пропускания, возможно, для вашей квоты измеренной полосы пропускания у вашего интернет-провайдера. Это может быть достигнуто следующим образом:

Сначала создайте наборы IP для IPv4 и IPv6:

ipset create IP_QUOTA_SET_OUT hash:ip timeout 345600 counters
ipset create IP_QUOTA_SET_OUT_INET6 hash:ip timeout 345600 counters family inet6

Теперь добавьте свои правила iptables. Первая строка добавит IP к набору, если его там еще нет. Вторая строка не будет совпадать, если количество байтов, переданных для IP в наборе, больше указанного количества. Затем то же самое делается для IPv6.

iptables -I OUTPUT -m set ! --match-set IP_QUOTA_SET_OUT dst -j SET --add-set IP_QUOTA_SET_OUT dst --timeout 345600
iptables -I OUTPUT -m set --match-set IP_QUOTA_SET_OUT dst --bytes-gt 16106127360 -j DROP

ip6tables -I OUTPUT -m set ! --match-set IP_QUOTA_SET_OUT_INET6 src -j SET --add-set IP_QUOTA_SET_OUT_INET6 src --timeout 345600
ip6tables -I OUTPUT -m set --match-set IP_QUOTA_SET_OUT_INET6 src --bytes-gt 16106127360 -j DROP

Это предотвратит такие атаки, как пользователь, запрашивающий большой файл у вашего веб-сервера в течение длительного периода времени или у какой-либо службы в этом отношении. То же самое можно сделать для цепочки INPUT.

infinmed
источник
0

Что-то, что я делаю, в основном из-за того, что я не знаю более элегантного решения, - это вручную проверять мои журналы Nginx каждые 4 часа, а почтовый сервер - каждые 2 минуты для чрезмерного доступа по отдельным IP-адресам. Я запускаю несколько сценариев вместе, которые:

  1. Проверьте access.logи перечислите 10 лучших IP-адресов, упорядоченных по количеству обращений к серверу.
  2. Дамп результатов в файл журнала
  3. Попросите другой скрипт просмотреть этот файл журнала и заблокировать любой IP-адрес, который попадал на сервер более X раз за последние X часов.
  4. Сохрани мой iptables.save

Вот как это выглядит:

autoBanIPs_mail.sh
#!/bin/bash

# This script checks the last 2 minutes of log entries to see if any 
# IP has made over 99 connections

now=$(date +"%m_%d_%Y")

/root/bin/checkBadIPs_mail.sh > /home/ipChecker/ipcheckMAIL_$now.txt
cat /home/ipChecker/ipcheckMAIL_$now.txt | \
    grep " \\(\\([9][9]\\)\\|\\([0-9][0-9][0-9]\\+\\)\\) " | \
    awk '{print $2}' > /home/ipChecker/badMailIPs_$now.sh
sed -i "s/^/\/usr\/local\/sbin\/blockIP /g" /home/ipChecker/badMailIPs_$now.sh
/bin/bash /home/ipChecker/badMailIPs_$now.sh
cat /home/ipChecker/ipcheckMAIL_$now.txt >> /home/ipChecker/ipcheckMAIL_$now.log
rm /home/ipChecker/ipcheckMAIL_$now.txt
rm /home/ipChecker/badMailIPs_$now.sh
checkBadIPs_mail.sh

Одна вещь, которую ОЧЕНЬ важно отметить здесь, это то, что вам НУЖНО настроить белый список, или вы собираетесь начать блокировку большого количества аутентичных IP-адресов с серверов, с которых вы просто получаете много писем, или, в случае других журналов, IP-адреса, которые просто поразите ваш сервер по законным причинам. Мой белый список только что встроен в этот скрипт путем добавления grep pipe сразу после | grep ']' | что-то вроде этого "grep -v 127.0 |" ,
Вам нужно время, чтобы научить свой сервер, какие IP-адреса с высоким трафиком являются законными, а какие нет. Для меня это означало, что мне приходилось тратить первую неделю или около того, проверяя свои логи вручную каждые несколько часов, просматривая ip-ы с высоким трафиком на iplocation.net, а затем добавляя легальные, такие как amazon, box.com или даже мой дом / офис IP относится к этому белому списку. Если вы этого не сделаете, вы, вероятно, будете заблокированы с вашего собственного сервера, или вы собираетесь начать блокировать законные почтовые / веб-серверы и вызвать перебои в работе электронной почты или трафика.

cat /var/log/mail.log | awk \
    -v d1="$(date --date="-2 min" "+%b %_d %H:%M")" \
    -v d2="$(date "+%b %_d %H:%M")" \
    '$0 > d1 && $0 < d2 || $0 ~ d2' | \
    grep '\[' | grep '\]' | \
    grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -v 127.0 | \
    awk '{print $1}' | sort | uniq -c | sort -n | tail -10
Blockip
#!/bin/bash
sudo iptables -I INPUT -s $1 -j DROP
sudo bash -c "iptables-save > /etc/network/iptables.save"

Опять же, я знаю, что это чертовски грубо, и, вероятно, есть хороший чистый эффективный протокол, который делает все это, но я не знал об этом, и эта штука идет уже год или два и удерживает плохих парней в страхе. Одна вещь, которую я бы СЕРЬЕЗНО рекомендовал, - это то, что у вас есть прокси или другой сервер, который вы можете использовать для доступа к своему главному серверу. Причина в том, что если вы занимаетесь веб-разработкой однажды на ровном месте, и вы Пингуйте себя 2000 раз за 5 часов для тестирования, которое вы можете заблокировать, не возвращаясь, кроме прокси.

Вы можете видеть, что checkBadIPs.shя поместил grep -v 127.0 и в моих реальных файлах у меня есть тонна правил игнорирования для моих собственных IP-адресов и других диапазонов доверенных IP-адресов, но иногда ваши IP-адреса меняются, вы забываете обновить и затем блокируетесь. вне вашего собственного сервера.

В любом случае, надеюсь, это поможет.

ОБНОВИТЬ

Я немного изменил ситуацию, так что теперь вместо проверки каждые пару часов я проверяю некоторые журналы каждые 2 минуты, в основном мой журнал аутентификации ssh и почтовый журнал, когда они набирались :(.

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

#!/bin/bash

log=$1 time=$2

cat /var/log/${log} | awk \
    -v d1="$(date --date="-${time} min" "+%b %_d %H:%M")" \
    -v d2="$(date "+%b %_d %H:%M")" \
    '$0 > d1 && $0 < d2 || $0 ~ d2' | \
    grep '\[' | grep '\]' | \
    grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | \
    sort | uniq -c | sort -n | tail -10

При запуске требуется 2 входа: файл журнала, который вы хотите отсканировать, и то, как далеко назад вы хотите сканировать прошлое.

Поэтому, если бы я хотел проверить mail.log для подсчета ip, скажем, 75 минут в прошлом, я бы запустил:

$ sudo script.sh mail.log 75
Ryan Wiancko
источник
Небольшая попытка
поиска
1
Приятно! Я бы использовал, ipsetа не удлинил цепочку iptables, но идея замечательная, и я думаю, что применю их на своих производственных серверах. Спасибо, что поделился!
pepoluan
2
Я только что прочитал об ipset в первый раз на днях и был очень рад узнать о том, что он делает ... Я немного боюсь его реализовать только потому, что, возможно, вначале испорчу его и выключу сервер но это в моем списке вещей, чтобы узнать здесь. При этом моя цепочка iptable, вероятно, состоит из 30-40 наименований и получает только 1 новый каждый день или два, поэтому я не слишком переживаю.
unc0nnected
Вы рассматривали fail2ban?
птенцы
0

Я согласен с комментариями по поводу ipsets и флагов tcp, но многое еще упущено:

Используйте xopps-addons geoip match вместо ipsets для списков стран. Регулярно обновляйте данные Geoip (не реже одного раза в месяц). Данные более динамичны, чем список ipset «забей и забудь».

Рассмотрим отслеживание состояния соединения с помощью флагов tcp. Например, tcp RST или ACK имеет смысл только для установленного соединения. SYN имеет смысл только для новых и связанных соединений. SYN для установленного соединения означает, что ваш SYN + ACK был потерян или попытка взлома и должна быть сброшена, поскольку обе стороны соединения не согласны с утверждением.

Хотя ни один из них, SYN + RST и FIN + RST не являются недопустимыми комбинациями, теперь SYN + FIN действует в режиме быстрого открытия TCP (опция 34 TCP), особенно для DNS. Пакеты SYN, даже с быстрым открытием, не должны быть фрагментированы. Я не считаю правила с флагами PSH и URG полезными. Не путайте состояние отслеживания соединения с состоянием TCP: для целей отслеживания устанавливается ответ RST на пакет SYN.

SYNPROXY предназначен для пересылаемых пакетов и ничего не добавляет для локально доставляемых пакетов, кроме поддержки syncookie.

Пакеты с ошибками ICMP всегда будут в связанном состоянии и имеют длину 48: 576, если они действительны. Длина 84: 1280 для IPv6. Все остальные должны игнорироваться. Поскольку их максимальный размер также является минимальным MTU, они никогда не должны быть фрагментированы. ICMP-запросы (пинги, временные метки и т. Д.) Всегда будут новыми и ответы будут установлены. Отбрасывать ICMP-пакеты в других штатах.

Как и в примере с SSH с недавним списком и приемом только последующих пакетов SYN, то же самое должно быть сделано для SMTP и аналогично «серому списку» только для данных IP-адреса.

В таблице фильтров первое (или второе, если принимает сначала пакеты с установленным состоянием) правило во входных и выходных цепочках должно принимать все в интерфейсе обратной связи. Вы должны доверять своим собственным внутренним пакетам. Если вы не можете, у вас есть большие проблемы, кроме решения брандмауэра.

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

Mr.X
источник
-2
#!/bin/bash
# The following iptables/ip6tables configurations have
# been kindly shared with us from ArckWiki. There are
# a few additions apart from what has been defined.
#
#=================Flush current definitions==============
    iptables -F
    ip6tables -F
    iptables -X
    ip6tables -X

#
#=================Chains=================================
#
#----Define chains for opened ports
    iptables -N TCP
    ip6tables -N TCP
    iptables -N UDP
    ip6tables -N UDP

#
#----Setting up the filter table for NAT
#   iptables -N fw-interfaces
#   ip6tables -N fw-interfaces
#   iptables -N fw-open
#   ip6tables -N fw-open

#
#================Default Chain reactions=================
#
#----Default FORWARD reaction
    iptables -P FORWARD DROP
    ip6tables -P FORWARD DROP

#
#----Default OUTPUT reaction
    iptables -P OUTPUT ACCEPT
    ip6tables -P OUTPUT ACCEPT

#
#----Shellshock
    iptables -A INPUT -m string --algo bm --hex-string '|28 29 20 7B|' -j DROP
    ip6tables -A INPUT -m string --algo bm --hex-string '|28 29 20 7B|' -j DROP

#
#----Default INPUT reaction
    iptables -P INPUT DROP
    ip6tables -P INPUT DROP
#
#----Drop spoofing packets
    iptables -A INPUT -i eth0 -s 127.0.0.0/8 -j DROP
    iptables -A INPUT -i wlan0 -s 127.0.0.0/8 -j DROP
    iptables -A INPUT -i wlan1 -s 127.0.0.0/8 -j DROP
    iptables -A INPUT -s 10.0.0.0/8 -j DROP
    iptables -A INPUT -s 169.254.0.0/16 -j DROP
    iptables -A INPUT -s 172.16.0.0/12 -j DROP
    iptables -A INPUT -s 224.0.0.0/4 -j DROP
    iptables -A INPUT -d 224.0.0.0/4 -j DROP
    iptables -A INPUT -s 240.0.0.0/5 -j DROP
    iptables -A INPUT -d 240.0.0.0/5 -j DROP
    iptables -A INPUT -s 0.0.0.0/8 -j DROP
    iptables -A INPUT -d 0.0.0.0/8 -j DROP
    iptables -A INPUT -d 239.255.255.0/24 -j DROP
    iptables -A INPUT -d 255.255.255.255 -j DROP

#
#================Ping rate limiting globally=============
    iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 30/min --limit-burst 8 -j ACCEPT
    ip6tables -A INPUT -p icmpv6 --icmpv6-type 8 --match limit --limit-burst 8 -j ACCEPT
    iptables -A INPUT -p icmp --icmp-type 8 -j DROP
    ip6tables -A INPUT -p icmpv6 --icmpv6-type 8 -j DROP

#
#----flooding RST packets, smurf attack Rejection
    iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT
    ip6tables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT

#
#----Bogus packet DROP
    iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
    ip6tables -A INPUT -p tcp -m tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
    iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
    ip6tables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP

#
#================RELATED,ESTABLISHED reaction============
    iptables -A INPUT --match conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    ip6tables -A INPUT --match conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

#
#================unfetered loopback======================
    iptables -A INPUT -i lo -j ACCEPT
    ip6tables -A INPUT -i lo -j ACCEPT

#
#================INVALID catagory of packets=============
    iptables -A INPUT -p 41 -j ACCEPT
    iptables -A INPUT --match conntrack --ctstate INVALID -j DROP
    ip6tables -A INPUT --match conntrack --ctstate INVALID -j DROP

#
#================IPv6 reactions and definitions==========
    ip6tables -A INPUT -s fe80::/10 -p icmpv6 -j ACCEPT
    ip6tables -t raw -A PREROUTING -p icmpv6 -s fe80::/10 -j ACCEPT
    ip6tables -t raw -A PREROUTING --match rpfilter -j ACCEPT
    ip6tables -t raw -A PREROUTING -j DROP
#
#=======Acceptable INVALIDs and a curteous response======
    iptables -A INPUT -p udp --match conntrack --ctstate NEW -j UDP
    ip6tables -A INPUT -p udp --match conntrack --ctstate NEW -j UDP
    iptables -A INPUT -p tcp --syn --match conntrack --ctstate NEW -j TCP
    ip6tables -A INPUT -p tcp --syn --match conntrack --ctstate NEW -j TCP

#
#================Defining the TCP and UDP chains
#
#########################################################
#            Notes for port open definitions            #
# It is important to note that this should be config-   #
# ured differently if you're providing any routing      #
# activity for any purpose. it is up to you to actively #
# define what suites your needs to get the job done.    #
# In this example, I'm exempting IPv6 from being able   #
# to interact with SSH protocols for two reasons. The   #
# first is because it is generally easier and more com- #
# for internal networks to be deployed with IPv4. The   #
# second reason is, IPv6 can be deployed globally.      #
#########################################################
#
#----SSH configured for eth0
    iptables -A TCP -i eth0 -p tcp --dport ssh -j ACCEPT

#!---Blocking SSH interactions in IPv6
    ip6tables -A TCP -p tcp --dport ssh -j DROP

#!---Leave commented for end service device
#   iptables -A TCP -p tcp --dport 80 -j ACCEPT
#   ip6tables -A TCP -p tcp --dport 80 -j ACCEPT
#   iptables -A TCP -p tcp --dport 443 -j ACCEPT
#   ip6tables -A TCP -p tcp --dport 443 -j ACCEPT
#
#!---Uncomment for remote service to this device
#   iptables -A TCP -p tcp --dport 22 -j ACCEPT
#   ip6tables -A TCP -p tcp --dport 22 -j ACCEPT
#
#!---Uncomment if you're providing routing services
#   iptables -A UDP -p udp 53 -j ACCEPT
#   ip6tables -A UDP -p udp 53 -j ACCEPT
#
#=================Tricking port scanners=================
#
#----SYN scans
    iptables -I TCP -p tcp --match recent --update --seconds 60 --name TCP-PORTSCAN -j DROP
    ip6tables -I TCP -p tcp --match recent --update --seconds 60 --name TCP-PORTSCAN -j DROP
    iptables -A INPUT -p tcp --match recent --set --name TCP-PORTSCAN -j DROP
    ip6tables -A INPUT -p tcp --match recent --set --name TCP-PORTSCAN -j DROP

#
#----UDP scans
    iptables -I UDP -p udp --match recent --update --seconds 60 --name UDP-PORTSCAN -j DROP
    ip6tables -I UDP -p udp --match recent --update --seconds 60 --name UDP-PORTSCAN -j DROP
    iptables -A INPUT -p udp --match recent --set --name UDP-PORTSCAN -j DROP
    ip6tables -A INPUT -p udp --match recent --set --name UDP-PORTSCAN -j DROP

#
#----For SMURF attack protection
    iptables -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP
    iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP
    iptables -A INPUT -p icmp -m limit --limit 2/second --limit-burst 2 -j ACCEPT
    ip6tables -A INPUT -p icmpv6 -m limit --limit 2/second --limit-burst 2 -j ACCEPT

#
#----Ending all other undefined connections
    iptables -A INPUT -j DROP
    ip6tables -A INPUT -j DROP

#
#=======Defining the IN_SSH chain for bruteforce of SSH==
#
#!---I've elected to keep IPv6 out of this realm for
#!---ease of use
    iptables -N IN_SSH
    iptables -A INPUT -p tcp --dport ssh --match conntrack --ctstate NEW -j IN_SSH
    iptables -A IN_SSH --match recent --name sshbf --rttl --rcheck --hitcount 3 --seconds 10 -j DROP
    iptables -A IN_SSH --match recent --name sshbf --rttl --rcheck --hitcount 4 --seconds 1800 -j DROP
    iptables -A IN_SSH --match recent --name sshbf --set -j ACCEPT
    iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -j IN_SSH

#
#==================Setting up a NAT gateway==============
#
#########################################################
#                                                       #
# I commented this half out because it's not something  #
# that will apply to all setups. Make note of all par-  #
# tinate interfaces and what exactly is going on.       #
#                                                       #
#########################################################
#
#----Setting up the FORWARD chain
#   iptables -A FORWARD --match conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
#   ip6tables -A FORWARD --match conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
#
#
#----Defining the fw-interfaces/open chains for FORWARD
#   iptables -A FORWARD -j fw-interfaces
#   ip6tables -A FORWARD -j fw-interfaces
#   iptables -A FORWARD -j fw-open
#   ip6tables -A FORWARD -j fw-open
#   iptables -A FORWARD -j DROP # Should be REJECT. But, fuck them
#   ip6tables -A FORWARD -j DROP
#   iptables -P FORWARD DROP
#   ip6tables -P FORWARD DROP
#
#
#----Setting up the nat table
#   iptables -A fw-interfaces -i ### -j ACCEPT
#   ip6tables -A fw-interfaces -i ### -j ACCEPT
#   iptables -t nat -A POSTROUTING -s w.x.y.z/S -o ppp0 -j MASQUERADE
#   ip6tables -t nat -A POSTROUTING -s fe::/10 -o ppp0 -j MASQUERADE
#----The above lines should be repeated specifically for EACH interface
#
#----Setting up the PREROUTING chain
#
#######################################################
#                             #
# The PREROUTING chain will redirect either port      #
# targets to be redirected. This can also redirect    #
# traffic inbound to your network from the gateway    #
# to this machine. This can be useful if you're using #
# a honeypot or have any service within your network  #
# that you want to be pointed to a specific device.   #
#                             #
#######################################################
#
#----SSH honeypot server
#   iptables -A fw-open -d HONEYPOT_IP -p tcp --dport 22 -j ACCEPT
#   ip6tables -A fw-open -d HONEYPOT_IP -p tcp --dport 22 -j ACCEPT
#----With intuition, you can configure the above to also direct specific
#----requests to other devices providing those services. The bellow will
#----be for a squid server
#   iptables -A fw-open -d SQUID_IP -p tcp --dport 80 -j ACCEPT
#   ip6tables -A fw-open -d SQUID_IP -p tcp --dport 80 -j ACCEPT
#   iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 8000 -j DNAT --to SQUID_IP
#   ip6tables -t nat -A PREROUTING -i ppp0 -p tcp --dport 8000 -j DNAT --to SQUID_IP
#
#===============Declare configurations=================
    iptables -nvL
    ip6tables -nvL
Miphix
источник
1
Со всеми этими криками я не могу понять сообщение вашего поста.
Охотник на оленей