Estou tentando implementar um ouvinte TCP que aceita conexões e, em seguida, simplesmente descarta todas as suas entradas (é para um chicote de teste).
No momento, estou usando socat - tcp-listen:2003,fork,reuseaddr
, mas isso imprime a entrada para stdout. Eu não quero isso.
Não consigo redirecionar a saída para /dev/null
, porque estou fazendo isso no contêiner docker alpine/socat e, na verdade, não está usando um shell, portanto, o redirecionamento não funciona.
Se eu tentar usar socat /dev/null tcp-listen:2003,fork,reuseaddr
, qualquer conexão será descartada imediatamente, provavelmente porque socat
não é possível ler arquivos /dev/null
.
Qual é a melhor maneira de implementar um ouvinte TCP que simplesmente joga tudo no chão?
Melhor é um critério complicado, mas pode-se observar que o Docker é tão necessário para isso quanto o Microsoft Excel. ☺
Já conhecemos um programa Unix que lê sua entrada até o EOF e efetivamente a descarta:
Transformar isso em um servidor TCP é um exercício muito simples. É disso que trata o UCSPI-TCP. Ele pega programas que usam E/S padrão e envolve uma estrutura simples em torno deles que os transforma em servidores TCP. Pode-se substituir por outra coisa
cat
e alterar o protocolo de serviço sem ter que se preocupar com o transporte. Da mesma forma, pode-se substituir as ferramentas UCSPI-LOCAL por ferramentas UCSPI-TCP e alterar o transporte, sem ter que fazer nada paracat
.Existem vários conjuntos de ferramentas UCSPI-TCP. Daniel J. Bernstein escreveu um. Laurent Bercot escreveu um. Gerrit Pape escreveu um. Adam Sampson escreveu um. Eu escrevi um. Além disso, pode-se misturar e combinar ferramentas de vários conjuntos de ferramentas, sendo essas coisas intencionalmente prontamente compostas. Pode-se usar my
fdredir
ou Laurent Bercot'sredirfd
, ou até mesmo gerar um arquivosh
. (Os dois primeiros têm uma sobrecarga menor do que um full-blownsh
, e para as ferramentas noshfdredir
é até embutido, para evitar ainda mais a sobrecarga de encadeamento por meio de um comando externo.)Portanto, existem várias maneiras de fazer isso:
tcpserver
(original ou djbwares; sem suporte IPv6)tcpserver -R -H -l 0 0.0.0.0 2003 fdredir --write 1 /dev/null cat
tcpserver -R -H -l 0 0.0.0.0 2003 redirfd -w 1 /dev/null cat
tcpserver -R -H -l 0 0.0.0.0 2003 sh -c 'exec > /dev/null cat'
tcpserver
(faz IPv4 e IPv6; tem padrões originais de Bernstein para pesquisas de DNS e INFO que precisam ser desativados)tcpserver -R -H -l 0 ::0 2003 fdredir --write 1 /dev/null cat
tcpserver -R -H -l 0 ::0 2003 redirfd -w 1 /dev/null cat
tcpserver -R -H -l 0 ::0 2003 sh -c 'exec > /dev/null cat'
tcpserver
shim (faz IPv4 e IPv6, mas precisa executar instâncias separadas para cada um; tem padrões mais modernos)tcpserver ::0 2003 fdredir --write 1 /dev/null cat
tcpserver ::0 2003 redirfd -w 1 /dev/null cat
tcpserver ::0 2003 sh -c 'exec > /dev/null cat'
tcp-socket-listen --combine4and6 ::0 2003 tcp-socket-accept fdredir --write 1 /dev/null cat
tcp-socket-listen --combine4and6 ::0 2003 tcp-socket-accept redirfd -w 1 /dev/null cat
tcp-socket-listen --combine4and6 ::0 2003 tcp-socket-accept sh -c 'exec > /dev/null cat'
s6-tcpserver6
(substitutos6-tcpserver4
para IPv4)s6-tcpserver6 ::0 2003 fdredir --write 1 /dev/null cat
s6-tcpserver6 ::0 2003 redirfd -w 1 /dev/null cat
s6-tcpserver6 ::0 2003 sh -c 'exec > /dev/null cat'
s6-tcpserver4
para IPv4)s6-tcpserver6-socketbinder -B ::0 2003 s6-tcpserver6d fdredir --write 1 /dev/null cat
s6-tcpserver6-socketbinder -B ::0 2003 s6-tcpserver6d redirfd -w 1 /dev/null cat
s6-tcpserver6-socketbinder -B ::0 2003 s6-tcpserver6d sh -c 'exec > /dev/null cat'
tcpsvd
(sem suporte IPv6)tcpsvd 0.0.0.0 2003 fdredir --write 1 /dev/null cat
tcpsvd 0.0.0.0 2003 redirfd -w 1 /dev/null cat
tcpsvd 0.0.0.0 2003 sh -c 'exec > /dev/null cat'
onenetd
(faz IPv4 e IPv6, mas precisa executar instâncias separadas para cada um)onenetd -6 ::0 2003 fdredir --write 1 /dev/null cat
onenetd -6 ::0 2003 redirfd -w 1 /dev/null cat
onenetd -6 ::0 2003 sh -c 'exec > /dev/null cat'
Aproveite a substituição
ou (semsh
) para o programa do servidor para que você obtenha um log local do que o programa cliente em teste está fazendo. ☺Leitura adicional
tcpserver
programa . ucspi-tcp.tcpserver
. ucspi-tcp6 . fehcom.de.s6-tcpserver4
. Laurent Bercot. s6-rede . skarnet.org.s6-tcpserver6
. Laurent Bercot. s6-rede . skarnet.org.fdmove
. Laurent Bercot. executar . skarnet.org.redirfd
. Laurent Bercot. executar . skarnet.org.tcpsvd
. ipsvd . Gerrit Pap. smarten.org.tcpserver
. djbwares . Programas.fdredir
. Guia de no . Programas.fdmove
. Guia de no . Programas.tcp-socket-listen
. Guia de no . Programas.tcp-socket-accept
. Guia de no . Programas.tcpserver
. Guia de no . Programas.