Servidor - dhcp + firewall + proxy

Iniciado por lucascatani, 20 de Abril de 2012, 16:15

tópico anterior - próximo tópico

cpaynes

#30
Vamos la:

CitarREDEMASQ=192.168.0.0/24

Aqui não e uma regra, você esta alocando uma variável com o valor da faixa de rede 192.168.0.0 na mascara de rede 255.255.255.0, isso poderá ser utilizado futuramente nas regras do seu firewall, um exemplo seria, iptables -A FORWARD - i PLACAINTERNA -o PLACA EXTERNA -s $REDEMASQ -j ACCEPT, assim você libera o acesso  que passa pelo teu server que entra da rede interna com saída para a externa e que tiver origem da rede que você setou na variável REDEMASQ


Citariptables -P FORWARD DROP

Aqui você especifica a politica padrão da cadeia FORWARD como DROP, não sai nada! a partir disso você necessita liberar o que deve sair pelo teu firewall


Citariptables -A FORWARD -o eth1 -m state --state NEW,INVALID -j DROP

Aqui você esta dropando os pacotes inválidos que passam pelo teu servidor, remove o NEW, dependendo como esta a politica do teu firewall nada vai sair e adiciona a placa de rede que entra estes pacotes EX:
iptables -A FORWARD -i eth0 -o eth1 -m state --state INVALID -j DROP


Citariptables -A FORWARD -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

Aqui você esta garantindo que as conexões que saírem pelo teu firewall tenham o seu retorno garantido, sem precisar criar as regras de retorno para esses pacotes, inclusive os pacotes que tenham alguma relação com estas conexões, também adicione a placa de rede que entra estes pacotes EX:

iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

Citariptables -A FORWARD -i eth1 -s $REDEMASQ -j ACCEPT

Aqui segue o primeiro exemplo que te disse  você esta aceitando, todos pacotes que passam pelo teu servidor que possuem origem da rede 192.168...., adiciona a placa de rede que sai estes pacotes EX:

iptables -A FORWARD -i eth1 -o eth0 -s $REDEMASQ -j ACCEPT



Citariptables -A FORWARD -j DROP

Aqui esta dizendo esta dropando todos pacotes que passam pelo teu server, cuidado, pois tudo que estiver liberado na cadeia FORWARD apos esta regra, vai acabar sendo barrada pelo teu firewall, pois lembre-se que ele lê as regras de cima para baixo!

Citariptables -A INPUT -j DROP

Aqui esta dropando todos os pacotes que entram no teu firewall


Citariptables -A FORWARD -o eth1 -p tcp -m multiport --dports 80,8080 -j ACCEPT

Aqui você libera a porta 80 e 8080 no protocolo tcp, que passam pelo teu server, adiciona a placa de rede que entra estes pacotes EX:
iptables -A FORWARD -i eth1 -o eth1 -p tcp -m multiport --dports 80,8080 -j ACCEPT


Citariptables -A INPUT -i eth0 -p tcp -m multiport --dports 445,139 -j ACCEPT

E aqui você esta aceitando conexões provenientes das portas 445,139  no protocolo tcp pela tua interface eth0

Aconselho que você de uma olhada neste link http://www.guiafoca.org/cgs/guia/avancado/ch-fw-iptables.html, tem uma documentação muito boa

lucascatani

#31
Muito obrigado cpaynes, excelente explicação, assim como as do zekkerj. Estou usando um script de firewall que achei aqui http://www.vivaolinux.com.br/artigo/Firewall-Proxy-%28solucao-completa%29?pagina=5

mas não consegui entender a função dessas variáveis

Variáveis\
GW="200.x.x.1"
IP_EXT="200.x.x.7"
REDE="10.0.0.0/32"

e da erro nessa regra também (BAD ARGUMENT 0.0.0.0/0)

iptables -t nat -A POSTROUTING -d 0.0.0.0/0 -s $REDE -j SNAT --to $IP_EXT


Se tiver um tempinho de olhar fico grato! Um abraço e bom final de semana!

zekkerj

A função das variáveis é pra vc poder ajustar o script pra tua configuração, sem ter que ficar fuçando em cada uma das regras.

Quanto ao erro, é um erro menor, comum: o endereço "0.0.0.0/0" significa "qualquer endereço". Quando vc filtra por "qualquer endereço", é a mesma coisa que "não filtrar". Então toda essa parte "-d 0.0.0.0/0" é desnecessária, basta retirar da linha.

Aliás, se isso aparecer no resto do script ("-d 0.0.0.0/0", "-d 0/0", "-s 0.0.0.0/0" ou "-s 0/0"), pode tirar também.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

lucascatani

#33
Citação de: zekkerj online 05 de Maio de 2012, 10:34
A função das variáveis é pra vc poder ajustar o script pra tua configuração, sem ter que ficar fuçando em cada uma das regras.

Quanto ao erro, é um erro menor, comum: o endereço "0.0.0.0/0" significa "qualquer endereço". Quando vc filtra por "qualquer endereço", é a mesma coisa que "não filtrar". Então toda essa parte "-d 0.0.0.0/0" é desnecessária, basta retirar da linha.

Aliás, se isso aparecer no resto do script ("-d 0.0.0.0/0", "-d 0/0", "-s 0.0.0.0/0" ou "-s 0/0"), pode tirar também.

Sim, as variáveis eu uso também, na verdade não entendi o que colocar na variavel IP_EXT ... O que a linha faz? Posso colocar qualquer ip? substituo os x?


Aproveitando...

#Setadas as políticas
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

#liberar samba
iptables -A INPUT -i eth0 -p tcp -m multiport --dports 445,139 -j ACCEPT
iptables -A INPUT -i eth0 -p udp -m multiport --dports 137,138 -j ACCEPT
#liberar ssh
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT

#liberar internet para as estacoes
iptables -t nat - A POSTROUTING -o eth1 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward

A internet fica liberada para as estações, mas não para o próprio servidor. Como eu libero também para o servidor? Abraço!

zekkerj

IP_EXT parece ser o ip externo da conexão. Seria utilizado no caso de conexão com IP fixo. Mas não dá pra dizer qual seria o impacto de usar esse script numa conexão de IP dinâmico, sem ver o script completo.
Pesquise antes de perguntar, sua dúvida pode já ter sido respondida.
Não respondo dúvidas por MP, coloque sua dúvida no fórum onde ela pode ser pesquisada pelos seus colegas!
Não venha ao fórum apenas para perguntar. Se você sabe a resposta de um problema, porque não ajudar seu colega? ;D

cpaynes

#35
Vou postar mesmo assim, pois o Zekkerj, postou antes de mim ..

CitarSim, as variáveis eu uso também, na verdade não entendi o que colocar na variavel IP_EXT
voce precisa atribuir o endereco da tua interface de saida, deve ser um ip do teu modem ou que lhe foi fornecido pela operadora em caso de planos corporativos.


CitarA internet fica liberada para as estações, mas não para o próprio servidor. Como eu libero também para o servidor

voce especificou os DNS da tua operadora no teu resolv.conf ?
vi /etc/resolv.conf

EX: DNS: nameserver 8.8.8.8

Citar# Contra Syn-flood
iptables -A FORWARD -p tcp -m limit --limit 1/s -j ACCEPT

esta linha esta no teu firewall, isso não protege contra synflood, com isso teu firewall poderá levar você a uma negação de serviço.
da uma olhada neste artigo sobre isto. Um excelente artigo do Elgio!
http://www.vivaolinux.com.br/artigo/Iptables-protege-contra-SYN-FLOOD/

lucascatani

Citação de: zekkerj online 05 de Maio de 2012, 13:31
IP_EXT parece ser o ip externo da conexão. Seria utilizado no caso de conexão com IP fixo. Mas não dá pra dizer qual seria o impacto de usar esse script numa conexão de IP dinâmico, sem ver o script completo.

Beleza. Vou abandonar aquele script pronto e trabalhar em um do zero.

lucascatani

#37
Citação de: cpaynes online 05 de Maio de 2012, 13:34
Vou postar mesmo assim, pois o Zekkerj, postou antes de mim ..

CitarSim, as variáveis eu uso também, na verdade não entendi o que colocar na variavel IP_EXT
voce precisa atribuir o endereco da tua interface de saida, deve ser um ip do teu modem ou que lhe foi fornecido pela operadora em caso de planos corporativos.


CitarA internet fica liberada para as estações, mas não para o próprio servidor. Como eu libero também para o servidor

voce especificou os DNS da tua operadora no teu resolv.conf ?
vi /etc/resolv.conf

EX: DNS: nameserver 8.8.8.8

Citar# Contra Syn-flood
iptables -A FORWARD -p tcp -m limit --limit 1/s -j ACCEPT

esta linha esta no teu firewall, isso não protege contra synflood, com isso teu firewall poderá levar você a uma negação de serviço.
da uma olhada neste artigo sobre isto. Um excelente artigo do Elgio!
http://www.vivaolinux.com.br/artigo/Iptables-protege-contra-SYN-FLOOD/


está ficando bloqueado por causa do INPUT DROP, gostaria de saber a regra para liberar, se eu colocar iptables -A INPUT ACCEPT funciona... mas quero que pro padrão seja drop...


Segue meu script de firewall do zero, sem os bloqueios contra DOS, etc,

#!/bin/bash

INTERNET="eth1"
REDELOCAL="eth0"


modprobe ip_tables
modprobe iptable_nat

# Politica padrao
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

# Liberando Samba
iptables -A INPUT -i $REDELOCAL -p tcp -m multiport --dports 139,445 -j ACCEPT
iptables -A INPUT -i $REDELOCAL -p tcp -m multiport --dports 137,138 -j ACCEPT
# Liberando ssh
iptables -A INPUT -i $REDELOCAL -p tcp --dport 22 -j ACCEPT


# Compartilhando a internet com a REDELOCAL
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward

cpaynes

#38
Citarestá ficando bloqueado por causa do INPUT DROP, gostaria de saber a regra para liberar, se eu colocar iptables -A INPUT ACCEPT funciona... mas quero que pro padrão seja drop...
Inclui isto no teu firewall abaixo da politica padrão
Melhor especificar todas politicas DROP
e ir liberando o que precisa

iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT


Citariptables -A INPUT -i $REDELOCAL -p tcp -m multiport --dports 139,445 -j ACCEPT
iptables -A INPUT -i $REDELOCAL -p tcp -m multiport --dports 137,138 -j ACCEPT
Transforma isso em uma regra apenas,
#samba
iptables -A INPUT -i $REDELOCAL -p tcp -m multiport --dports 137,138,139,445 -j ACCEPT


lucascatani

Citação de: cpaynes online 05 de Maio de 2012, 13:42
Citarestá ficando bloqueado por causa do INPUT DROP, gostaria de saber a regra para liberar, se eu colocar iptables -A INPUT ACCEPT funciona... mas quero que pro padrão seja drop...
Inclui isto no teu firewall abaixo da politica padrão
Melhor especificar todas politicas DROP
e ir liberando o que precisa

iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT


Citariptables -A INPUT -i $REDELOCAL -p tcp -m multiport --dports 139,445 -j ACCEPT
iptables -A INPUT -i $REDELOCAL -p tcp -m multiport --dports 137,138 -j ACCEPT
Transforma isso em uma regra apenas,
#samba
iptables -A INPUT -i $REDELOCAL -p tcp -m multiport --dports 137,138,139,445 -j ACCEPT



A do Samba é udp a linha de baixo, erro de digitação..

Com as regras acima a internet não funciona, qual a regra para liberar a navegação, tanto nas estações quanto no servidor?

Te agradeço muito cara, estou aprendendo muito com a ajuda de vocês.

cpaynes

Nao estao saindo porque voce nao especificou as regras de FORWARD das portas que necessita sair
EX porta 80 HTTP:
iptables -A FORWARD -i $REDELOCAL -o $INTERNET -p tcp --dport 80 -j ACCEPT

EX porta SSH 22
iptables -A FORWARD -i $REDELOCAL -o $INTERNET -p tcp --dport 22 -j ACCEPT

e assim por diante

lucascatani

Citação de: cpaynes online 05 de Maio de 2012, 14:02
Nao estao saindo porque voce nao especificou as regras de FORWARD das portas que necessita sair
EX porta 80 HTTP:
iptables -A FORWARD -i $REDELOCAL -o $INTERNET -p tcp --dport 80 -j ACCEPT

EX porta SSH 22
iptables -A FORWARD -i $REDELOCAL -o $INTERNET -p tcp --dport 22 -j ACCEPT

e assim por diante

Entendido. Agora eu quero integrar com o squid. Já tenho o squid configurado (meia-boca). Vou optar por colocar nos navegadores o proxy manualmente. Gostaria que não funcionasse nada se o cara não tiver o proxy no navegador.

Alguma luz do que fazer?

cpaynes

CitarAgora eu quero integrar com o squid. Já tenho o squid configurado (meia-boca). Vou optar por colocar nos navegadores o proxy manualmente. Gostaria que não funcionasse nada se o cara não tiver o proxy no navegador.
insere esta regra antes dos FORWARD's

iptables -t nat -A PREROUTING -i $REDELOCAL -p tcp --dport 80 -j REDIRECT --to-port 3128

lucascatani

Citação de: cpaynes online 05 de Maio de 2012, 14:11
CitarAgora eu quero integrar com o squid. Já tenho o squid configurado (meia-boca). Vou optar por colocar nos navegadores o proxy manualmente. Gostaria que não funcionasse nada se o cara não tiver o proxy no navegador.
insere esta regra antes dos FORWARD's

iptables -t nat -A PREROUTING -i $REDELOCAL -p tcp --dport 80 -j REDIRECT --to-port 3128


Assim ele vai ficar transparente, eu quero que quem não colocar no navegador o proxy não consiga acessar a internet.


Outra coisa, meu firewall até agora (ainda não libera a internet)

#!/bin/bash

INTERNET="eth1"
REDELOCAL="eth0"


modprobe ip_tables
modprobe iptable_nat

# Politica padrao
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# Politicas da rede ou pessoais
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# Liberando http e https
iptables -A FORWARD -i $REDELOCAL -o $INTERNET -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i $REDELOCAL -o $INTERNET -p tcp --dport 8080 -j ACCEPT

# Liberando o ssh
iptables -A FORWARD -i $REDELOCAL -o $INTERNET -p tcp --dport 22 -j ACCEPT

# Liberando Samba
iptables -A INPUT -i $REDELOCAL -p tcp -m multiport --dports 139,445 -j ACCEPT
iptables -A INPUT -i $REDELOCAL -p udp -m multiport --dports 137,138 -j ACCEPT
# Liberando ssh
iptables -A INPUT -i $REDELOCAL -p tcp --dport 22 -j ACCEPT


# Compartilhando a internet com a REDELOCAL
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward

# Liberando a internet no servidor


Uma pergunta besta. Qual a diferenca dessas 2 regras
# Liberando o ssh
iptables -A FORWARD -i $REDELOCAL -o $INTERNET -p tcp --dport 22 -j ACCEPT

iptables -A INPUT -i $REDELOCAL -p tcp --dport 22 -j ACCEPT

???

cpaynes

CitarAssim ele vai ficar transparente, eu quero que quem não colocar no navegador o proxy não consiga acessar a internet.

Isso você limita no teu proxy com parâmetros de Auth

Citar
# Liberando o ssh
iptables -A FORWARD -i $REDELOCAL -o $INTERNET -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i $REDELOCAL -p tcp --dport 22 -j ACCEPT

Simples:
Na cadeia FORWARD você especifica as conexoes que passam pelo teu firewall para fora ou para dentro
Na cadeia INPUT você aceita conexões diretamente ao teu host