dnsmasq неправильно привязывается к 0.0.0.0 :67 для DHCP при правильном прослушивании 10.0.0.1 :53 для DNS-запросов

Хорошо, частичный ответ:

Виртуальная машина видит только предоставленное ей оборудование. Это может быть «настоящее» оборудование, «украденное» с физической машины, на которой работает виртуальная машина, или это может быть «симулированное» оборудование, такое как USB-концентратор и мышь VMware.

Не зная вашей ситуации, предполагая, что USB-устройство чтения смарт-карт подключено к физической машине, оно вообще не будет отображаться на виртуальной машине, если только оно не назначено этой машине.

Поэтому вам нужно попросить того, кто управляет виртуальной машиной, назначить ее вашей машине.

0
25.05.2021, 13:43
1 ответ

Проблема в dhcp.c

  /* When bind-interfaces is set, there might be more than one dnsmasq
     instance binding port 67. That's OK if they serve different networks.
     Need to set REUSEADDR|REUSEPORT to make this possible.
     Handle the case that REUSEPORT is defined, but the kernel doesn't 
     support it. This handles the introduction of REUSEPORT on Linux. */
  if (option_bool(OPT_NOWILD) || option_bool(OPT_CLEVERBIND))
    {
      int rc = 0;

#ifdef SO_REUSEPORT
      if ((rc = setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &oneopt, sizeof(oneopt))) == -1 && 
      errno == ENOPROTOOPT)
    rc = 0;
#endif
      
      if (rc != -1)
    rc = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &oneopt, sizeof(oneopt));
      
      if (rc == -1)
    die(_("failed to set SO_REUSE{ADDR|PORT} on DHCP socket: %s"), NULL, EC_BADNET);
    }


  memset(&saddr, 0, sizeof(saddr));
  saddr.sin_family = AF_INET;
  saddr.sin_port = htons(port);
  saddr.sin_addr.s_addr = INADDR_ANY;
#ifdef HAVE_SOCKADDR_SA_LEN
  saddr.sin_len = sizeof(struct sockaddr_in);
#endif

  if (bind(fd, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in)))
    die(_("failed to bind DHCP server socket: %s"), NULL, EC_BADNET);

Сокет привязан к INADDR _ANY (0.0.0.0 )без каких-либо условий.

Похоже, что намерение автора состоит в том, чтобы несколько dnsmasqs совместно использовали 0.0.0.0 :67 с помощью SO_REUSEPORT. Это нормально для нескольких dnsmasq, но не очень хорошо, когда dnsmasq должен существовать совместно -с другим DHCP-сервером, который не устанавливает SO _REUSEPORT.

Java имеет SO _REUSEADDR, но не SO _REUSEPORT:

packages/modules/NetworkStack/src/android/net/dhcp/DhcpServer.java:642: error: cannot find symbol
                Os.setsockoptInt(mSocket, SOL_SOCKET, SO_REUSEPORT, 1);

, но это можно исправить с помощью:

final int SO_REUSEPORT = 15;
0
28.07.2021, 11:29

Теги

Похожие вопросы