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

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

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

при открытой сессии блокировать доступ с других компьютеров (шоб не лезли, когда люди работают);

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

Решение

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

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

Tracedump:

newBaseSize: 16pt
newBaseSizeInPt: 16