Рубрики
network \ сеть

Сеть / Network / netstat / ip / ss / ifconfig / iwconfig / nmap / ping / route / iptables

netstat / ss / lsof

netstat -nlp             - Для просмотра списка сетевых сервисов, слушающих какие-либо порты
netstat -nlp|grep udp    - Для просмотра списка сетевых сервисов, слушающих какие-либо порты
iptables -L -n -v        - проверка фаервола 
iptables -L		 - посмотреть таблицы iptables
route -n                 - посмотреть таблицу маршрутизации и gateway
ifconfig -a              - посмотреть сетевушки
ifconfig eth0            - посмотреть сетевушку eth0
cat /etc/resolv.conf     - посмотреть dns 

ss -s - общая информация о соединениях
ss -l - информация об ожидающих соединений сокетах
ss -lp - информация об ожидающих соединений сокетах, а также именах процессов, их использующих
ss -at - информация обо всех задействованных TCP сокетах
ss -au - информация обо всех задействованных UDP сокетах
ss -o state established '( dport = :smtp or sport = :smtp )' - информация обо всех установленных SMTP-соединениях
ss -o state established '( dport = :http or sport = :http )' - информация обо всех установленных HTTP-соединениях
ss -x src /tmp/.X11-unix/* - локальные процессы, подключённые к X-серверу
ss -tulpan - показать все

lsof -i udp информация кто использует UDP 
lsof -i :22 информация кто использует 22 порт

сеть

sudo ethtool -s eth0 speed 100 duplex full autoneg off# Принудительно задать скорость сетевому интерфейсу 100Mbit и режим Full Duplex и отключить автоматическое определение
sudo ethtool -s eth0 speed 10 duplex half autoneg off# Принудительно задать скорость сетевому интерфейсу 10Mbit и режим Half Duplex и отключить автоматическое определение
arping -v -i eth0  макадресс -
nmap -PR сеть/маска
nmap cb.vu               # Сканировать все зарезервированные порты хоста
nmap -sP 192.168.16.0/24 # Выяснить какой IP каким хостом используется в сети 0/24
nmap -sS -sV -O cb.vu    # Провести stealth SYN сканирование с определением типа и версии OS
tcpdump -npi iface_name ether src MAC-address  узнать MAC устройства iface_name -имя интерфейса MAC-address -мак адрес устройства
arp -a показать таблицу arp (арп) 
ping 192.168.3.1
traceroute ya.ru  -показать маршрут
route -N  -посмотреть маршруты ip
ifconfig eth0 inet 192.168.10.15 netmask 255.255.255.0
ifconfig eth0 up
ifconfig eth0 192.168.0.1 netmask 255.255.255.0

Сеть отладка

 
ethtool eth0                            # Показать Ethernet статус 
ethtool -s eth0 speed 100 duplex full   # Принудительная установка режима 100Mbit Full duplex
ethtool -s eth0 autoneg off             # Отключить авто определение
ethtool -p eth1                         # Мигать индикатором сетевой карты - если поддерживается
ip link show                            # Список сетевых интерфейсов в Linux (подобна ifconfig)
ip link set eth0 up                     # Активировать сетевое устройство (или отключить). Подобна "ifconfig eth0 up"
ip addr show                            # Список всех IP адресов в Linux (подобна ifconfig)
ip neigh show                           # Тоже что и arp -a
ip route get to 8.8.8.8

Показать адреса:
ip a
ip -o -6 a 
ip -o -4 a 
ip -o a show ovsbr0
ip -o a show eth0

Маршрутизация

 
Печать таблицы маршрутизации
route -n                  # Linux или используйте "ip route"
netstat -rn               # Linux, BSD и UNIX

Узнаем какой маршрут будет использован для ip 8.8.8.8
ip route get to 8.8.8.8

Добавление и удаление маршрута

 
route add -net 192.168.20.0 netmask 255.255.255.0 gw 192.168.16.254
ip route add 192.168.20.0/24 via 192.168.16.254       # Как и выше с ip маршрутом
route add -net 192.168.20.0 netmask 255.255.255.0 dev eth0
route add default gw 192.168.51.254
ip route add default via 192.168.51.254 dev eth0      # Как и выше с ip маршрутом
route delete -net 192.168.20.0 netmask 255.255.255.0

Настройка дополнительных IP адресов

 
ifconfig eth0 192.168.50.254 netmask 255.255.255.0       # Первый IP адрес
ifconfig eth0:0 192.168.51.254 netmask 255.255.255.0     # Второй IP адрес
ip addr add 192.168.50.254/24 dev eth0                   # Эквивалентные команды для ip
ip addr add 192.168.51.254/24 dev eth0 label eth0:1

Смена MAC адреса

 
Для начала вы должны деактивировать сетевой интерфейс.. и не говорите никому для чего вы хотите сменить MAC...)
ifconfig eth0 down
ifconfig eth0 hw ether 00:01:02:03:04:05      # Linux
ifconfig eth0 up

wi-fi / iwconfig / iw

ip link set wlp2s0 up - включить устройство wlp2s0 
!!! Если у вас возникнет ошибка:
!!! RTNETLINK answers: Operation not possible due to RF-kill
!!! Можно установить утилиту rfkill и с ее помощью решить эту проблему.

lspci | grep -i wireless - поиск беспроводных pci-карт
ip link list - выводе этой команды будет содержать все сетевые интерфейсы
iw dev - показать устройства wi-fi

iwconfig wlan0 essid "MyNet" - присвоить SSID "MyNet"
iwconfig wlan0 channel 3 - установит канал 3
iwconfig wlan0 mode Ad-Hoc - сменить режим Managed на Ad-Hoc
iwconfig wlan0 ap any - использовать любую точку доступа
iwconfig wlan0 sens -50 - установить чувствительность -50
iwconfig wlan0 retry 20 - установить значение 20 для повторной передачи MAC
ifconfig wlan0 key 1234-pass-123 - установить пароль 1234-pass-123
iwconfig wlp4s0 mode ad-hoc - настройка режима работы ad-hoc
iwconfig wlp4s0 essid ваш_essid - подключение к незащищенной сети
iwconfig wlp4s0 essid ваш_essid freq 2432M - подключение с задающим каналом сети
iwconfig wlp4s0 essid ваш_essid key s:ваш_ключ -подключение к WEP зашифрованному каналу сети, ключа ASCII
iwconfig wlp4s0 power on - включение режима экономии питания

iw dev wlp4s0 link iwconfig wlp4s0 - показать статус соединения
iw dev wlp4s0 scan iwlist wlp4s0 scan -сканирование сети на точки доступа
iw dev wlp4s0 set type ibss  - настройка режима работы ad-hoc
iw dev wlp4s0 connect ваш_essid - подключение к незащищенной сети
iw dev wlp4s0 connect ваш_essid 2432 - подключение с задающим каналом сети
iw dev wlp4s0 connect ваш_essid key 0:ваш_ключ -  -подключение к WEP зашифрованному каналу сети, ключа ASCII
iw dev wlp4s0 set power_save on - включение режима экономии питания
iw dev wlp4s0 scan | less - сканируем сеть

Список открытых портов:

 
netstat -an | grep LISTEN
lsof -i                                 # Ссписок всех интернет подключений Linux
socklist                                # Список открытых сокетов Linux
sockstat -4                             # Список приложений слушающих сокеты
netstat -anp --udp --tcp | grep LISTEN  # Linux
netstat -tup                            # Список активных подключений входящие/исходящие Linux
netstat -tupl                           # Список слушающих портов Linux

firewall

 
Проверить, запущен-ли фаервол (как правило в типичных конфигурациях)
iptables -L -n -v                  # Статус
Открыть iptables firewall
iptables -P INPUT       ACCEPT     # Открыть все
iptables -P FORWARD     ACCEPT
iptables -P OUTPUT      ACCEPT
iptables -Z                        # Сбросить счетчики во всех цепочках
iptables -F                        # Сбросить все цепочки
iptables -X                        # Удалить все цепочки

Forward route (Форвардинг маршрутов)

 
Проверить и если нужно, включить форвардинг маршрутов
cat /proc/sys/net/ipv4/ip_forward  # Проверить включен или нет форвардинг, 0=off, 1=on
echo 1 > /proc/sys/net/ipv4/ip_forward 

# или добавьте в /etc/sysctl.conf:
net.ipv4.ip_forward = 1

NAT Трансляция сетевых адресов

 
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE	# Включить NAT
iptables -t nat -A PREROUTING -p tcp -d 78.31.70.238 --dport 20022 -j DNAT --to 192.168.16.44:22           # Перебросить порт 20022 на внутренний IP порт ssh
iptables -t nat -A PREROUTING -p tcp -d 78.31.70.238 --dport 993:995 -j DNAT --to 192.168.16.254:993-995     # Переброс портов из диапазона 993-995
ip route flush cache
iptables -L -t nat            # Проверить статус NAT

DNS

 
В Unix DNS записи действительны для всех интерфейсов и хранятся в /etc/resolv.conf. 
Зона к которой принадлежит хост, так-же хранится в этом файле. 
Минимальная конфигурация:
nameserver 78.31.70.238
search sleepyowl.net intern.lab
domain sleepyowl.net
Проверить доменное имя:
# hostname -d                        # Что и dnsdomainname
Вы можете очистить DNS кэш, но помните, некоторые приложения используют свой, 
персональный кэш(например Фаерфокс), и на них обнуление не подействует.
# /etc/init.d/nscd restart           # Перезапустить nscd(демон кэширования имен) Linux/BSD/Solaris

Forward queries

 
Dig, утилита для проверки настроек DNS. Например, используем для проверки  публичный DNS server 213.133.105.2 ns.second-ns.de. 
Обратите внимание с какого сервера клиент получит ответ (упрощенный ответ).
# dig sleepyowl.net
sleepyowl.net.          600     IN      A       78.31.70.238
;; SERVER: 192.168.51.254#53(192.168.51.254)

Маршрутизатор 192.168.51.254, прислал в качестве ответа, запись типа А.
Запись определенного типа для запроса и DNS сервер, могут быть указаны с символом @:
# dig MX google.com
# dig @127.0.0.1 NS sun.com          # Проверить локальный сервер
# dig @204.97.212.10 NS MX heise.de  # Запрос к внешнему серверу
# dig AXFR @ns1.xname.org cb.vu      # Получить всю зону (пересылка зоны)

Еще одна полезная утилита, host:
# host -t MX cb.vu                   # Получить записть типа MX(Mail Exchange)
# host -t NS -T sun.com              # Получить NS запись через TCP соединение
# host -a sleepyowl.net              # Получить все
Reverse queries

Узнать имя по IP адресу можно с помощью таких утилит как dig, host или nslookup:

 
dig -x 78.31.70.238
host 78.31.70.238
nslookup 78.31.70.238
cat /etc/hosts

Отдельные хосты могут быть настроены в файле /etc/hosts, вместо запуска named, для разрешения имени в адрес.

 
Формат следующий:
78.31.70.238   sleepyowl.net   sleepyowl
Приоритет между файлом hosts и DNS запросом, может быть сконфигурирован в /etc/nsswitch.conf и /etc/host.conf. 

DHCP

 
Некоторые дистрибутивы (SuSE) используют в качестве клиента dhcpd. Интерфейс по-умолчанию eth0.
dhcpcd -n eth0           # Обновить (не всегда работает)
dhcpcd -k eth0           # Освободить и выключить
"Срок аренды"(lease) и вся информация сохраняется в:
/var/lib/dhcpcd/dhcpcd-eth0.info

Анализ трафика

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

Анализ с помощью tcpdump
tcpdump -nl -i bge0 not port ssh and src \(192.168.16.121 or 192.168.16.54\)
tcpdump -n -i eth1 net 192.168.16.121           # Выборка входящий/исходящий по одному IP адресу
tcpdump -n -i eth1 net 192.168.16.0/24          # Выборка входящий/исходящий по адресу сети
tcpdump -l > dump && tail -f dump               # Вывод через буфер

tcpdump -i rl0 -w traffic.rl0                   # Писать заголовки в бинарный файл
tcpdump -i rl0 -s 0 -w traffic.rl0              # Писать в бинарник полные пакеты
tcpdump -r traffic.rl0                          # Прочитать из файла (так-же для ethereal

tcpdump port 80                                
tcpdump host google.com

tcpdump -i eth0 -X port \(110 or 143\)          # Проверить защищенность pop или imap
tcpdump -n -i eth0 icmp                         # Выборка icmp(ping)

tcpdump -i eth0 -s 0 -A port 80 | grep GET      # -s 0 для полных пакетов, -A для ASCII
Некоторые важные опции:
-A     Печатать текст из пакетов (без заголовков)
-X     Печатать пакеты в hex и ASCII
-l     Включить буферизацию вывода
-D     Показать все активные сетевые интерфейсы

Traffic control (QoS)

 
Traffic control управляет очередностью, порядком, планированием и другими параметрами трафика в сети. 
Следующие примеры, небольшие практические приемы для Linux and FreeBSD 
позволяющие лучше использовать пропускную способность.

Ограничение загрузок(upload)
Для 512kbit Кбитного модема.
tc qdisc add dev eth0 root tbf rate 480kbit latency 50ms burst 1540
tc -s qdisc ls dev eth0                         # Статус
tc qdisc del dev eth0 root                      # Удалить очередь
tc qdisc change dev eth0 root tbf rate 220kbit latency 50ms burst 1540

QoS Quality of service
Приоритет очередей в tc для оптимизации VoIP. Полные примеры можно посмотреть на voip-info.org или http://www.howtoforge.com. 
Следующий пример демонстрирует использование QoS для VoIP трафика.
tc qdisc add dev eth0 root handle 1: prio priomap 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 0
tc qdisc add dev eth0 parent 1:1 handle 10: sfq
tc qdisc add dev eth0 parent 1:2 handle 20: sfq
tc qdisc add dev eth0 parent 1:3 handle 30: sfq
tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dport 10000 0x3C00 flowid 1:1          # Использовать диапазон портов
tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dst 123.23.0.1 flowid 1:1              # или/и использовать IP сервера

Проверить состояние или удалить:
tc -s qdisc ls dev eth0                         # Проверить состояние очереди
tc qdisc del dev eth0 root                      # Удалмть все QoS

NIS (Информационная служба сети)

 
Некоторые команды для конфигурирования NIS клиента:
ypwhich                          # Получить имя подключенного NIS сервера
domainname                       # Доменное имя NIS
ypcat group                      # Показать группу из NIS
cd /var/yp && make               # Пере собрать базу данных yp
pcinfo -p servername             # Отчет RPC служб сервера

Ypbind запущен ?
ps auxww | grep ypbind
/usr/sbin/ypbind -s -m -S servername1,servername2	# FreeBSD
/usr/sbin/ypbind                                        # Linux

yppoll passwd.byname
Map passwd.byname has order number 1190635041. Mon Sep 24 13:57:21 2007
The master server is servername.domain.net.

cat /etc/yp.conf
ypserver servername
domain domain.net broadcast

netcat

 
Netcat (nc), известна так-же как "network Swiss Army Knife", предназначена для манипуляция, создания, 
чтения/записи TCP/IP соединений. Вот несколько полезных примеров, в сети их можно найти массу, например: 
тут или тут. Вместо netcat, можно использовать сокращение nc. 
Так-же можете посмотреть socat.

Передача файлов
Копирование большого файла через TCP соединение. Передача происходит очень быстро 
и не требует поднятия NFS, SMB, FTP и т.д... просто сделайте файл доступным 
на сервере и заберите его с клиента. В данном случае 192.168.1.1, IP адрес сервера.
server# tar -cf - -C VIDEO_TS . | nc -l -p 4444      # Заархивировать директорию и выставить архив на порт 4444
client# nc 192.168.1.1 4444 | tar xpf - -C VIDEO_TS  # забрать файл с порта 4444 и разархивировать в дмректорию

server# cat largefile | nc -l 5678                   # Приготовить к отправке один файл
client# nc 192.168.1.1 5678 > largefile              # Забрать файл

server# dd if=/dev/da0 | nc -l 4444                  # Приготовить к отправке файл образа раздела
client# nc 192.168.1.1 4444 | dd of=/dev/da0         # Забрать файл образа для создания дублеката раздела
client# nc 192.168.1.1 4444 | dd of=da0.img          # или файл образа и сохранить как файл

server  nc -l 5555 < ./test.file            # Файл выставляется в сокет nc с адресом 192.168.1.1, порт 5555
client  nc 192.168.1.1 5555 > ~/test.file   # На другой машине, забираем файл, с 192.168.1.1 порт 5555 

Другие трюки
Тут, вы должны понимать, что вы делаете.
Удаленный shell
Опция -e только для Windows версии или используйте nc 1.10
# nc -lp 4444 -e /bin/bash                        # Предоставить удаленную оболочку
# nc -lp 4444 -e cmd.exe                          # Удаленная оболочка в Windows

Аварийный Веб сервер
Обслуживать один файл на 80 порту в цикле.
# while true; do nc -l -p 80 < unixtoolbox.xhtml; done

Чат
Элис и Боб могут общаться через простой TCP сокет. Текст передается по нажатию Enter.
alice# nc -lp 4444
bob  # nc 192.168.1.1 4444

Включение "ip forward без" перезагрузки:

 
Все это красиво, наверное… Но уж как-то по-советски, как с гландами в том анекдоте….
Все гораздо проще стандартными средствами, без перезагрузок, 
как и положено в Linux – посредством sysctl (в любом дистрибутиве)

В файле /etc/sysctl.conf вставляем следующие строки -
#disable ipv6 settins
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
Сохраняем файл.

3.Применяем: sysctl -p
Вуа-ля! Работаем дальше, и не надо ничего и никого перегружать…

network

 
##настройки интерфейса который получает интернет
allow-hotplug eth0                 - автоматически определить интерфейс
iface eth0 inet static             - статический ип адресс  
	address 192.168.3.112      - адрес интерфейса
	netmask 255.255.255.0      - маска сети
	network 192.168.3.0        - сеть
	broadcast 255.255.255.255  - спрашивает ип
	gateway 192.168.3.1        - сюда стучится за инетом
	dns-nameserves 192.168.3.1 - отсюда берет днс
auto eth0                          - запустить интерфейс
##настройка интерфейса который его раздает
iface eth1 inet static
	address 192.168.15.1
	netmask 255.255.255.0
auto eth1

Основы iptables

 
PACKET IN --->---PREROUTING---[ маршрутизация ]--->----FORWARD---->---POSTROUTING--->--- PACKET OUT
                         - mangle          |              - mangle          - mangle
                         - nat (dst)       |              - filter          - nat (src)
                                           |                                   |
                                           |                                   |
                                         INPUT                              OUTPUT
                                          - mangle                           - mangle
                                          - filter                           - nat (dst)
                                           |                                 - filter
                                           |                                   |
                                           `---->----[   приложение  ]---->----'


iptables [-t table]       command [match] [target/jump]
iptables [-t имя-таблицы] команда [шаблон] [-j действие]
#  0     #####  1  ########   2   #  3   ######  4   #####

#0
Опция -t задает таблицу. Если опция упущена, то по умолчанию предполагается использование таблицы filter. 
Если предполагается использование другой таблицы, то это требуется указать явно.

#1
Mangle - обычно эта цепочка используется для внесения изменений в заголовок пакета, например для изменения битов TOS и пр.
Nat - эта цепочка используется для трансляции сетевых адресов (Destination Network Address Translation). 
Source Network Address Translation выполняется позднее, в другой цепочке. Любого рода фильтрация 
в этой цепочке может производиться только в исключительных случаях.
Filter - здесь производится фильтрация трафика. Помните, что все входящие пакеты, адресованные нам, 
проходят через эту цепочку, независимо от того с какого интерфейса они поступили.

#2
Далее, непосредственно за именем таблицы, должна стоять команда. Если спецификатора таблицы нет, 
то команда всегда должна стоять первой.
Команда определяет действие iptables, например: 
вставить правило, или добавить правило в конец цепочки, или удалить правило и т.п.

Список команд:
-A имя-цепочки правило (добавить правило в конец цепочки; ключ --set-counters позволяет установить счётчики пакетов и байтов)
-I имя-цепочки номер правило (вставить правило в цепочку перед правилом с указанным номером, нумерация с 1; ключ --set-counters позволяет установить счётчики пакетов и байтов)
-R имя-цепочки номер правило (заменить;
ключ --set-counters позволяет установить счётчики пакетов и байтов)
-D имя-цепочки номер (удалить правило с указанным номером, нумерация с 1)
-D имя-цепочки правило (удалить правило по текстуальному совпадению)
-C имя-цепочки пакет (тестировать прохождение пакета;
исходящий адрес, адрес назначения, протокол, интерфейс, порты задаются соответствующими ключами)
-L [имя-цепочки] (показать список правил; дополнительные ключи:
-v (вывести дополнительную информацию, в частности, счётчики)
--exact (показывать счётчики без округления до KB, MB и т.д.)
--numeric (показывать адреса и номера портов в виде чисел)
--line-numbers (выводить номера правил)
-F имя-цепочки (удалить все правила из цепочки)
-Z имя-цепочки (обнулить счетчики)
-N имя-цепочки (создать цепочку)
-X имя-цепочки (удалить пустую цепочку, на которую нет ссылок)
-P имя-цепочки действие (изменить действие по умолчанию: ACCEPT,
DROP, QUEUE, RETURN)
-E старое-имя-цепочки новое-имя-цепочки (переименовать цепочку)

#3
Раздел шаблон задает критерии проверки, по которым определяется подпадает ли пакет под действие этого правила или нет.
Здесь можно указать самые разные критерии - IP-адрес источника пакета или сети, сетевой интерфейс. 
IP-адрес места назначения, порт, протокол и т.д. 
Остальные параметры для фильтации можно посмотреть в справке по утилите iptables(man iptables)

#4
И наконец действие  указывает, какое действие должно быть выполнено при условии выполнения критериев в правиле. 
Здесь можно заставить ядро передать пакет в другую цепочку правил, 
"сбросить" пакет, выдать на источник сообщение об ошибке и т.п.
Список некоторых действий:
ACCEPT - пропустить пакет; просмотр таблицы завершается
DROP - выбросить молча; просмотр завершается не только для текущей цепочки, но и для других таблиц
REJECT - выбросить, известив отправителя (--reject-with тип-извещения)

пример iptables

 

LOCAL_IF="eth0"
INET_IF="eth0:g"

#=======================
# Удалить все правила из цепочки.
#=======================
iptables -F
iptables -X

#=======================
# Устанавливаем политику по умолчанию.
#=======================

iptables -P INPUT    DROP
iptables -P OUTPUT   DROP
iptables -P FORWARD  ACCEPT
#=======================
# Создаем правила для всех интерфейсов.
#=======================

# http - открываем 80 порт
iptables -A INPUT -i ALL -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -i ALL -p icmp -j ACCEPT

#=======================
# Создаем правила для внутреннего интерфейса.
#=======================

# ssh - открываем 22 
iptables -A INPUT -p tcp -i $LOCAL_IF -m tcp --dport 22 -j ACCEPT
осталось запустить скрипт
примеры отдельных цепочек:
Разрешаем все на внутренних интерфейсах (lo, eth0, eth1 - внутренние интрефейсы)
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
 Разрешаем доступ к заданному порту из инета
iptables -A INPUT -p tcp -m tcp -d внешний_ip --dport 80 -j ACCEPT
Открываем протокол
iptables -A INPUT -p gre -j ACCEPT

ip taples nat
скрипт для раздачи интернета сделать испольнительным
для авто запуска можно добавить стрку в /etc/init.d/rc.local : /путь к файлу

 
 #!/bin/sh
        INET="eth1"
        INETIP="X.X.X.X"

        iptables -F INPUT
        iptables -F FORWARD
        iptables -F OUTPUT

        iptables -P INPUT ACCEPT
        iptables -P OUTPUT ACCEPT
        iptables -P FORWARD ACCEPT

        iptables -t nat -A POSTROUTING -o $INET -j SNAT --to-source $INETIP
        echo "1" > /proc/sys/net/ipv4/ip_forward

Сканирование портов

 
Чтобы выявить наличие уязвимых сервисов на машине, атакующий производит разведку 
с помощью сканера портов и различных систем обнаружения уязвимости. 
Обычно в качестве сканера портов используется nmap, который способен осуществлять 
сканирование десятком различных способов и в некоторых случаях умеет выявлять версии ОС и сервисов.
Вот список особенно популярных флагов nmap, которые обычно используют взломщики:

Флаги nmap, используемые при сканировании
-sT — обычное TCP-сканирование с помощью открытия соединения на указанный порт и его завершения; 
-sS — SYN/ACK-сканирование, связь разрывается сразу после ответа на запрос открытия соединения; 
-sU — UDP-сканирование; 
-sF — сканирование пакетами с установленным флагом FIN; 
-sX — сканирование пакетами с установленными флагами FIN, PSH и URG; 
-sN — сканирование пакетами без установленных флагов. 

Начальная настройка iptables

 
outif="eth1"
iptables -F

iptables -i $outif -A INPUT \
-m conntrack \
--ctstate ESTABLISHED,RELATED \
-j ACCEPT

iptables -i $outif -A INPUT -p tcp \
--dport 80 -j ACCEPT

iptables -i $outif -P INPUT DROP
iptables -i $outif -P OUTPUT ACCEPT

Начальная настройка ipfw

 
outif="rl0"
ipfw add allow ip from any to any \
via lo0

ipfw add allow ip from me to any \
via $outif

ipfw add allow tcp from any to me \
established via $outif

ipfw add allow tcp from any 80 \
to me via $outif

ipfw add deny ip from any to any \
via $outif

Начальная настройка pf

 
outif="rl0"
set skip on lo0
block all

pass out on $outif from $outif \
to any keep state

pass in on $outif proto from any \
to $outif port 80

Методы борьбы с экзотическими видами сканирования

 
# Запрет FIN-сканирования
iptables -A INPUT –p tcp \
–m tcp \
–-tcp-flags FIN,ACK FIN -j DROP
FreeBSD> ipfw add reject tcp from any to any \
not established tcpflags fin

# Запрет X-сканирования
iptables -A INPUT –p tcp –m tcp \
--tcp-flags FIN,SYN,RST,PSH,ACK,URG
FIN,SYN,RST,PSH,ACK,URG \
–j DROP

ipfw add reject tcp from any to any \
tcpflags fin, syn, rst, psh, ack, urg

# Запрет N-сканирования
iptables -A INPUT –p tcp –m tcp \
–-tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE –j DROP

ipfw add reject tcp from any to any \
tcpflags !fin, !syn, !rst, !psh, !ack, !urg

В OpenBSD все эти строки можно заменить простой записью в начале
/etc/pf.conf:
scrub in all

Борьба со сканированием с помощью iptables

 
# Проверка на стук в нерабочие порты (10 в час)
iptables -A INPUT -m recent --rcheck \
--seconds 3600 --hitcount 10 --rttl -j RETURN
# Вторая проверка на стук в нерабочие порты (2 в минуту)
iptables -A INPUT -m recent --rcheck \
--seconds 60 --hitcount 2 --rttl -j RETURN
# Заносим адреса стучащихся в список
iptables -A INPUT -m recent --set
# Отбрасываем пакеты всех, кто превысил лимит на
количество подключений
iptables -P INPUT -j DROP

patch-omatic

 
Установив пакет xtables-addons, содержащий наработки проекта patch-omatic,
 мы получим доступ к модулю PSD (Port Scan Detect), реализованному по образу и подобию демона scanlogd. 
Все предыдущие строки могут быть легко заменены простым правилом:

# iptables -A INPUT -m psd -j DROP

К сожалению, в пакетных фильтрах ipfw и pf ничего подобного нет, но это не беда, 
потому как сканированию портов хорошо противодействует демон PortSentry и тот самый scanlogd.

Запрет Icmp-сообщений
Хорошей практикой также является запрет ICMP-сообщений, которые могут выдать дополнительную 
информацию о хосте или быть использованы для выполнения различных злонамеренных действий 
(например, модификации таблицы маршрутизации). Ниже приведена таблица 
со списком возможных типов ICMP-сообщений:

Типы ICMP-сообщений
0 — echo reply (echo-ответ, пинг) 
3 — destination unreachable (адресат недосягаем) 
4 — source quench (подавление источника, просьба посылать пакеты медленнее) 
5 — redirect (редирект) 
8 — echo request (echo-запрос, пинг) 
9 — router advertisement (объявление маршрутизатора) 
10 — router solicitation (ходатайство маршрутизатора) 
11 — time-to-live exceeded (истечение срока жизни пакета) 
12 — IP header bad (неправильный IPзаголовок пакета) 
13 — timestamp request (запрос значения счетчика времени) 
14 — timestamp reply (ответ на запрос значения счетчика времени) 
15 — information request (запрос информации) 
16 — information reply (ответ на запрос информации) 
17 — address mask request (запрос маски сети) 
18 — address mask reply (ответ на запрос маски сети) 
Как видишь, ответ на некоторые ICMP-сообщения может привести к разглашению некоторой информации о хосте, 
в то время как другие — привести к модификации таблицы маршрутизации, поэтому их необходимо запретить.

Обычно выход во внешний мир разрешают ICMP-сообщениям 0, 3, 4, 11 и 12, в то время как на вход принимают только 3, 8 и 12. 

Вот как это реализуется в различных брандмауэрах:

Запрет опасных ICMP-сообщений
Linux> iptables -A INPUT -p icmp \
-icmp-type 3,8,12 -j ACCEPT
Linux> iptables -A OUTPUT -p icmp \
-icmp-type 0,3,4,11,12 -j ACCEPT
FreeBSD> ipfw add allow icmp \
from any to $outif in \
via $outif icmptype 3,8,12
FreeBSD> ipfw add allow icmp \
from $outif to any out \
via $outif icmptype 0,3,4,11,12
OpenBSD> pass in inet proto icmp \
from any to $outif \
icmp-type { 3, 8, 12 } keep state
OpenBSD> pass out inet proto icmp \
from $outif to any \
icmp-type { 0, 3, 4, 11, 12 } \
keep state

При желании ты можешь запретить весь ICMPтрафик, включая пинг-запросы, но это может повлиять на корректность работы сети.

Брутфорс


Разведав информацию об открытых портах и ОС, взломщик предпринимает попытки проникновения
в систему, которые могут быть основаны на эксплуатации дыр в сервисах, либо на подборе паролей. 
Предотвратить возможность взлома сервисов брандмауэр нам не поможет, однако затормозить процесс перебора паролей — легко. 
Для этого применяются возможности по ограничению количества пакетов, пришедших на машину с одного IP-адреса. 

Вот как это можно сделать с помощью iptables:
Защита от брутфорса с помощью iptables
# Цепочка для проверки соединений
iptables -N brute_check
# Блокировка адреса, если за 60
секунд он инициировал более 2-х соединений
iptables -A brute_check -m recent \
--update --seconds 60 \
--hitcount 3 -j DROP
# Если нет — разрешаем соединение и
заносим адрес в список
iptables -A brute_check -m recent \
--set -j ACCEPT
# Очищаем цепочку INPUT
iptables -F INPUT
# Отправляем в цепочку brute_check
всех, кто пытается подключиться к
22-му порту
iptables -A INPUT -m conntrack \
--ctstate NEW -p tcp \
--dport 22 -j brute_check
iptables -P INPUT DROP

То же самое можно проделать и с использованием pf:

Защита от брутфорса с помощью pf
# Создаем таблицу для брутфорсеров
table  persist
# Блокируем всех, кто в нее попадает
block in quick from 
# Помещаем в таблицу bruteforcers всех, кто инициирует более двух соединений на 22-ой порт в минуту
pass in on $ext_if inet proto tcp to $outif \
port 22 flags S/SA keep state \
(max-src-conn-rate 60/2, \ overload  flush)

Брандмауэр ipfw не обладает достаточной функциональностью для эффективного противодействия брутфорсерам, 
поэтому его пользователи должны использовать инструменты более высокого уровня, 
такие как специальные модули PAM, системы обнаружения вторжений и программы вроде sshguard.

Спуфинг

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

Достаточно часто, блокируя внешние сетевые сервисы хоста, системные администраторы оставляют их открытыми 
для определенного диапазона адресов (например, для подключения со своей домашней машины). 
Вычислив один из этих адресов, взломщик может сформировать пакет, указав этот адрес в качестве обратного, и таким образом «проскользнуть » через брандмауэр. 
Далее он может угадать номера последовательности TCP-пакетов и сделать так, чтобы доверяющий обратному адресу 
сервис выполнил нужное ему действие. Это очень трудная в реализации атака, которая, тем не менее, 
может быть выполнена грамотным специалистом, а если речь идет о протоколе UDP, то это под силу и кулхацкеру.

К счастью, защититься от подобных атак легко. Достаточно не открывать порты незащищенных сервисов во внешний мир, 
а в случае резкой необходимости использовать защитные системы самих сервисов (например, сертификаты ssh) 
или механизм «стука в порты» (о нем рассказано в конце статьи).

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

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

Linux> iptables -A INPUT -i $outif \
-s 192.168.1.0/24 -j DENY
FreeBSD> ipfw add deny ip from \
192.168.1.0/24 to any via $outif
OpenBSD> block in on $outif from \
192.168.1.0/24 to any

В качестве альтернативы или дополнительной меры защиты можно (и даже нужно) 
использовать специальные директивы ipfw и pf и настройки ядра Linux:

Linux> echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
FreeBSD> ipfw add deny ip from any to any not antispoof in
OpenBSD> antispoof quick for $ext_if

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

Полезности IPTABLES

В конце статьи мы рассмотрим несколько интересных возможностей iptables/netfilter, которые могут оказаться полезными при защите сервера. 
Начнем с механизма удаленного управления брандмауэром, получившего имя «стук в порты» (port knoking). 
Суть его заключается в том, чтобы заставить файервол выполнять определенные действия после подключения к заданному порту. 
Ниже приведен пример правил, открывающих порт SSH на 10 секунд после «стука» в 27520-ый порт:

iptables и port knocking
# Цепочка для проверки соединений на защищаемый порт
iptables -N knock
# Разрешаем соединение, если стук был в течение последних
10 секунд
iptables -A knock -m recent --rcheck --seconds 10 \
-j ACCEPT
# Очищаем INPUT
iptables -F INPUT
# Разрешаем все, что относится к уже установленным соединениям
iptables -A INPUT -m conntrack \
--ctstate ESTABLISHED,RELATED -j ACCEPT
# Все попытки открыть соединение с 22-м портом отправляем
на проверку в цепочку knock
iptables -A INPUT -m conntrack --ctstate NEW \
-p tcp --dport 22 -j knock
# Заносим адрес стучащегося в 27520-й порт в список
iptables -A INPUT -m conntrack --ctstate NEW \
-p tcp --dport 27520 -m recent --set
# При стуке в соседние порты удаляем адрес из списка
iptables -A INPUT -m conntrack --ctstate NEW -p tcp \
-m multiport --dport 27519,27521 -m recent --remove
# Запрещаем все
iptables -P INPUT DROP

Третье с конца правило добавляет адрес стучащегося в список. 
Если та же машина в течение 10 секунд после стука обратится к 22-му порту, соединение будет установлено. 
Предпоследнее правило — защита от «перебора стука».
Если злоумышленник попытается стучать последовательно во все порты с надеждой, что один из них откроет 22-й порт, 
сработает это правило, и его адрес будет удален из списка сразу после попадания в него.

Вторая полезность iptables распространяется в пакете xtables-addons (patch-o-matic) и носит имя TARPIT. 
Это действие (такое же, как ACCEPT или DENY), которое «подвешивает» соединение, не позволяя атакующей стороне его закрыть. 
Соединение, пакеты которого попадают в TARPIT, будет благополучно установлено, 
однако размер окна будет равен нулю, благодаря чему удаленная машина не сможет отправлять данные, 
расходуя свои ресурсы, а соединение будет закрыто только по истечению таймаута. 

TARPIT можно использовать в экстренных случаях для защиты от DoS:
# iptables -A INPUT -p tcp -m tcp -dport 80 -j TARPIT

Или же для введения атакующего в заблуждение и борьбы против сканеров портов (только обычное TCP-сканирование, '-sT'):
# iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
# iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
# iptables -A INPUT -p tcp -m tcp -j TARPIT

Эти правила создают видимость системы, в которой открыты все порты, однако при попытке подключения к любому из них (кроме 80 и 25) соединения будут «подвисать». Того же результата, но без «провисших» соединений, можно добиться с помощью действия DELUDE, 
которое правильно отвечает на все попытки инициации соединения, но посылает RST-пакет в ответ на все остальные пакеты. 
Для еще большего запутывания атакующего ты можешь использовать действие CHAOS, которое случайным образом активирует одно из двух описанных выше действий.

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

Links
sf.net/projects/sentrytools — PortSentry 
http://www.openwall.com/scanlogd — scanlogd 
Борьба с утечкой ресурсов
При использовании действия TARPIT обязательно добавляй в конфиг следующее правило, иначе «провисшие» соединения будут съедать ресурсы при обработке подсистемой conntrack:
# iptables -t raw -I PREROUTING -p tcp --dport 25 -j NOTRACK

Обжимка

языком вниз - слева направо
бело оранжевый
оранжевый
бело зеленый 
синий 
бело синий
зеленый
бело коричневый
коричневый