====== Шпаргалка iptables ======
===== Вместо closed показывает filtered =====
nmap при скане показывает filtered
PORT STATE SERVICE
21/tcp filtered ftp
80/tcp open http
443/tcp open https
3306/tcp filtered mysql
хотя есть правило
iptables -A INPUT -p tcp --dport 3306 -j DROP
меняем drop на reject
-A INPUT -p tcp -m tcp --dport 3306 -j REJECT --reject-with tcp-reset
===== Лог трафика по uid/gid =====
Отслеживаем исходящий трафик
* Создаём новую цепочку log_tr
* Перенаправляем весь трафика из OUTPUT в log_tr если порт назначения http или https
* Записываем весь трафик в log_tr цепочке включая юзерский uid/gid
# iptables -N log_tr
# iptables -I OUTPUT 1 -p tcp -m multiport --dports 80,443 -m state --state NEW -j log_tr
# iptables -A log_tr -j LOG --log-uid --log-prefix "iptables: "
В ''[r]syslog.conf'' добавляем что-то вроде FIXME
:msg, contains, "iptables: " -/var/log/iptable_tr.log
===== Разрешить DNS =====
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 --dport 1024:65535 -j ACCEPT
===== Can't use -i with OUTPUT =====
''-i'' опция для указания входящего интерфейса. Поэтому в цепочке OUTPUT это работать не будет. Для этого существует ''-o'' опция.
===== Как заблокировать пустые пакеты length 0 =====
iptables -A INPUT -p tcp -d 192.168.10.252 -m length --length 0 -j DROP
Блокировать без флага
iptables -A INPUT -p tcp ! --syn -m conntrack --state NEW -j DROP
===== Заблокировать доступ к домену на сервере =====
На сервере расположен сайт foobar.com\\
Нужно заблокировать к нему доступ
iptables -A INPUT -p tcp --dport 80 -m string --string "Host: foobar.com" -j DROP
iptables -A INPUT -p tcp --dport 80 -m string --string "Host: www.foobar.com" -j DROP
===== Как сохранить правила iptables? =====
https://www.thomas-krenn.com/en/wiki/Saving_Iptables_Firewall_Rules_Permanently
==== CentOS ====
FIX
==== Debian 7 / Wheezy ====
Устанавливаем пакет iptables-persistent
# apt-get install iptables-persistent
Сохраняем текущие правила iptables
# /etc/init.d/iptables-persistent save
Добавляем в автозагрузку
# update-rc.d iptables-persistent defaults
==== Debian 8 / Jessie ====
Устанавливаем пакет netfilter-persistent
# apt-get install netfilter-persistent iptables-persistent
Сохраняем текущие правила iptables
# netfilter-persistent save
Добавляем в автозагрузку
# systemctl enable netfilter-persisten
В некоторых случаях может появиться следующая ошибка при установке пакета netfilter-persistent
root@localhost:~# apt-get install iptables-persistent
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
netfilter-persistent
The following NEW packages will be installed:
iptables-persistent netfilter-persistent
---cut---
update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
A dependency job for netfilter-persistent.service failed. See 'journalctl -xn' for details.
invoke-rc.d: initscript netfilter-persistent, action "start" failed.
dpkg: error processing package netfilter-persistent (--configure):
subprocess installed post-installation script returned error exit status 1
dpkg: dependency problems prevent configuration of iptables-persistent:
iptables-persistent depends on netfilter-persistent (= 1.0.3); however:
Package netfilter-persistent is not configured yet.
dpkg: error processing package iptables-persistent (--configure):
dependency problems - leaving unconfigured
Processing triggers for systemd (215-17+deb8u3) ...
Errors were encountered while processing:
netfilter-persistent
iptables-persistent
E: Sub-process /usr/bin/dpkg returned an error code (1)
Workaround - закомментировать в **/etc/modules** строку **acpiphp** и перезагрузить машину.
root@localhost:~# cat /etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
loop
# acpiphp
=== Warning: weird character in interface `eth0:1' (No aliases, :, ! or *). ===
Busted **Deprecated!** Не используйте алиасы. И ifconfig тоже.
===== Port Forwarding RDP / Переадресовываем пакеты =====
Перенаправление трафика
Клиент - x.x.x.x\\
RDP сервер на порту 65001 - y.y.y.y\\
VPS сервер z.z.z.z\\
Нужно подключаться к RDP серверу через IP адрес VPS. Т.е. осуществлять подключение к RDP не напрямую, а с адреса VPS.
net.ipv4.ip_forward = 1
iptables -t nat -A PREROUTING -d z.z.z.z -p tcp -m tcp --dport 65001 -j DNAT --to-destination y.y.y.y:65001
iptables -t nat -A POSTROUTING -d y.y.y.y -p tcp -m tcp --dport 65001 -j SNAT --to-source z.z.z.z
iptables -t nat -A OUTPUT -d z.z.z.z -p tcp -m tcp --dport 65001 -j DNAT --to-destination y.y.y.y
===== Как закрыть 8080 порт? =====
Пример: ISPmgr, nginx (80) + apache (8080)
Нужно закрыть извне 8080 порт бэкенда.
http://serveradministrator.ru/apache/close-port-apache-8080/
iptables -A INPUT -p tcp --dport 8080 -s localhost -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -j DROP
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT ! -s 109.68.191.13 -p tcp -m tcp --dport 8080 -j DROP
iptables -A INPUT ! -s 127.0.0.1 -p tcp -m tcp --dport 8080 -j DROP
iptables -I INPUT -i eth0 -s 127.0.0.1 -p tcp --dport 8080 -j ACCEPT
===== Блокировка трафика из сети TOR =====
Источник: http://saytostroy.ru/zashita_servera/blokirovka_trafika_iz_seti_tor/
Список Tor IP - https://www.dan.me.uk/tornodes
===== Сброс правил iptables =====
nano iptables-hello-world.sh
#!/bin/bash
echo "Stopping iptables service"
# clear ip4tables rules
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -F
iptables -t mangle -F
iptables -F
iptables -X
# clear ip6tables rules
ip6tables -P INPUT ACCEPT
ip6tables -P FORWARD ACCEPT
ip6tables -P OUTPUT ACCEPT
ip6tables -t nat -F
ip6tables -t mangle -F
ip6tables -F
ip6tables -X
# default policy
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
===== Как заблокировать подсеть =====
http://www.linux.org.ru/forum/admin/6473844#comment-6473941
iptables -A INPUT -s 91.20.0.0/16 -j REJECT
iptables -A OUTPUT -d 91.20.0.0/16 -j REJECT
===== List of Loaded iptables Modules =====
http://stackoverflow.com/questions/2023578/list-of-loaded-iptables-modules
cat /proc/net/ip_tables_matches
===== Как удалить iptables правило по номеру =====
http://www.opennet.ru/tips/info/603.shtml
iptables -L INPUT --line-numbers
iptables -D INPUT номер
iptables -t nat -L POSTROUTING --line-numbers
iptables -t nat -D POSTROUTING номер
Ошибка
postrouting iptables: No chain/target/match by that name
Не забываем про -t nat
===== Настройка iptables для proftpd,vsftpd =====
* **[[http://www.linux.org.ru/forum/admin/6948939|[iptables] DROP vs. REJECT]]**
* **[[http://phpsuxx.blogspot.com/2010/01/nfconntrack-table-full-dropping-packet.html|nf_conntrack: table full, dropping packet в dmesg]]**
(необходимо изменить ip 192.168.0.1 на ip вашего сервера)
service iptables stop
iptables -A INPUT -p tcp -s 0/0 --sport 1024:65535 -d 192.168.0.1 --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -s 192.168.0.1 --sport 21 -d 0/0 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 --sport 1024:65535 -d 192.168.0.1 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -p tcp -s 192.168.0.1 --sport 1024:65535 -d 0/0 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp -s 192.168.0.1 --sport 20 -d 0/0 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp -s 0/0 --sport 1024:65535 -d 192.168.0.1 --dport 20 -m state --state ESTABLISHED -j ACCEPT
(необходимо добавить модуль iptables)
vi /etc/sysconfig/iptables-config
# Load additional iptables modules (nat helpers)
# Default: -none-
# Space separated list of nat helpers (e.g. 'ip_nat_ftp ip_nat_irc'), which
# are loaded after the firewall rules are applied. Options for the helpers are
# stored in /etc/modprobe.conf.
IPTABLES_MODULES="ip_conntrack_netbios_ns"
IPTABLES_MODULES="ip_conntrack_ftp"
service iptables start
данное решение поможет устранить вам ошибку
notice: user : aborting transfer: Data connection closed
iptables -A OUTPUT -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
===== ip_conntrack: table full, dropping packet =====
* http://goodhack.net.ua/archives/304
* http://phpsuxx.blogspot.ru/2010/01/nfconntrack-table-full-dropping-packet.html
wmod kernel: ip_conntrack: table full, dropping packet.
wmod kernel: printk: 2449 messages suppressed.
wmod kernel: ip_conntrack: table full, dropping packet.
wmod kernel: printk: 2041 messages suppressed.
Show current value
cat /proc/sys/net/ipv4/ip_conntrack_max #
Set larger value
echo 65536 > /proc/sys/net/ipv4/ip_conntrack_max
===== Kernel Packet Traveling Diagram =====
http://www.docum.org/docum.org/kptd/
Network
-----------+-----------
|
+--------------------------+
+-------+-------+ +---------+---------+
| IPCHAINS | | IPTABLES |
| INPUT | | PREROUTING |
+-------+-------+ | +-------+-------+ |
| | | conntrack | |
| | +-------+-------+ |
| | | mangle | | <- MARK WRITE
| | +-------+-------+ |
| | | IMQ | |
| | +-------+-------+ |
| | | nat | | <- DEST REWRITE
| | +-------+-------+ | DNAT or REDIRECT or DE-MASQUERADE
| +---------+---------+
+------------+-------------+
|
+-------+-------+
| QOS |
| INGRESS |
+-------+-------+
|
packet is for +-------+-------+ packet is for
this machine | INPUT | another address
+--------------+ ROUTING +--------------+
| | + PDBB | |
| +---------------+ |
+-------+-------+ |
| IPTABLES | |
| INPUT | |
| +-----+-----+ | |
| | mangle | | |
| +-----+-----+ | |
| | filter | | |
| +-----+-----+ | |
+-------+-------+ |
| +---------------------------+
+-------+-------+ | |
| Local | +-------+-------+ +-------+-------+
| Process | | IPCHAINS | | IPTABLES |
+-------+-------+ | FORWARD | | FORWARD |
| +-------+-------+ | +-----+-----+ |
+-------+-------+ | | | mangle | | <- MARK WRITE
| OUTPUT | | | +-----+-----+ |
| ROUTING | | | | filter | |
+-------+-------+ | | +-----+-----+ |
| | +-------+-------+
+-------+-------+ | |
| IPTABLES | +---------------------------+
| OUTPUT | |
| +-----------+ | |
| | conntrack | | |
| +-----+-----+ | |
| | mangle | | <- MARK WRITE |
| +-----+-----+ | |
| | nat | | <-DEST REWRITE |
| +-----+-----+ | DNAT or REDIRECT |
| | filter | | |
| +-----+-----+ | |
+-------+-------+ |
| |
+----------------------+----------------------+
|
+------------+------------+
| |
+-------+-------+ +---------+---------+
| IPCHAINS | | IPTABLES |
| OUTPUT | | POSTROUTING |
+-------+------- | +-------+-------+ |
| | | mangle | | <- MARK WRITE
| | +-------+-------+ |
| | | nat | | <- SOURCE REWRITE
| | +-------+-------+ | SNAT or MASQUERADE
| | | IMQ | |
| | +-------+-------+ |
| +---------+---------+
+------------+------------+
|
+------+------+
| QOS |
| EGRESS |
+------+------+
|
-----------+-----------
Network
===== iptables mac address filtering =====
Фильтрация mac адресов будет работать только если пакет проходит одну из следующих цепочек:
* PREROUTING
* FORWARD
* INPUT
Запретить все входящие соединения для mac адреса 00:1F:2B:02:04:08
iptables -A INPUT -m mac --mac-source 00:1F:2B:02:04:08 -j DROP
Разрешить входящие соединения на 22 порт для mac адреса 00:1F:2B:02:04:08
iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:1F:2B:02:04:08 -j ACCEPT
===== Закрыть 81 порт в схеме фронт/бэк/nginx/apache =====
Вот так
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 81 -j DROP
Ранее в ISPmanager 4 Apache слушал внешний интерфейс и в итоге сайт мог быть доступен, как по 80 так и 81 порту (http:// rtfm.wiki:81).
Правило для iptables в этом случае выглядит так
-A ISPMGR -s a.b.c.d/32 -p tcp -m tcp --dport 81 -j ACCEPT
-A ISPMGR -p tcp -m tcp --dport 81 -j DROP
===== Спасти HLDS =====
[[http://rodoabad.joinpgn.com/2012/04/13/6-important-iptables-rules-for-your-hlds-server/|6 Important iptables Rules For Your HLDS Server]]
-A JOINPGN-INPUT -p tcp -m tcp --dport XXXXXX:XXXXXX-m length --length 0:32 -j DROP
-A JOINPGN-INPUT -p udp -m udp --dport XXXXXX:XXXXXX -m length --length 0:32 -j DROP
-A JOINPGN-INPUT -p tcp -m tcp --dport XXXXXX:XXXXXX -m length --length 222 -j DROP
-A JOINPGN-INPUT -p udp -m udp --dport XXXXXX:XXXXXX -m length --length 222 -j DROP
-A JOINPGN-INPUT -p tcp -m tcp --dport XXXXXX:XXXXXX -m length --length 222 -m string --hex-string "|a090909090909090901809a5000000000000000000000000000000000000000000000000|" --algo bm --to 65535 -j DROP
-A JOINPGN-INPUT -p udp -m udp --dport XXXXXX:XXXXXX -m length --length 222 -m string --hex-string "|a090909090909090901809a5000000000000000000000000000000000000000000000000|" --algo bm --to 65535 -j DROP
{{tag>netfilter iptables drop}}