O TCP pode fornecer mais de 65535 portas?

50

É possível configurar um sistema Linux para fornecer mais de 65.535 portas? A intenção seria ter mais de 65 mil daemons ouvindo em um determinado sistema.

Claramente, há portas sendo usadas, então isso não é possível por essas razões, então pense nisso como um exercício teórico na tentativa de entender onde o TCP seria restritivo em fazer algo assim.

    
por slm 18.05.2014 / 05:47

4 respostas

80

Olhando para o RFC para TCP: RFC 793 - Protocolo de Controle de Transmissão , a resposta parece ser devido ao fato de que um cabeçalho TCP é limitado a 16 bits para o campo de porta de origem / destino.

OIPv6melhoraascoisas?

Não.EmboraoIPv6nosforneçaumespaçodeendereçamentoIPmuitomaior,de32bitscontra128bits,elenãotentamelhoraralimitaçãodepacotesTCPde16bitsparaosnúmerosdeportas.Curiosamente,oRFCparaIPv6: Internet Protocol, Versão 6 (IPv6) Specification , o campo IP precisava ser expandido.

When TCP runs over IPv6, the method used to compute the checksum is changed, as per RFC 2460:

Any transport or other upper-layer protocol that includes the addresses from the IP header in its checksum computation must be modified for use over IPv6, to include the 128-bit IPv6 addresses instead of 32-bit IPv4 addresses.

Então,comovocêpodeconseguirmaisportas?

UmaabordagemseriaempilharendereçosIPadicionaisusandomaisinterfaces.SeoseusistemativerváriasNICs,issoémaisfácil,masmesmocomapenasumaúnicaNIC,épossívelfazerusodeinterfacesvirtuais(tambémconhecidascomo aliases ) para alocar mais IPs, se necessário.

OBSERVAÇÃO: O uso de aliases foi suplantado por iproute2 que você pode usar para empilhe endereços IP em uma única interface (ou seja, eth0 ).

Exemplo

$ sudo ip link set eth0 up
$ sudo ip addr add 192.0.2.1/24 dev eth0
$ sudo ip addr add 192.0.2.2/24 dev eth0
$ ip addr show dev eth0
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc
      pfifo_fast state DOWN qlen 1000
    link/ether 00:d0:b7:2d:ce:cf brd ff:ff:ff:ff:ff:ff
    inet 192.0.2.1/24 brd 192.0.2.255 scope global eth1
    inet 192.0.2.2/24 scope global secondary eth1

Fonte: iproute2: Vida após o ifconfig

Referências

por 18.05.2014 / 05:48
7

Is it possible to setup a Linux system so that it provides more than 65,535 ports?

Não.

The intent would be to have more than 65k daemons listening on a given system.

Então você precisa:

  • uma configuração iptables que redireciona o conteúdo do tráfego ou

  • um "service broker service" ou "multiplexor service" que aceitará conexões de entrada em uma única porta e roteará para o daemon apropriado "por trás". Se você quiser que os protocolos padrão passem sem modificações, talvez seja necessário implementar o sniffing / reconhecimento de protocolo neste serviço multiplexador, de maneira que um firewall IDS ou de camada 7 analise; completamente possível com a grande maioria dos protocolos.

Por segundo item, você poderia projetar este serviço para lidar com mais de 2 ^ 16 "portas" se você realmente quisesse. Tenho certeza de que o impacto no desempenho será mínimo comparado com a carga de 2 ^ 16 + ouvintes em execução.

Os daemons no Linux podem estar ouvindo em soquetes unix que existem no sistema de arquivos, portanto, o "serviço de multiplexador" pode manter um mapeamento interno da porta externa < - > soquete interno do unix. Você provavelmente vai correr em um limite de processo do kernel (processos de 32Kbyte?) Antes de ficar sem inodes em qualquer sistema de arquivos moderno.

    
por 18.05.2014 / 19:36
2

Só porque não há uma boa resposta, eu queria entrar em sintonia.

Uma maneira de fazer isso seria adicionar uma opção de IP que especifica a extensão de porta. A opção deve ser projetada para caber dentro da parte opcional do cabeçalho IP e seria ignorada por saltos desconhecidos.

Você usaria essa opção e suas informações para ampliar a origem, o destino ou os dois números de porta.

As limitações não irão funcionar automaticamente no software existente apenas adicionando a opção de qualquer maneira, elas precisarão ser reescritas para aproveitar a opção, não importando como ela é implementada, software e firewalls existentes irão ignorar o pacote ou processo como de costume, usando o valor nos campos de porta de origem e destino.

Em suma, não é fácil de fazer e seria melhor feito usando um único ouvinte reutilizável e dados contidos na carga útil do pacote.

Você também pode permitir mais facilmente a reutilização de porta no software, o que pode ajudar a superar essa limitação, reutilizando as portas do servidor para várias conexões de cliente.

O Rtsp, por exemplo, pode usar o cabeçalho SessionId em conjunto com vários outros cabeçalhos na carga útil do pacote IP para determinar a conexão para a qual a solicitação foi emitida e agir de acordo, e. se o soquete a partir do qual a mensagem foi entregue não for igual ao endereço remoto do soquete ao qual a sessão corresponde, será possível permitir que uma sessão seja atualizada com o novo soquete para processamento, negar a mensagem ou uma variedade de outras ações. dependendo da aplicação.

Um servidor HTTP também pode fazer isso ou qualquer outro tipo de servidor.

A principal coisa a lembrar ao permitir a reutilização de portas é que você também deve levar em conta o endereço IP de origem.

    
por 17.02.2016 / 21:29
-1

Sim, você pode!

Já foi feito antes, por exemplo, o servidor de criptografia Edgehill, que tem > 25.000.000 deamons correndo on-line.

    
por 13.10.2014 / 00:21