Часто перед администратором возникает задача оборвать tcp-коннект с тем или иным клиентом по тем или иным причинам.
Легко можно обрвать соединение по ssh, но как разорвать коннект с базой данных или веб-сервером?
Можно использовать ipfilter или null-routing правила, а можно воспользоваться утилитой tcpdrop, которую портировали из FreeBSD.
Установленный TCP коннект можно выявить по следующим параметрам:
{local IP address, local port, remote IP address, remote port}
Для этого можно к примеру воспользоваться утилитой netstat(1M). Если мы хотим разорвать соединение от адреса 192.168.4.25, который подсоединен к веб-серверу на 172.20.3.75, идентифицируем номера портов:
# netstat -n -Ptcp | egrep 172.20.3.75.*192.168.4.25
172.20.3.75.80 192.168.4.25.33062 49640 0 49640 0 ESTABLISHED
Вывод показывает соединение к порту 80 на 172.20.3.75 с порта 33062 адреса 192.168.4.25.
Также можно перенаправить траффик от определенного адреса в никуда (black hole):
# route add -host 192.168.4.25 127.0.0.1 -blackhole
Отметим, однако, что некоторые пакеты от клиента все же могут быть обработаны приложением. Blackhole имеет также некоторые побочные последствия в том случае, если удаленный компьютер представляет собой multiuser host, на другом конце соединения работает Java DataBase Connectivity (JDBC) или он обрабатывает несколько служб для локальной машины.
Можно воспользоваться провилом IP Filter для запрета траффика:
block return-rst in quick proto tcp from /remote_addr/ port = /remote_port/ to /local_addr/ port = /local_port/
Например, для нашего примера правило будет выглядить так:
block return-rst in quick proto tcp from 192.168.4.25 port = 33062 to 172.20.3.75 port = 80
Не забудем рестартовать файрволл:
Когда соединение оборвется, нам придется удалить это правило и опять рестартовать файрволл.
Markus Friedl из проекта OpenBSD написал
утилиту, легко позволяющую обрывать tcp-соединения. Эта утилита, tcpdrop*, была портирована во FreeBSD, где успешно используется в течение последних двух лет.
Вот как tcpdrop легко справляется с нашей задачей:
# tcpdrop 172.20.3.75 80 192.168.4.25 33062
172.20.3.75 80 192.168.4.25 33062: dropped
Соединение разорвано и нет никаких воздействий на соединения с этим хостом в будущем, или другими установленными соединениями с этого адреса.
* Solaris OS содержит недокументированный kernel interface который используется утилитой. Утилита tcpdrop работает в Solaris 8,9,10 но может перстать работать в будущих версиях Solaris.