Conceitos avançados de Networking: [03] Roteando o tráfego TCP/IP
O propósito do Networking é conseguir fazer com que o tráfego chegue do ponto A ao ponto B. Quando um computador requisita informação de outro, pacotes são roteados ao destino e então retornam. Em muitas situações, os computadores precisam de assistência em como fazer os pacotes chegar ao destino. Isso é conhecido por roteamento. Para assistir isso, nós utilizam o conceito de tabela de roteamento para auxiliar na decisão para onde os pacotes deverão ser enviados para chegar ao seu destino. Não haveria muitas dificuldades se cada rede tivesse o mesmo esquema de IPs, no entanto, há grandes diferenças. Para um computador realizar uma transmissão em uma rede específica, ele deve saber como funciona aquela rede. É como se houvesse uma tabela de roteamento para mapear os destinos e os gateways para alcançar aqueles destinos.
Para melhor entender isso, é necessário compreender o conceito de gateway padrão. Tipicamente, o gateway padrão é um roteador que entende como se comunicar com outras redes. Quando é enviada uma requisição de informação narede, os pacotes atravessam ao gateway local padrão até outras redes. No caso de um pequeno escritório ou rede doméstica, o gateway padrão é provavelmente o roteador presente entre a rede e o restante do mundo. Adicionalmente, é também entre o seu dispositivo local e todos os outros dispositivos dentro da rede. Sem um gateway padrão, ele não será capaz de se comunicar com a rede no todo.
Para visualizar o gateway padrão, execute o comando ip route e encontre a linha que indica qual é ele.
Saída do comando ip route
Sem um gateway padrão, ou sem um devidamente configurado, não será possível conectar a outros nós dentro da rede. Em muitos casos, o gateway padrão da rede é adicionado na tabela de roteamento uma vez que é recebido um endereço via DHCP. Se você está usando a configuração de IP estático, você pode manualmente configurar o gateway padrão no Debian via /etc/network/interfaces, ou o or init script para a sua placa de rede no Fedora (tal como /etc/sysconfig/network-scripts/ifcfg-eno1).
Há uma amostra dos arquivos de configuração abaixo com algumas linhas em negrito.
O arquivo /etc/network/interfaces (Debian):
iface lo inet loopback
allow-hotplug eth0
iface eth0 inet dhcp
# The primary network interface
allow-hotplug eth1
iface eth1 inet static
address 10.10.96.1
netmask 255.255.252.0
gateway 10.10.96.1
broadcast 10.10.96.255
dns-search local.lan
dns-nameservers 10.10.96.1
O arquivo /etc/sysconfig/network-scripts/ifcfg-eno1 (Fedora):
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
NAME=eno1
UUID=8e6587dd-74ec-488f-8597-a04c4a4c5091
DEVICE=eno1
ONBOOT=yes
IPADDR="10.10.96.4"
NETMASK="255.255.252.0"
GATEWAY="10.10.96.1"
O gateway pode ser configurado manulmente pelo terminal de comando, como segue abaixo:
# route add default gw 10.10.10.1 eth0
Se o comando route não for reconhecido pelo sistema, o pacote net-tools precisa ser instalado.
O comando route é usado para adicionar uma nova rota; nesse caso está sendo adicionado um novo gateway (default gw). Nesse caso, está sendo configurado o gateway para 10.10.10.1 e ligando ele à interface eth0. No entanto, essa mudança não é permanente e ao computador ou a rede, e será perdida, a menos que seja inserida permanentemente atualizando o init script da interface.
Para visualizar a tabela de roteamento, simplesmente execute o comando route -n sem qualquer argumento. Se o comando não for encontrado, será necessário executar a partir de /sbin/route ou executá-lo como usuário root. Quando for executado esse comando, será exibindo uma tabela de roteamento. E também mostrará o gateway padrão.
Saída do comando route -n
O primeiro tópico que será discutido é o IP 0.0.0.0. Em termos de networking, ele se refere à tudo. Como foi visto no exemplo anterior, o gateway de destino 0.0.0.0 na rede é 192.168.1.1. Portanto, qualquer comunicação é enviada a esse IP, afinal ele é o gateway padrão. Há outras redes mostradas nessa tabela. Nesse exemplo, ele se refere a instâncias do Docker executando em uma máquina de teste assim como ocorre na virtualização KVM, e cada um possui sua rede virtual própria. Como todos estão rodando no mesmo computador, o gateway local é: 0.0.0.0.
Um computador com Linux pode facilmente atuar como um roteador, sem a necessidade de equipamentos de rede adicionais, auxiliando a reduzir os custos da rede. Essa flexibilidade torna o Linux uma escolha proeminente para a rede, e hardware baseado em Linux estão se tornando cada vez mais comuns. Isso é devido à facilidade de configuração do sistema Linux como um roteador. Em resumo, tudo que é necessário para que um computador com Linux se torne um roteador é possuir diversas placas de rede instaladas nele. Cada placa terá seu próprio gateway, então você pode configurar o modo como o gateway padrão para eth0 anteriormente nessa seção. Você pode fazer o mesmo com eth1, eth2, ou qualquer outras interfaces que hajam no sistema.
No entanto, há um impedimento. Com a maioria das distribuições Linux, roteamento entre as interfaces da rede geralmente é desabilitada por padrão, e o próximo passo é garantir que esteja habilitada.
Em primeiro lugar, deve ser checado se o _status_ do roteamento da interface de rede, com o comando abaixo:
cat /proc/sys/net/ipv4/ip_forward
Se esse comando retornar 1, o roteamento da interface de rede está habilitado, e não será necessário fazer nenhuma modificação. Caso retorne 0, execute o comando abaixo para habilitá-lo (como root):
echo 1 > /proc/sys/net/ipv4/ip_forward
E assim está habilitado o roteamento entre interfaces (redirecionamento).
No entanto, a mudança não é para ser permanente. Uma vez reiniciado o sistema a possibilidade de ser revertida para o padrão é alta. Para torná-la permanente é necessário editar o arquivo /etc/sysctl.conf com o editor de texto favorito (como root) e adicionar a seguinte linha no final do arquivo:
net.ipv4.ip_forward = 1
Agora permanentemente a configuração foi aplicada.
Para garantir que o roteamento seja efeito é necessário que os pacotes que serão transmitidos sejam alterados e possam ser identificados pela outra rede. Para isso há o protocolo de Tradução de Endereços de Rede (NAT). O uso mais comum do NAT é manter endereços IP sem precisar de atualização, e cujo quantid total é um limitante para a disponibilidade do IPv4 atualmente. O Provedor de Serviço de Internet (ISP) concede ao usuário um IP, e que é visível ao mundo todo. Mas dentro da rede local, há diversos dispositivos conectados à mesma conexão de Internet. Cada um desses dispositivos tem um endereço IP dados a eles pelo servidor DHCP, mas esse endereço IP é local e não é roteável ao restante do mundo. Nesse caso o roteador mantém registro dos pacotes que entram e saem de cada um dos dispositivos, e altera os pacotes para que eles não sejam misturados e sejam direcionados ao local adequado.
Por exemplo, em uma rede tendo um smartphone e um desktop, aonde site é acessado no smartphone. Seu roteador envia a requisição para a Internet, e entrega o resultado. Basicamente, seu roteador faz o que o smartphone pediu. Quando os pacotes retornam do site, o endereço de destino dos pacotes são alterados conforme o endereço IP, até a máquina que requisitou a informação. Desse modo, é possível garantir que o smartphone terá os dados recebidos.
É possível alterar manualmente o endereço de destino, fazendo com que o NAT assista os pacotes de outras redes que os dispositivos da rede local não possuem meios de detectar. Para alterar manualmente, é necessário usar o comando ip rule. Utilizar esse comando faz com que o destino seja alterado baseado no dispositivo que gerou esse tráfego. No código abaixo, por exemplo:
# ip rule add nat 10.10.10.1 from 192.168.1.134
Os pacotes enviados do IP 192.168.1.134 são reescritos para serem direcionados ao IP 10.10.10.1.
Isso pode ser realizado para qualquer operação em que seja necessário realizar NATing.
No próximo tutorial será abordado como criar servidores de redundância para os protocolos DHCP e DNS, para avançar clique aqui.
Para melhor entender isso, é necessário compreender o conceito de gateway padrão. Tipicamente, o gateway padrão é um roteador que entende como se comunicar com outras redes. Quando é enviada uma requisição de informação narede, os pacotes atravessam ao gateway local padrão até outras redes. No caso de um pequeno escritório ou rede doméstica, o gateway padrão é provavelmente o roteador presente entre a rede e o restante do mundo. Adicionalmente, é também entre o seu dispositivo local e todos os outros dispositivos dentro da rede. Sem um gateway padrão, ele não será capaz de se comunicar com a rede no todo.
Para visualizar o gateway padrão, execute o comando ip route e encontre a linha que indica qual é ele.
Saída do comando ip route
Sem um gateway padrão, ou sem um devidamente configurado, não será possível conectar a outros nós dentro da rede. Em muitos casos, o gateway padrão da rede é adicionado na tabela de roteamento uma vez que é recebido um endereço via DHCP. Se você está usando a configuração de IP estático, você pode manualmente configurar o gateway padrão no Debian via /etc/network/interfaces, ou o or init script para a sua placa de rede no Fedora (tal como /etc/sysconfig/network-scripts/ifcfg-eno1).
Há uma amostra dos arquivos de configuração abaixo com algumas linhas em negrito.
O arquivo /etc/network/interfaces (Debian):
iface lo inet loopback
allow-hotplug eth0
iface eth0 inet dhcp
# The primary network interface
allow-hotplug eth1
iface eth1 inet static
address 10.10.96.1
netmask 255.255.252.0
gateway 10.10.96.1
broadcast 10.10.96.255
dns-search local.lan
dns-nameservers 10.10.96.1
O arquivo /etc/sysconfig/network-scripts/ifcfg-eno1 (Fedora):
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
NAME=eno1
UUID=8e6587dd-74ec-488f-8597-a04c4a4c5091
DEVICE=eno1
ONBOOT=yes
IPADDR="10.10.96.4"
NETMASK="255.255.252.0"
GATEWAY="10.10.96.1"
O gateway pode ser configurado manulmente pelo terminal de comando, como segue abaixo:
# route add default gw 10.10.10.1 eth0
Se o comando route não for reconhecido pelo sistema, o pacote net-tools precisa ser instalado.
O comando route é usado para adicionar uma nova rota; nesse caso está sendo adicionado um novo gateway (default gw). Nesse caso, está sendo configurado o gateway para 10.10.10.1 e ligando ele à interface eth0. No entanto, essa mudança não é permanente e ao computador ou a rede, e será perdida, a menos que seja inserida permanentemente atualizando o init script da interface.
Para visualizar a tabela de roteamento, simplesmente execute o comando route -n sem qualquer argumento. Se o comando não for encontrado, será necessário executar a partir de /sbin/route ou executá-lo como usuário root. Quando for executado esse comando, será exibindo uma tabela de roteamento. E também mostrará o gateway padrão.
Saída do comando route -n
O primeiro tópico que será discutido é o IP 0.0.0.0. Em termos de networking, ele se refere à tudo. Como foi visto no exemplo anterior, o gateway de destino 0.0.0.0 na rede é 192.168.1.1. Portanto, qualquer comunicação é enviada a esse IP, afinal ele é o gateway padrão. Há outras redes mostradas nessa tabela. Nesse exemplo, ele se refere a instâncias do Docker executando em uma máquina de teste assim como ocorre na virtualização KVM, e cada um possui sua rede virtual própria. Como todos estão rodando no mesmo computador, o gateway local é: 0.0.0.0.
Um computador com Linux pode facilmente atuar como um roteador, sem a necessidade de equipamentos de rede adicionais, auxiliando a reduzir os custos da rede. Essa flexibilidade torna o Linux uma escolha proeminente para a rede, e hardware baseado em Linux estão se tornando cada vez mais comuns. Isso é devido à facilidade de configuração do sistema Linux como um roteador. Em resumo, tudo que é necessário para que um computador com Linux se torne um roteador é possuir diversas placas de rede instaladas nele. Cada placa terá seu próprio gateway, então você pode configurar o modo como o gateway padrão para eth0 anteriormente nessa seção. Você pode fazer o mesmo com eth1, eth2, ou qualquer outras interfaces que hajam no sistema.
No entanto, há um impedimento. Com a maioria das distribuições Linux, roteamento entre as interfaces da rede geralmente é desabilitada por padrão, e o próximo passo é garantir que esteja habilitada.
Em primeiro lugar, deve ser checado se o _status_ do roteamento da interface de rede, com o comando abaixo:
cat /proc/sys/net/ipv4/ip_forward
Se esse comando retornar 1, o roteamento da interface de rede está habilitado, e não será necessário fazer nenhuma modificação. Caso retorne 0, execute o comando abaixo para habilitá-lo (como root):
echo 1 > /proc/sys/net/ipv4/ip_forward
E assim está habilitado o roteamento entre interfaces (redirecionamento).
No entanto, a mudança não é para ser permanente. Uma vez reiniciado o sistema a possibilidade de ser revertida para o padrão é alta. Para torná-la permanente é necessário editar o arquivo /etc/sysctl.conf com o editor de texto favorito (como root) e adicionar a seguinte linha no final do arquivo:
net.ipv4.ip_forward = 1
Agora permanentemente a configuração foi aplicada.
Para garantir que o roteamento seja efeito é necessário que os pacotes que serão transmitidos sejam alterados e possam ser identificados pela outra rede. Para isso há o protocolo de Tradução de Endereços de Rede (NAT). O uso mais comum do NAT é manter endereços IP sem precisar de atualização, e cujo quantid total é um limitante para a disponibilidade do IPv4 atualmente. O Provedor de Serviço de Internet (ISP) concede ao usuário um IP, e que é visível ao mundo todo. Mas dentro da rede local, há diversos dispositivos conectados à mesma conexão de Internet. Cada um desses dispositivos tem um endereço IP dados a eles pelo servidor DHCP, mas esse endereço IP é local e não é roteável ao restante do mundo. Nesse caso o roteador mantém registro dos pacotes que entram e saem de cada um dos dispositivos, e altera os pacotes para que eles não sejam misturados e sejam direcionados ao local adequado.
Por exemplo, em uma rede tendo um smartphone e um desktop, aonde site é acessado no smartphone. Seu roteador envia a requisição para a Internet, e entrega o resultado. Basicamente, seu roteador faz o que o smartphone pediu. Quando os pacotes retornam do site, o endereço de destino dos pacotes são alterados conforme o endereço IP, até a máquina que requisitou a informação. Desse modo, é possível garantir que o smartphone terá os dados recebidos.
É possível alterar manualmente o endereço de destino, fazendo com que o NAT assista os pacotes de outras redes que os dispositivos da rede local não possuem meios de detectar. Para alterar manualmente, é necessário usar o comando ip rule. Utilizar esse comando faz com que o destino seja alterado baseado no dispositivo que gerou esse tráfego. No código abaixo, por exemplo:
# ip rule add nat 10.10.10.1 from 192.168.1.134
Os pacotes enviados do IP 192.168.1.134 são reescritos para serem direcionados ao IP 10.10.10.1.
Isso pode ser realizado para qualquer operação em que seja necessário realizar NATing.
No próximo tutorial será abordado como criar servidores de redundância para os protocolos DHCP e DNS, para avançar clique aqui.
Comentários
Postar um comentário