Средство для работы с uTP проколом, заменяет uTPControl - block uTP torrent proto
Скачать: ng_utp
Лицензия: BSD
Нода может работать на хуках:
Одну ноду одновременно можно подключать к различным источниками трафика, как L2 так и L3 одновременно, ограничений нет.
На основании таблицы соединений можно:
uTP имеет достаточно чёткие сигнатуры только в пакетах установления соединения SYN и ответном STATE: 14 байт из 38 или 41 байта в зависимости от версии протокола. После установления uTP соединения передаются DATA и STATE, которые имеют меньше неизменных данных для сигнатур.
Блокировать или изменять приоритет по таким признакам чревато массой ложный срабатываний.
ng_utp отслеживает utp_conn - connid uTP (2 или 4 байта) пакетов, привязанных к ip_conn (IP src, IP dst, UDP src port, UDP dst port), а также то какого типа пакеты были отправлены, сколько пакетов с каждой стороны уже было отправлено и когда был отправлен последний пакет с каждой стороны. Обычно на одно ip_conn приходится 1-2 utp_conn, иногда больше.
Первый пакет - SYN (если нода выключена до начала обмена uTP пакетами) проходит ноду создавая (если такого ещё нет) ip_conn и внутри него utp_conn, при этом действий с пакетом не происходит и он не считается как uTP. Когда в ответ приходит STATE, который относится к тому же ip_conn (по src/dst IP и sport/dport UDP) и utp_conn (по connid uTP), то такой пакет считается uTP трафиком и к нему применяются действия в соответствии с настройками.
Если трафик через ноду перенаправили после того как uTP соединения установились то на работу ноды это не влияет: для неё важен двух сторонний обмен uTP пакетами. Нода выполняет действия определённые фильтром над: DATA и STATE uTP пакетами и не выполняет действий для FIN, RESET, SYN.
Результатом работы является выстраивание таблицы соединений IP-UDP-uTP (L3-L4-L5).
Таблица единая для экземпляра ноды и доступна/пополняется со всех хуков-фильтров.
NGM_UTP_GET_NODE_CFG(“getcfg”) - прочитать конфигурацию.
NGM_UTP_SET_NODE_CFG(“setcfg”) - установить новые параметры конфигурации.
Параметры
ngctl msg ipfw:1000 getcfg Rec'd response "getcfg" (1) from "[1a]:": Args: { conn_ack_timeout=30 conn_idle_timeout=60 }
NGM_UTP_GET_NODE_STATUS(“getstatus”) - возвращает текущее состояние ноды
Все счётчики uint64_t.
ngctl msg ipfw:1000 getstatus Rec'd response "getstatus" (3) from "[1a]:": Args: { ipv4_conns=85 ip_conns_total=85 ip_conns_max=100021 utpv0_conns=2 utpv1_conns=85 utp_conns_total=87 utp_conns_max=400008 mem_ip_conns=10880 mem_utp_conns=5568 mem_total=16448 }
NGM_UTP_GET_NODE_STAT(“getstat”) - получить
NGM_UTP_CLR_NODE_STAT(“clrstat”) - очистить
NGM_UTP_GETCLR_NODE_STAT(“getclrstat”) - получить и очистить
Все счётчики uint64_t.
ngctl msg ipfw:1000 getstat Rec'd response "getstat" (4) from "[1a]:": Args: { ipv4_conns=399 ip_conns_total=399 utpv0_conns=46 utpv1_conns=397 utp_conns_total=443 }
NGM_UTP_FLUSH_CONN4 (“flushconn4”) - IPv4
NGM_UTP_FLUSH_CONN6 (“flushconn6”) - IPv6
ngctl msg ipfw:1000 flushconn4
NGM_UTP_GET_CONN_TABLE4 (“getconntbl4”) - IPv4
NGM_UTP_GET_CONN_TABLE6 (“getconntbl6”) - IPv6 - не реализовано.
ngctl msg ipfw:1000 getconntbl4 Rec'd response "getconntbl4" (12) from "[1a]:": Args: { count=46 conn_entryes=[ { saddr=178.236.129.230 daddr=172.16.0.3 sport=46537 dport=40443 conns=1 } { saddr=91.223.178.3 daddr=172.16.0.3 sport=32786 dport=40443 conns=2 lifetime=46 idle=9 } { saddr=81.9.62.210 daddr=172.16.0.3 sport=56690 dport=40443 conns=1 lifetime=54 idle=39 } { ... saddr=78.30.247.193 daddr=172.16.0.3 sport=45070 dport=40443 conns=1 lifetime=75 idle=54 } { saddr=95.25.30.128 daddr=172.16.0.3 sport=54682 dport=40443 conns=1 lifetime=91 idle=54 } { saddr=188.32.168.23 daddr=172.16.0.3 sport=50022 dport=40443 conns=1 lifetime=120 idle=30 } ] }
NGM_UTP_ADD_FILTER(“addfilter”) - добавить L2:Ethernet или L3:IPv4/IPv6 фильтр
l3_proto (uint16_t) - тип фильтра: 0 в случае ethernet, 0x0800 - для IPv4, 0x86DD - для IPv6
action (uint16_t) - действие выполняемое фильтром:
flags (uint32_t) - флаги:
label_l2 (uint8_t) - L2 - Priority Code Point метка пакета, первые 3 бита.
label_l3 (uint8_t) - L3 ip_tos/Traffic Class code (rfc2474) метка пакета, первые 6 бит.
h0 (char) -
h1 (char) - имя хука добавляемого в фильтр
Для L2:
ngctl mkpeer vlan777: utp lower lower ngctl connect vlan777: vlan777:lower upper upper ngctl msg vlan777:lower addfilter '{ l3_proto=0 action=3 flags=0x00000000 h0="lower" h1="upper" }'
Для L3-IPv4:
ngctl mkpeer ipfw: utp 1000 in ngctl connect ipfw: ipfw:1000 1001 out ngctl msg ipfw:1000 addfilter '{ l3_proto=0x0800 action=3 flags=0x00000000 h0="in" h1="out" }'
(здесь по идее достаточно одного хука, но такое “одноногое” поведение пока не реализовано)
NGM_UTP_GET_FILTER (“getfilter”) - получить настройки фильтра по имени одного из хуков, который в него входит.
ngctl msg ipfw:1000 getfilter '"io"' Rec'd response "getfilter" (13) from "[46]:": Args: { l3_proto=0x800 action=3 flags=0x3 h0="io" }
NGM_UTP_DEL_FILTER (“delfilter”) - удалить фильтр по имени одного из хуков, который в него входит, хуки при этом не отключаются от нод
ngctl msg ipfw:1000 delfilter '"in"'
NGM_UTP_GET_FILTER_STATS (“getfilterstats”)
NGM_UTP_CLR_FILTER_STATS (“clrfilterstats”)
NGM_UTP_GETCLR_FILTER_STATS (“getclrfilterstats”)
Все счётчики uint64_t.
ngctl msg ipfw:1000 getfilterstats '"in"' Rec'd response "getfilterstats" (9) from "[1a]:": Args: { Octets=5982246 Packets=38489 IPv4_Packets=38492 MatchedPackets=8760 BypassPackets=38978 recvErrors=8760 }