Ограничение времени жизни сетевого соединения

Постановка задачи

Есть виртуальная машина под KVM, имеющая SPICE-консоль на порту 8888. Надо:

  1. при открытой сессии блокировать доступ с других компьютеров (шоб не лезли, когда люди работают);
  2. время жизни соединения должно быть ограничено (учёные — существа рассеяные, уйдёт такой домой, а консоль не выключит, и никто работать не сможет)

Решение

В начале определим переменные:

LIFETIME_LIMIT=$((3*3600)) # secs
SPICE_PORT=8888

Первый пункт решается элементарно путём запроса к google.

iptables -A allowed_tcp_packets -p TCP --syn --dport ${SPICE_PORT} -m connlimit --connlimit-mask 0 --connlimit-above 4 -j REJECT

Единственный нюанс, достойный упоминания — использование REJECT вместо DROP, чтобы клиенты не ждали таймаута.

Второй пункт решается гораздо забавней! Начнём с того, что гугл не выдал ниодного толкового решения!!! Может быть, я плохо искал, но обычно проблем с этим у меня не бывает. Курение man'а к iptables, сорцов ядра и т.п. показало, что iptables не имеет прямого способа ограничить время жизни активного коннекта. НИКАК! :) Т.е. если коннект каким-то образом завис, можно покрутить всякие ручки, чтобы его быстрее вычистить, но активный коннект убить нельзя :(

И тут на мозги неотвратимо сваливается ПРОСВЕТЛЕНИЕ! Эти волшебные пять букаф: IPSET!!!

#Connection lifetime limit
ipset -! destroy ip4_lifetime_list
ipset -! create  ip4_lifetime_list hash:ip,port timeout ${LIFETIME_LIMIT}
ipset    flush   ip4_lifetime_list
 
#выставляем таймаут для соединения со spice консолью
iptables -A input_tcp_packets -p TCP --syn --dport ${SPICE_PORT} -m conntrack --ctstate NEW -j SET --add-set ip4_lifetime_list src,dst
 
#### Внешний входящий трафик ##########################################
 
#Проверяем чёрный список
iptables -A INPUT -p ALL -m set --match-set "ip4_black_list" src -j DROP
 
#Убиваем бродкастный мусор
iptables -A INPUT -p ALL -m addrtype --dst-type BROADCAST        -j DROP
 
#Убиваем соединения с истёкшим временем жизни
iptables -A INPUT -p TCP --dport ${SPICE_PORT} -m conntrack --ctstate ESTABLISHED,RELATED -m set ! --match-set "ip4_lifetime_list" src,dst -j REJECT
 
#Принимаем установленные соединения и чистим мусор
iptables -A INPUT -p ALL  -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p TCP  -j bad_tcp_packets
 
#Проверяем и принимаем лигитимный трафик
iptables -A INPUT -p TCP  -j input_tcp_packets
iptables -A INPUT -p UDP  -j input_udp_packets
iptables -A INPUT -p ICMP -j input_icmp_packets

Фсё, время выпадать в нирвану! :)

Andrew A. Sabitov 2012-09-13 13:53


net/ограничение_времени_жизни_соединения.txt · Последние изменения: 2013-08-24 21:04 — Andrew A. Sabitov