Redirecionamento de portas, também conhecido como mapeamento de portas, é um método para permitir que dispositivos remotos se conectem a um serviço específico dentro da sua rede local privada (LAN). Como o nome sugere, o processo envolve o redirecionamento de solicitações de uma porta específica para outra porta ou rede. Ele modifica o destino do pacote em trânsito e é considerado um tipo de operação de tradução de endereço de rede (NAT).
Ativar o redirecionamento de portas permite que os dispositivos ou hosts não conectados à rede interna acessem uns aos outros, o que de outra forma seria restrito quando desativado. Você pode aproveitar os benefícios do redirecionamento de portas para bloquear sites de destino, melhorar a segurança e contornar o firewall NAT conforme sua conveniência.
Neste tutorial, vamos orientá-lo pelas etapas de redirecionamento de portas com o iptables no Linux.
Pré-requisitos
Para acompanhar este tutorial, você precisará de:
- Ubuntu instalado no seu sistema.
- Dois hosts Ubuntu 20.04 no mesmo data center com rede privada ativada.
- Conta de usuário não-root configurada com privilégios sudo em cada máquina.
Detalhes do Host
Primeiro, precisamos saber os detalhes das interfaces e endereços dos servidores em funcionamento. Vamos verificar as interfaces de rede do nosso sistema:
|
1 |
ip -4 addr show scope global |
Você verá a saída:
|
1 2 3 4 5 6 7 8 9 |
Exemplo de Saída 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 198.51.100.45/18 brd 45.55.191.255 scope global eth0 valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 192.168.1.5/16 brd 10.132.255.255 scope global eth1 valid_lft forever preferred_lft forever |
Aqui, a saída destacada mostra duas interfaces, a primeira eth0 atribuída ao endereço 192.51.100.45, e a segunda eth1 atribuída ao endereço 192.168.1.5. Dessas duas interfaces, uma é pública e a outra é privada. Executaremos um comando para distinguir entre as duas e descobrir a interface pública, aquela conectada ao seu gateway padrão. Para distinguir, digite:
|
1 |
ip route show | grep default= |
Você verá a saída:
|
1 2 3 |
Saída: ip route show | grep default |
Dados Fictícios para o Tutorial
Usaremos endereços e atribuições de interface fictícios ao longo deste tutorial. Você é livre para usar esses dados ou substituí-los, conforme sua conveniência.
Detalhes de rede do servidor web:
-
Endereço IP Público: 203.0.113.2
-
Endereço IP Privado: 192.0.2.2
-
Interface Pública: eth0
-
Interface Privada: eth1
Detalhes de rede do firewall:
-
Endereço IP Público: 203.0.113.15
-
Endereço IP Privado: 192.0.2.15
-
Interface Pública: eth0
-
Interface Privada: eth1
Configuração do Servidor Web
Vamos começar com o nosso host do servidor web. Primeiro, faça login com seu sudo usuário.
Instalar o Nginx
Primeiro, vamos instalar o Nginx em nosso host de servidor web e bloqueá-lo para que ele escute apenas em sua interface privada. Isso permitirá que nosso servidor web esteja disponível apenas se tivermos configurado o redirecionamento de portas de maneira correta.
Em seguida, atualize o cache de pacotes local e use o apt para baixar e instalar o Nginx:
|
1 |
sudo apt-get update |
|
1 |
sudo apt-get install nginx |
Adicionar Restrições
Depois de instalar o Nginx em nosso host de servidor web, vamos bloqueá-lo para garantir que ele aceite entradas de interfaces privadas e de nenhum outro lugar. Além disso, isso garantirá que nossos servidores web fiquem ativos apenas se a configuração de redirecionamento de portas estiver correta.
Para adicionar restrições, abra o arquivo de configuração padrão do bloco do servidor /etc/nginx/sites-enabled/default em qualquer editor de texto de sua escolha (aqui estamos usando o editor de texto nano) e digite:
|
1 |
sudo nano /etc/nginx/sites-enabled/default |
Na saída, você verá a diretiva listen aparecendo duas vezes:

Neste tutorial, estamos usando a primeira diretiva para demonstrar o encaminhamento IPv4. A segunda, que está configurada para IPv6, pode ser removida. Adicione o endereço IP privado do seu servidor web com dois pontos logo antes do 80 para informar ao Nginx para aceitar entradas apenas da interface privada. Em seguida, edite a diretiva:

Depois de concluído, salve e feche o arquivo. Antes de prosseguir, certifique-se de que não há erros de sintaxe. Vamos testar o arquivo:
|
1 |
sudo nginx -t |

Se nenhum erro for exibido, você pode reiniciar o Nginx e habilitar a nova configuração:
|
1 |
sudo service nginx restart |
Verificação da Restrição de Rede
Vamos verificar o nível de acesso que temos ao nosso servidor web. Tente acessar o servidor web usando a interface privada usando o curl comando:
|
1 |
curl --connect-timeout 5 192.0.2.2 |
Você verá a saída:

Se tentarmos usar a interface pública, não conseguiremos nos conectar:
|
1 |
curl --connect-timeout 5 203.0.113.2 |
|
1 |
curl: (7) Falha ao conectar a 203.0.113.2 porta 80: Conexão recusada |
Isso é exatamente o que esperávamos.
Configurar o Firewall para Encaminhar a Porta 80
Vamos progredir com o nosso trabalho implementando o encaminhamento de portas em nossa máquina de firewall.
Habilitar o Encaminhamento no Kernel
Por padrão, a maioria dos sistemas tem o encaminhamento de portas DESATIVADO. Faremos alterações para ATIVAR o encaminhamento de portas fazendo algumas edições. Além disso, há uma opção para ATIVAR o encaminhamento de portas permanentemente usando os privilégios sudo conforme mostrado nas próximas etapas.
Para ATIVAR o encaminhamento de tráfego no nível do kernel, digite:
|
1 |
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward |
Para ATIVAR o encaminhamento de portas permanentemente, edite o arquivo /etc/sysctl.conf . Abra o arquivo com privilégios sudo e digite:
|
1 |
sudo nano /etc/sysctl.conf |
Dentro dele, encontre e desmarque a linha que se parece com esta:
|
1 |
net.ipv4.ip_forward=1 |
Depois de concluído, salve e feche o arquivo. Em seguida, use os comandos sysctl para aplicar as alterações nas configurações para torná-las efetivas:
|
1 |
sudo sysctl -p |
|
1 |
sudo sysctl --system |
Configuração Básica do Firewall
Primeiro, consulte o guia sobre como configurar um firewall básico em sua máquina. Após a conclusão, você terá:
- Instalado o iptables-persistent
- Salvo o conjunto de regras padrão em /etc/iptables/rules.v4
- Conhecimento abrangente sobre como adicionar e modificar regras usando o iptables comando
Além disso, você pode conferir como listar e excluir regras do Firewall iptables.
Adicionando as Regras de Encaminhamento
Configuraremos nosso firewall para garantir que o tráfego que entra em nossa interface pública ( eth0 ) na porta 80 seja encaminhado para nossa interface privada ( eth1). Por padrão, nosso firewall básico tem uma cadeia FORWARD definida para DROP tráfego. A adição de regras de firewall permitirá conexões de encaminhamento para o nosso servidor web. Para adicionar segurança, bloquearemos as regras do firewall para permitir solicitações de encaminhamento.
Na cadeia FORWARD, aceitaremos novas conexões destinadas à porta 80 vindas de nossa interface pública e direcionadas para nossa interface privada. Identificaremos as novas conexões com a ajuda da extensão conntrack e as representaremos por um pacote TCP SYN :
|
1 |
sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT |
Você precisa permitir qualquer tráfego subsequente em ambas as direções resultante da conexão de entrada. Digite os comandos abaixo para permitir o tráfego ESTABLISHED e RELATED entre nossas interfaces pública e privada:
|
1 |
iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
|
1 |
iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT |
Vamos verificar se a nossa política na FORWARD chain está definida para DROP:
|
1 |
sudo iptables -P FORWARD DROP |
Até agora, adicionamos algumas regras que permitem que o tráfego entre as nossas interfaces pública e privada passe pelo nosso firewall. No entanto, iptables ainda não está informado para direcionar o tráfego porque a configuração das regras do firewall ainda não foi feita. Nos próximos passos, adicionaremos as regras de NAT e ajustaremos o conjunto de regras permanentes para direcionar o tráfego.
Adicionando as Regras de NAT para Direcionar Pacotes
Realizaremos duas operações distintas para que o iptables altere corretamente os pacotes e simplifique a comunicação com os clientes e o servidor web.
DNAT é a primeira operação que inicia a PREROUTING chain da tabela nat A operação altera o endereço de destino do pacote e permite que ele seja roteado corretamente ao passar entre as redes. No entanto, os clientes na rede pública se conectarão ao nosso servidor de firewall e não terão informações sobre a topologia da nossa rede privada. Para passar informações com a rede privada, altere o endereço de destino de cada pacote para permitir que ele chegue corretamente ao nosso servidor web de destino.
É crucial notar que estamos focando na configuração do redirecionamento de portas. Realizar NAT em cada pacote que atinge o firewall não faz parte do nosso tutorial. Faremos a correspondência de pacotes na porta 80 para o endereço IP privado do nosso servidor web:
|
1 |
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2 |
O pacote será roteado corretamente para o nosso servidor web contendo o endereço original do cliente como endereço de origem. Apesar das tentativas feitas pelo servidor para enviar a resposta diretamente para esse endereço, não haverá possibilidade de estabelecer uma conexão TCP legítima.
Para configurar o roteamento adequado, modificaremos o endereço de origem do pacote. Vamos editar o endereço de origem para o endereço IP privado do nosso servidor de firewall. Após a modificação, a resposta será enviada de volta para o firewall, que a encaminhará de volta para o cliente.
Para habilitar essa funcionalidade, adicione uma regra à POSTROUTING chain da tabela nat avaliada logo antes dos pacotes serem enviados para a rede. Em seguida, faça a correspondência dos pacotes destinados ao nosso servidor web por endereço IP e porta:
|
1 |
sudo iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 80 -d 192.0.2.2 -j SNAT --to-source 192.0.2.15 |
Assim que esta regra estiver em vigor, o nosso servidor web deverá estar acessível apontando o nosso navegador web para o endereço público da nossa máquina de firewall:
|
1 |
curl 203.0.113.15 |
Você verá a saída:

A nossa configuração de redirecionamento de portas está concluída.
Ajustar o Conjunto de Regras Permanentes
Depois de concluir a configuração do redirecionamento de portas, salvaremos isso no nosso conjunto de regras permanentes. Se você quiser manter os comentários no conjunto de regras atual, use o serviço iptables-persistent para salvar suas regras:
|
1 |
sudo service iptables-persistent save |
Você também pode abri-lo e editá-lo manualmente para manter os comentários no seu arquivo:
|
1 |
sudo nano /etc/iptables/rules.v4 |
Em seguida, configure a tabela filter e a tabela nat para adicionar as regras da chain FORWARD e as regras de ROUTING respectivamente. Ajustar a tabela nat nos permitirá adicionar as regras PREROUTING e POSTROUTING conforme mostrado no exemplo abaixo:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
/etc/iptables/regras.v4 *filter # Permitir todo o tráfego de saída, mas descartar pacotes de entrada e encaminhamento por padrão :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] # Chains personalizadas por protocolo :UDP - [0:0] :TCP - [0:0] :ICMP - [0:0] # Tráfego UDP aceitável # Tráfego TCP aceitável -A TCP -p tcp --dport 22 -j ACCEPT # Tráfego ICMP aceitável # Política de aceitação padrão -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A INPUT -i lo -j ACCEPT # Descartar pacotes inválidos -A INPUT -m conntrack --ctstate INVALID -j DROP # Passar tráfego para chains específicas de protocolo ## Permitir apenas novas conexões (estabelecidas e relacionadas já devem ser tratadas) ## Para TCP, adicionalmente permitir apenas novos pacotes SYN, pois esse é o único método válido ## para estabelecer uma nova conexão TCP -A INPUT -p udp -m conntrack --ctstate NEW -j UDP -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP -A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP # Rejeitar qualquer coisa que tenha passado até este ponto ## Tentar ser específico do protocolo com a mensagem de rejeição -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable -A INPUT -p tcp -j REJECT --reject-with tcp-reset -A INPUT -j REJECT --reject-with icmp-proto-unreachable # Regras para encaminhar a porta 80 para o nosso servidor web # Detalhes da rede do servidor web: # * Endereço IP Público: 203.0.113.2 # * Endereço IP Privado: 192.0.2.2 # * Interface Pública: eth0 # * Interface Privada: eth1 # # Detalhes da rede do firewall: # # * Endereço IP Público: 203.0.113.15 # * Endereço IP Privado: 192.0.2.15 # * Interface Pública: eth0 # * Interface Privada: eth1 -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # Fim das regras de filtragem Forward # Confirmar as alterações COMMIT *raw :PREROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] # Regras para traduzir requisições para a porta 80 da interface pública # para que possamos encaminhar corretamente para o servidor web usando a # interface privada. # Detalhes da rede do servidor web: # * Endereço IP Público: 203.0.113.2 # * Endereço IP Privado: 192.0.2.2 # * Interface Pública: eth0 # * Interface Privada: eth1 # # Detalhes da rede do firewall: # # * Endereço IP Público: 203.0.113.15 # * Endereço IP Privado: 192.0.2.15 # * Interface Pública: eth0 # * Interface Privada: eth1 -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.0.2.2 -A POSTROUTING -d 192.0.2.2 -o eth1 -p tcp --dport 80 -j SNAT --to-source 192.0.2.15 # Fim das traduções NAT para o tráfego do servidor web COMMIT *security :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT |
Após adicionar os valores acima, salve e feche o arquivo. Em seguida, digite o comando abaixo para testar a sintaxe das suas regras:
|
1 |
sudo iptables-restore -t < /etc/iptables/rules.v4 |
Se você não vir erros, carregue o conjunto de regras:
|
1 |
sudo service iptables-persistent reload |
Vamos verificar se o nosso servidor web ainda está acessível através do endereço IP público do seu firewall:
|
1 |
curl 203.0.113.15 |
Conclusão
Ao final deste tutorial, você deve estar confortável com o encaminhamento de portas em um servidor Linux com iptables. Você pode aproveitar os recursos de encaminhamento de portas para disfarçar a topologia da sua rede privada, ao mesmo tempo em que otimiza o tráfego de serviços para fluir livremente através da sua máquina de firewall de gateway.
Como o processo depende explicitamente da segurança da sua rede e das portas utilizadas, ele é seguro. Pode haver uma possibilidade de risco envolvida se você não tiver um firewall de segurança ou segurança VPN em sua rede. Portanto, é aconselhável configurar o firewall conforme discutido neste tutorial. Esperamos que este guia ajude você a se manter seguro na internet ao usar sua rede privada.
Para explorar ainda mais soluções de firewall que você pode implementar em seu sistema, confira estes recursos do nosso blog:
- Configurando um Firewall com UFW no Ubuntu 18.04
- Setting Up a Firewall with FirewallD on CentOS 7
- O Básico do UFW: Aprendendo os Comandos Essenciais de Firewall
Boa computação!
Comentários
Nenhum comentário ainda. Seja o primeiro.