IPTables e redirecionamento de porta Apache2

IPTables e redirecionamento de porta Apache2

Estou usando o Apache para redirecionar um subdomínio para uma porta ( mod_proxy, mod_proxy_http, mod_proxy_ajp) e tabelas IP para restringir o acesso direto à porta, exceto para mim e para o servidor local.

Minhas tabelas IP são assim:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       tcp  -- !c-24-7-110-109.hsd1.ca.comcast.net  anywhere             tcp dpt:tproxy
ACCEPT     tcp  --  localhost            anywhere             tcp dpt:tproxy
DROP       tcp  -- !c-24-7-110-109.hsd1.ca.comcast.net  anywhere             tcp dpt:http-alt
DROP       tcp  -- !c-24-7-110-109.hsd1.ca.comcast.net  anywhere             tcp dpt:webmin
ACCEPT     tcp  --  localhost            anywhere             tcp dpt:webmin

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

O contexto que vou usar neste post é:

Sonatipo Nexus:nexus.example.com => example.com:8081

CI Jenkins:jenkins.example.com => example.com:8080

Webmin:webmin.example.com => example.com:10000

O que estou trabalhando agora não é acesso direto à porta, exceto para mim. Também quero que o sistema local seja capaz de acessar portas que é o que acredito ter agora. Estou usando mod_proxy_ajppara Jenkins CI e Webmin e mod_proxy_httppara Sonatype Nexus.

Quando visito portos diretos, cada um desses serviços carrega perfeitamente. Quando peço a outra pessoa para carregar cada um, ela não consegue, então está funcionando.

Agora, porém, ao tentar acessar um dos subdomínios, recebo uma carga sem fim (loop infinito?)

Porém, quando executo um tracert no subdomínio, ele termina bem, então posso riscar o loop infinito.

Aqui está minha configuração de host virtual Sonatype Nexus apache:

<VirtualHost *:80>
        ServerName nexus.majornoob.com
        ServerAlias www.nexus.majornoob.com
        ProxyRequests Off
        ProxyPreserveHost On
        ProxyPass / http://localhost:8081/
        ProxyPassReverse / http://localhost:8081/
        ProxyPassReverseCookiePath / /
        ErrorLog /var/www/majornoob/error-nexus.log
        LogLevel warn
        CustomLog /var/www/majornoob/access-nexus.log combined
</VirtualHost>

e aqui está meu Jenkins:

<VirtualHost *:80>
        ServerName jenkins.majornoob.com
        ServerAlias www.jenkins.majornoob.com
        ProxyRequests Off
        ProxyPreserveHost On
        ProxyPass / ajp://127.0.0.1:8080/
        ProxyPassReverse / ajp://127.0.0.1:8080/
        ProxyPassReverseCookiePath / /

        ErrorLog /var/www/majornoob/error-jenkins.log

        LogLevel warn

        CustomLog /var/www/majornoob/access-jenkins.log combined
</VirtualHost>

Esses dois exemplos de hosts virtuais estão usando mod_proxy_ajpe mod_proxy_httprespectivamente.

Alguém pode me ajudar a descobrir por que estou recebendo uma carga infinita?

Obrigado.

editar:Deixa pra lá no loop infinito. Depois de algum tempo, recebi um erro 503 Serviço indisponível.

Responder1

As regras do iptables são avaliadas em ordem, de cima para baixo, conforme impressas. O problema que você tem é que a conexão proxy é do localhost, o que corresponde a esta regra:

DROP       tcp  -- !c-24-7-110-109.hsd1.ca.comcast.net  anywhere             tcp dpt:tproxy

localhostnão é c-24-7-..., então a conexão é interrompida. O módulo proxy eventualmente expira; se a regra fosse REJECT em vez de DROP, você receberia um erro muito mais rápido (porque seria negado explicitamente, em vez de a tentativa de conexão simplesmente desaparecer).

A solução é bastante simples: reordene as regras para que “aceite do localhost” antes de “negue de qualquer outro lugar”. (O roteamento IP corresponde ao mais específico, mas como os iptables são multifatoriais, isso não é necessariamente definido).

Geralmente, eu recomendo ter uma primeira regra que permita toda a comunicação do host local (por meio da interface de loopback, caso alguém tente algo estranho pela Ethernet); tente adicionar

iptables -I INPUT -i lo -s localhost -d localhost -j ACCEPT

para inserir ( -I) no topo da lista.

informação relacionada