TL;DR: не используйте Netcat, используйте Socat для экспериментов. Он справляется с чем-то лучше.
почему это не работает не про именованные каналы (даже если это ужасный способ с другими проблемами скрывается), но ограничение для netcat.
как только Netcat получает UDP-соединение, он связывается с ним. Таким образом, он больше не слушает порт 53, он подключен к порту, который отправил исходный пакет, точно так же, как и с TCP. Каждый раз вы делаете запрос DNS, инструмент изменит порт и Netcat никогда не получит запрос. Так что сработает только первый запрос.
при настройке примера, попробуйте эту команду перед первым запросом:
netstat -aunp|grep -w 53
udp 0 0 0.0.0.0:53 0.0.0.0:* 12316/nc.openbsd
выполните запрос (только рабочий) и повторите попытку netstat:
# netstat -aunp|grep -w 53
udp 0 0 127.0.0.1:53 127.0.0.1:44335 ESTABLISHED 12316/nc.openbsd
Как видите netcat только что сменил режим: от прослушивания до перебора соединения. Поскольку это UDP, Netcat не будет знать автоматически "установленное соединение" больше нет.
у меня есть доказательство концепции (что заставляет его работать и показывает, что проблема связана с этим режимом UDP), но для этого требуется socat в дополнение к netcat на клиенте. Цель состоит в том, чтобы все запросы достигали netcat, используя тот же UDP source порт. Ничего не меняется на стороне сервера, но я вставляю socat в начале цепочки (так что последняя команда), чтобы заставить исходный порт запроса UDP в Netcat.
во-первых, на стороне клиента, сделать это:
ssh -N -L 6667:localhost:6667 user@server
затем на стороне сервера этого:
mkfifo /tmp/fifo
nc -k -l 6667 < /tmp/fifo | nc -u ip_of_dns_server 53 > /tmp/fifo
наконец, обратно на стороне клиента сделать это:
mkfifo /tmp/fifo
nc -k -l -u 5555 < /tmp/fifo | nc 127.0.0.1 6667 > /tmp/fifo
socat udp4-listen:53,reuseaddr,fork udp:127.0.0.1:5555,sourceport=55550,reuseaddr
теперь я могу сделать несколько запросов.
перед 1-м запросом:
# netstat -aunp|egrep -w '53|5555'
udp 0 0 0.0.0.0:5555 0.0.0.0:* 12715/nc.openbsd
udp 0 0 0.0.0.0:53 0.0.0.0:* 12717/socat
после 1:
udp 0 0 127.0.0.1:55550 127.0.0.1:5555 ESTABLISHED 12736/socat
udp 0 0 127.0.0.1:5555 127.0.0.1:55550 ESTABLISHED 12715/nc.openbsd
udp 0 0 0.0.0.0:53 0.0.0.0:* 12717/socat
после 2-й запрос:
udp 0 0 127.0.0.1:55550 127.0.0.1:5555 ESTABLISHED 12750/socat
udp 0 0 127.0.0.1:5555 127.0.0.1:55550 ESTABLISHED 12715/nc.openbsd
udp 0 0 0.0.0.0:53 0.0.0.0:* 12717/socat
udp 0 0 127.0.0.1:53 127.0.0.1:53255 ESTABLISHED 12750/socat
Socat будет страдать той же проблемой, но с fork
option, он слушает снова, и кажется, что он обнаруживает предыдущее потерянное "соединение"; I думаю, это вызывает задержку.
вы можете получить старое поведение (работает один раз), если вы просто удалите ,sourceport=55550,reuseaddr
участие в команде socat.