Path MTU Discovery Black Hole

Эта проблема совсем не нова. Она описана в RFC 2923 в 2000 году. Но тем не менее, продолжает встречаться с завидным упорством у многих провайдеров. А ведь именно провайдер виноват в данной ситуации: не нужно блокировать ICMP тип 3 код 4. Причем слушаться «голоса разума» ( т. е. клиентов, понимающих в чем проблема) они обычно не хотят.

Решение проблемы с PMTU

Не будем звонить в техподдержку, а попробуем решить проблему, исходя из собственных средств.
Разработчики Linux, тоже знающие о ней, предусмотрели специальную опцию в iptables. Цитата из man iptables:

TCPMSS
This target allows to alter the MSS value of TCP SYN packets, to control the maximum size for that connection (usually limiting it to your outgoing interface’s MTU minus 40 for IPv4 or 60 for IPv6, respectively). Of course, it can only be used in conjunction with -p tcp. It is only valid in the mangle table. This target is used to overcome criminally braindead ISPs or servers which block “ICMP Fragmentation Needed” or “ICMPv6 Packet Too Big” packets. The symptoms of this problem are that everything works fine from your Linux firewall/router, but machines behind it can never exchange large packets:
1) Web browsers connect, then hang with no data received.
2) Small mail works fine, but large emails hang.
3) ssh works fine, but scp hangs after initial handshaking.
Workaround: activate this option and add a rule to your firewall configuration like:

iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Читать далее Path MTU Discovery Black Hole

CentOS 7: отключить Firewalld

В CentOS 7 по умолчанию установлен Firewalld который блочит некоторые порты, а мне нравится стандартный iptables. займемся возвратом всего на свои метса

1. Отключаем Firewalld сервис

[root@mongo12 ~]# systemctl mask firewalld

2. Останавливаем.

[root@mongo12 ~]# systemctl stop firewalld

3. Установим iptables

[root@mongo12 ~]# yum -y install iptables-services

Читать далее CentOS 7: отключить Firewalld

Привязать MAC к IP на шлюзе

Чтобы отсеять незнакомцев которым не дозволен выход в инет либо гуляние по корпоративным подсетям, можно применить фильтр мак-адресов + ip-адресов
В случае если шлюзом выступает сервер на Linux, с iptables на борту, выглядит это так:

Читать далее Привязать MAC к IP на шлюзе

Проброс трафика на другую машину

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

iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 21 -j DNAT --to-destination 10.0.3.99
iptables -t nat -A POSTROUTING -p tcp -d 10.0.3.99 --dport 21 -j MASQUERADE

10.0.3.99 – куда заворачивать

стук на открытие порта ssh

Самое простое — открывать порт ssh (22) после стука в заданный высокий порт:

iptables -N ssh_knock # Создаем цепочку для проверки попыток соединений на защищаемый порт
# Если за последние 60 секунд было 2 и более стука — блокируем, на всякий случай
iptables -A ssh_knock -m recent --rcheck --seconds 60 --hitcount 2 -j RETURN
# Если за последние 10 секунд стук в нужный порт был — разрешить соединение
iptables -A ssh_knock -m recent --rcheck --seconds 10 -j ACCEPT
iptables -F INPUT # Очищаем цепочку INPUT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Разрешаем пакеты по установленным соединениям
# Все попытки открыть новое соединение по SSH направляем на проверку
iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ssh_knock
# Здесь мы добавляем правило для регистрации стука
iptables -A INPUT -m state --state NEW -p tcp --dport 27520 -m recent --set
# Опять же на всякий случай — при стуке в соседние порты закрываем SSH
iptables -A INPUT -m state --state NEW -p tcp -m multiport --dport 27519,27521 -m recent --remove
iptables -P INPUT DROP # Что не разрешено — то запрещено

Даже в таком простом примере присутствуют жесткие меры защиты: защищаемый порт ssh (22) открывается на 10 секунд после стука в заданный порт (27520), при этом более одного стука в этот порт в течение минуты считается ошибкой. Также стук в соседние с заданным порты сразу закрывает защищаемый порт. Это делается в целях защиты от подбора стука.

Защита от брут-форса

iptables -N ssh_knock # Создаем цепочку для проверки
# Если за последние 10 минут было 5 и более попыток соединения — блокируем
iptables -A ssh_knock -m recent --name ssh --update --seconds 600 --hitcount 5 -j RETURN
# Регистрируем
iptables -A ssh_knock -m recent --name ssh --set
# Если за последние 5 секунд было менее двух попыток — блокируем
iptables -A ssh_knock -m recent --name ssh ! --rcheck --seconds 5 --hitcount 2 -j RETURN
# Все остальное — разрешаем
iptables -A ssh_knock -j ACCEPT
iptables -F INPUT # Очищаем цепочку INPUT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Разрешаем пакеты по установленным соединениям
# Все попытки открыть новое соединение по SSH направляем на проверку
iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ssh_knock
iptables -P INPUT DROP # Что не разрешено — то запрещено

Идея метода проста: защищаемый порт открывается со второй попытки, т.е. стук идет непосредственно в него. Вторую попытку нужно сделать в течение 5 секунд после первой. При этом 5 и более попыток за десять минут блокируются (во избежание брутфорса).

Справка новичку по iptables

Из моего опыта (пусть он и не так велик), для работы с Linux-системами чаще всего используются следующие правила и возможности iptables:

iptables -L INPUT –line-numbers – просмотреть правила

iptables -D INPUT “номер” – удалить правило с данным номером

iptables -t nat -L POSTROUTING –line-numbers – просмотреть правила для NAT

iptables -t nat -D POSTROUTING “номер” – удалить правило для NAT с данным номером

iptables -t nat -A POSTROUTING -s 192.168.0.1 -o eth1 -j SNAT –to-source 111.111.111.111 – создать правило NAT для данного внутренного ip

iptables -t nat -A PREROUTING -p tcp -d 192.168.0.1 –dport 21 -j DNAT –to-destination 192.168.1.1:21 – проброс порта

Максимум 5 одновременных соединений к данному порту с одного IP
iptables -A INPUT-p tcp –dport порт -m iplimit –iplimit-above 5 -j REJECT

Ограничение трафика на данном порту

iptables –new-chain car
iptables –insert OUTPUT 1 -p tcp –destination-port “порт” -o eth1 –jump car
iptables –append car -m limit –limit 20/sec –jump RETURN
iptables –append car –jump DROP

Хотим отключить интернет у пользователя? Запретим ему обмен данными по любому маршруту: iptables -A FORWARD -d 192.168.0.12 -j DROP

Введение в IPTables, Описание работы и введение в синтаксис

Прежде всего:

http://iptables-tutorial.frozentux.net/ipt…s-tutorial.html (англ)

http://gazette.linux.ru.net/rus/articles/i…s-tutorial.html (русс)

Немного теории.

Что такое firewall знают многие, однако мало кто знает очень хорошо, как он работает. И вообще, как проходят пакеты через сам сервер, через маршрутизацию и через цепочки firewall’а.

Объясняю популярно. Есть сервер — роутер, есть клиент и есть сайт mail.ru.

Когда клиент набирает в браузере адрес сайта www.mail.ru, его компьютер в первую очередь отправляет запрос к его DNS серверу (к DNS серверу провайдера, а тот в свою очередь уже ищет IP-адрес у мирового DNS, затем у DNS самого mail.ru). Этот процесс нас особо не интересует. Идём дальше.

Получив IP-адрес сайта mail.ru, компьютер клиента отправляет на него запрос (т.е. tcp пакет, т.к. http протокол работает по 80-му и протоколу tcp) по HTTP протоколу (попросту GET http://www.mail.ru/ — просит выдать ему страничку).

У всех пакетов есть заголовок и данные. В заголовке храниться информация о IP-клиента (source ip address — исходный ip), IP-адрес сайта mail.ru (destination ip адрес — IP адрес получателя пакета/запроса), протокол (tcp), порт клиента, т.е. порт, откуда отправили запрос (он всегда меняется, может быть примено где то 30000 +- 10000). И порт получателя, т.е. mail.ru — тут он будет 80-й. Т.к. пакет у нас — запрос к веб серверу по протоколу http (tcp/80). Далее ещё идёт в заголовке всякая служебная информация, например контрольная сумма пакета и т.д. С данными всё понятно — там идёт просто текст в формате http протокола: GET http://www.mail.ru/ плюс информация о клиентском браузере и версии ОС.

Читать далее Введение в IPTables, Описание работы и введение в синтаксис