Como encaminhar a porta apenas em um único endereço IP de host

2

Pergunta curta:

Como você habilita o encaminhamento de porta em apenas um único endereço IP de host?

Histórico:

Meu servidor do Centos 7 tem 5 endereços IP. Anteriormente, eu tinha o apache ouvindo em todos eles e vários domínios atribuídos a esses endereços IP que foram resolvidos com hosts virtuais.

Alterei a diretiva Listen no httpd.conf para que agora o apache só ouça 4 dos endereços IP

Usando o node.js, criei outra instância do servidor, mas ela não me deixa escutar na porta padrão 80 sem permissões elevadas. Não quero executá-lo com permissões elevadas.

Gostaria de encaminhar a porta 80 para algo como 8080, mas apenas no endereço IP sem afetar o tráfego direcionado aos outros 4 endereços IP. É importante que o tráfego em outros endereços IP não seja afetado pela regra.

Acho que a solução será semelhante a:

firewall-cmd --zone=public --add-masquerade --permanent
firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent

As outras perguntas e respostas que encontrei têm a ver com endereços IP de origem em vez de endereços IP do host.

    
por Aunt Jemima 15.01.2018 / 05:09

4 respostas

6

Uma zona firewalld pode ser especificada por interface ou por endereço source , mas você deseja filtrar por endereço destino . Você precisará de uma regra rica para lidar com essa situação específica.

Uma regra tão rica pode parecer:

firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" destination address="198.51.100.237" forward-port port="80" protocol="tcp" to-port="8080"'

Consulte a página firewalld.richlanguage(5) man para obter documentação sobre regras avançadas.

Quando sua regra avançada estiver funcionando, lembre-se de torná-la permanente com

firewall-cmd --runtime-to-permanent

ou adicionando --permanent à invocação anterior.

    
por 08.03.2018 / 00:01
1

Suponha que, dos seus cinco endereços IP, um seja 192.0.2.3 , ao qual você deseja encaminhar a porta 80. Você pode usar iptables para encaminhar portas neste endereço IP da seguinte forma:

iptables -t nat -A PREROUTING -d 192.0.2.3 -p tcp --dport 80 -j REDIRECT --to-ports 8080

Isso deve deixar todos os outros endereços inalterados. Se um programa ligar-se à porta 80 em todos os endereços, 192.0.2.3 ainda redirecionará para a porta 8080, já que é redirecionado antes do roteamento.

    
por 07.03.2018 / 23:47
0

Nota: Eu admito que estou propondo uma solução estranha e possivelmente não suportada, que pode ser quebrada no futuro firewalld versions. No entanto, certamente funcionará em um servidor do CentOS 7.

Sugiro que você adicione diretamente essa regra de encaminhamento de porta à pilha iptables / ip6tables . Você pode conseguir isso usando as regras diretas de firewalld . Por exemplo:

# firewall-cmd --permanent --direct --add-rule ipv4 nat PRE_public_allow 0 \
    --destination 11.22.33.44 --protocol tcp --destination-port 80 \
    --jump REDIRECT --to-ports 8080

# firewall-cmd --permanent --direct --add-rule ipv6 nat PRE_public_allow 0 \
    --destination 11:22:33:44:55:66:77:88 --protocol tcp --destination-port 80 \
    --jump REDIRECT --to-ports 8080

Eu percebi que o firewalld do CentOS cria uma PRE_<zone>_allow chain em nat table para cada zona ativa, que é avaliada quando os pacotes que correspondem às definições de zona chegam. Portanto, as regras iptables / ip6tables podem ser adicionadas lá.

    
por 08.03.2018 / 03:02
0

Eu configuraria o proxy reverso com portas diferentes para domínios diferentes, mas com o mesmo endereço IP. Na página httpd config, eu adicionaria diretivas Listen para cada porta (por exemplo: Listen 80, Listen 8081, Listen 8082 etc), inclua a porta de configuração vhosts na página de configuração httpd e atualize a página de configuração vhosts de acordo com as portas.

    
por 08.03.2018 / 03:16