Python3 Сброс/Отключение TCP-соединений

#python #python-3.x #linux #networking #tcp

#python #python-3.x #linux #networking #tcp

Вопрос:

У меня есть машина злоумышленника, которая устанавливает SSH-соединение с хостом в моей сети, и я хотел бы отключить/сбросить это соединение. В настоящее время я запускаю этот скрипт на маршрутизаторе/шлюзе, и весь трафик сначала проходит здесь. Когда идентификатор вызывает предупреждение, мой скрипт анализирует данные и блокирует IP — адрес источника. Мне удалось заставить скрипт отключить/сбросить TCP-соединение от злоумышленника, но я думаю, что природа tcpkill заставляет его контролировать терминал сеанса.

Из-за этого я получаю результат ниже. Похоже, tcpkill будет работать бесконечно долго, если я не использую CTRL C, чтобы прервать его. Я верю в циклы tcpkill, потому что мой скрипт запускается каждые несколько секунд, чтобы проверить наличие новых предупреждений от идентификаторов.

введите описание изображения здесь

Ниже приведен код, который я нашел для использования tcpkill в скрипте Python3. Я довольно новичок в подпроцессах и потоковой обработке, но я подумал, что эту проблему можно было бы исправить, если бы я отключил все выходные данные tcpkill и автоматически убил команду через 30 секунд, не прерывая остальную часть программы. Возможно ли это или мне следует изучить другой метод сброса/отключения TCP-соединений? Я изучил такие инструменты, как conntrack и iptables, но не похоже, что они убивают/сбрасывают установленное TCP-соединение для меня (возможно, я использую их неправильно). Все мои системы в настоящее время работают под управлением Ubuntu 18.04, за исключением атакующей машины, использующей Kali Linux.

 def kill_connection(address, interface):  tcp_kill(address,interface)  t = threading.Thread(target=tcp_kill, args=(address, interface))  t.daemon = True  t.start()    def tcp_kill(address, interface):  p = subprocess.Popen(f'sudo tcpkill host {address}', stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True)  time.sleep(10)  p.terminate()  

Я не уверен, поможет ли это, но я опубликую код, который вызывает эти функции. При необходимости я могу опубликовать полный исходный код.

 def add_faucet_yaml(block_addresses):   #Global variable to store ACL rules added  global global_acl_rules   #Error handling  try:  #Reads Faucet YAMAL file  faucet_yaml = open("/etc/faucet/faucet.yaml")  yaml_data = yaml.load(faucet_yaml, Loader=yaml.FullLoader)  faucet_yaml.close()   except Exception as e:  print(f"Error Code: {e}")  SystemExit(1)   for address in block_addresses:   #Template for ACL to block IP address (192.168.50.10) or network using (192.168.50.0/24)  new_rule = {'rule': {'dl_type': 2048, 'ipv4_src': '', 'ipv4_dst': '192.168.50.0/24', 'actions': {'allow': False}}}  new_rule['rule']['ipv4_src'] = address   #Checks if rule exists  if new_rule not in yaml_data['acls']['block-addresses']:    #Adds rule to beginning of YAML ACL dictionary  yaml_data['acls']['block-addresses'].insert(0, new_rule)    #Appends current time the ACL was added  global_new_rule = dict(new_rule)   #Records current datetime of ACL being added  current_datetime = datetime.datetime.now()   #Add 1 minute from current time  minutes_added = datetime.timedelta(minutes=1)   #Date time of ACL to be removed  future_datetime = current_datetime   minutes_added  global_new_rule['time_to_remove'] = str(future_datetime)  global_acl_rules.append(global_new_rule)  print(f"Blocking {address} until {future_datetime}")   #Error handling   try:  #Writes new rules to Faucet YAML file  faucet_yaml = open("/etc/faucet/faucet.yaml", "w")  yaml.dump(yaml_data, faucet_yaml)  faucet_yaml.close()   #Reloads faucet  os.system("sudo systemctl reload faucet")   #Kills established TCP connections  kill_connection(address, "vi0")     except Exception as e:  print(f"Error Code: {e}")  SystemExit(1)   #If rule is in YAML, extend duration of temporary block  else:   #Records current datetime of ACL being added  current_datetime = datetime.datetime.now()   #Add 1 minute from current time  minutes_added = datetime.timedelta(minutes=1)   #Date time of ACL to be removed  future_datetime = current_datetime   minutes_added   #Loops through ACL rules to identify rule with maliicous IPv4 address  for global_rule in global_acl_rules:   if new_rule['rule']['ipv4_src'] == global_rule['rule']['ipv4_src']:   global_rule['time_to_remove'] = str(future_datetime)   print(f"Extending {global_rule['rule']['ipv4_src']} block time to {future_datetime}")