Mudanças entre as edições de "Projeto Integrador - 2009.2 - Dicas de GER"
Ir para navegação
Ir para pesquisar
(13 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
Linha 1: | Linha 1: | ||
− | + | __TOC__ | |
+ | =Organização= | ||
* Usem [http://www.mindmeister.com mapas mentais] ou [http://www.graphviz.org grafos direcionados] (dígrafos) para ver/compreender a relação entre camadas e serviços de rede. Exemplo: | * Usem [http://www.mindmeister.com mapas mentais] ou [http://www.graphviz.org grafos direcionados] (dígrafos) para ver/compreender a relação entre camadas e serviços de rede. Exemplo: | ||
<graphviz> | <graphviz> | ||
Linha 5: | Linha 6: | ||
{ | { | ||
splines = true | splines = true | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
subgraph clusterRede | subgraph clusterRede | ||
Linha 28: | Linha 23: | ||
} | } | ||
− | + | DHCP -> DNS -> HTTP | |
MySQL -> HTTP -> MySQL | MySQL -> HTTP -> MySQL | ||
DNS -> SMTP -> HTTP | DNS -> SMTP -> HTTP | ||
Linha 36: | Linha 31: | ||
==Integração entre Aplicações== | ==Integração entre Aplicações== | ||
− | + | À espera da necessidade dos alunos :-) | |
− | + | ||
− | + | ||
− | + | ||
− | + | =''Scripts''= | |
− | + | ==''Firewal''== | |
− | + | <syntaxhighlight lang=bash> | |
− | + | #!/bin/bash | |
+ | |||
+ | |||
+ | # Variáveis: MEXA aqui! | ||
+ | # | ||
+ | # Interfaces | ||
+ | EXTERNA_IFACE="eth0" | ||
+ | DMZ_IFACE="eth0:0" | ||
+ | LAN="eth0:1" | ||
+ | # | ||
+ | # Redes | ||
+ | EXTERNA_REDE="200.135.37.0/24" | ||
+ | DMZ_REDE="172.31.0.16/30" | ||
+ | LAN_REDE="172.31.0.0/28" | ||
+ | # | ||
+ | # Servidores | ||
+ | ROTEADOR="200.135.37.82" | ||
+ | DMZ_WEB="172.31.0.17" | ||
+ | # | ||
+ | # Portas | ||
+ | PORTAS_TCP_SERVIDOR="22" | ||
+ | PORTAS_UDP_SERVIDOR="" | ||
+ | PORTAS_TCP_WEB="25 80" | ||
+ | PORTAS_UDP_WEB="53" | ||
+ | |||
+ | |||
+ | limpa_regras() | ||
+ | { | ||
+ | echo "- Antigas regras de NAT." | ||
+ | iptables -t nat -F | ||
+ | |||
+ | echo "- Antigas regras de filtro de pacotes." | ||
+ | iptables -F | ||
+ | } | ||
+ | |||
+ | politica_padrao() | ||
+ | { | ||
+ | echo "- Política padrão para NAT." | ||
+ | iptables -t nat -P PREROUTING ACCEPT | ||
+ | iptables -t nat -P POSTROUTING ACCEPT | ||
+ | iptables -t nat -P OUTPUT ACCEPT | ||
+ | |||
+ | echo "- Política padrão para filtro de pacotes." | ||
+ | iptables -P INPUT ACCEPT | ||
+ | iptables -P FORWARD ACCEPT | ||
+ | iptables -P OUTPUT ACCEPT | ||
+ | } | ||
+ | |||
+ | |||
+ | regras_basicas() | ||
+ | { | ||
+ | echo "- Regras básicas:" | ||
+ | echo " - Loopback." | ||
+ | iptables -A INPUT -i lo -j ACCEPT | ||
+ | echo " - Conexões ativas." | ||
+ | iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT | ||
+ | } | ||
+ | |||
+ | roteamento() | ||
+ | { | ||
+ | echo "- Roteamento." | ||
+ | sysctl -w net.ipv4.ip_forward=1 > /dev/null | ||
+ | } | ||
+ | |||
+ | nat() | ||
+ | { | ||
+ | echo "- NAT para as redes internas." | ||
+ | iptables -t nat -A POSTROUTING -o ${EXTERNA_IFACE} -j MASQUERADE | ||
+ | } | ||
+ | |||
+ | redir_portas() | ||
+ | { echo "- De externa para o servidor Web:" | ||
+ | for porta in ${PORTAS_TCP_WEB}; do | ||
+ | echo " - Redireciona porta ${porta}/TCP." | ||
+ | iptables -t nat -A PREROUTING -d ${ROTEADOR} -p tcp \ | ||
+ | --dport ${porta} -j DNAT --to ${DMZ_WEB} | ||
+ | done | ||
+ | for porta in ${PORTAS_UDP_WEB}; do | ||
+ | echo " - Redireciona porta ${porta}/UDP." | ||
+ | iptables -t nat -A PREROUTING -d ${ROTEADOR} -p udp \ | ||
+ | --dport ${porta} -j DNAT --to ${DMZ_WEB} | ||
+ | done | ||
+ | |||
+ | } | ||
+ | |||
+ | filtro_local() | ||
+ | { | ||
+ | echo "- Filtro de pacotes:" | ||
+ | for porta in ${PORTAS_TCP_SERVIDOR}; do | ||
+ | echo " - Libera porta ${porta}/TCP." | ||
+ | iptables -A INPUT -p tcp --dport ${porta} -j ACCEPT | ||
+ | done | ||
+ | for porta in ${PORTAS_UDP_SERVIDOR}; do | ||
+ | echo " - Libera porta ${porta}/UDP." | ||
+ | iptables -A INPUT -p udp --dport ${porta} -j ACCEPT | ||
+ | done | ||
+ | echo " - Bloqueia o resto." | ||
+ | iptables -P INPUT DROP | ||
+ | } | ||
+ | |||
+ | filtro_roteamento() | ||
+ | { | ||
+ | echo "- Filtro de pacotes:" | ||
+ | echo " - Bloqueia da DMZ para a LAN interna." | ||
+ | iptables -A FORWARD -s ${DMZ_REDE} -d ${LAN_REDE} -j DROP | ||
+ | echo " - Libera o resto." | ||
+ | iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT | ||
+ | } | ||
+ | |||
+ | status() | ||
{ | { | ||
− | + | echo "#####################" | |
− | + | echo "# Filtro de pacotes #" | |
− | + | echo "#####################" | |
− | + | iptables -L -n -v | |
− | + | echo | |
+ | echo | ||
+ | echo "#######" | ||
+ | echo "# NAT #" | ||
+ | echo "#######" | ||
+ | iptables -t nat -L -n -v | ||
} | } | ||
− | |||
− | = | + | case ${1} in |
− | + | "start"|"restart") | |
+ | clear | ||
+ | echo | ||
+ | echo "Removendo:" | ||
+ | limpa_regras | ||
+ | echo | ||
+ | echo "Aplicando:" | ||
+ | politica_padrao | ||
+ | echo | ||
+ | echo "Para o acesso direto ao servidor:" | ||
+ | regras_basicas | ||
+ | filtro_local | ||
+ | echo | ||
+ | echo "Para o roteamento:" | ||
+ | roteamento | ||
+ | nat | ||
+ | redir_portas | ||
+ | filtro_roteamento | ||
+ | echo | ||
+ | echo "Pronto!" | ||
+ | ;; | ||
+ | "stop") | ||
+ | clear | ||
+ | echo | ||
+ | echo "Removendo:" | ||
+ | limpa_regras | ||
+ | echo | ||
+ | echo "Aplicando:" | ||
+ | politica_padrao | ||
+ | roteamento | ||
+ | nat | ||
+ | echo | ||
+ | echo "Pronto!" | ||
+ | ;; | ||
+ | "status") | ||
+ | clear | ||
+ | status | ||
+ | ;; | ||
+ | *) | ||
+ | echo "Use: ${0} (start|stop|restart|status)" | ||
+ | exit -1 | ||
+ | ;; | ||
+ | esac | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Controle de Tráfego== | ||
+ | * Sugestão do Prof. Emerson: | ||
+ | |||
+ | [[Imagem:PT_2009-2_Classe-tc.png|thumb|350px|Imagem descritiva]] | ||
+ | |||
+ | <syntaxhighlight lang=bash> | ||
+ | #!/bin/bash | ||
+ | |||
+ | # variaveis | ||
+ | |||
+ | TAXA=4000 # 4Mbps | ||
+ | UMPOR=`expr $TAXA / 100` | ||
+ | |||
+ | OURO=`expr $UMPOR \* 60` # 60% da taxa de transmissao | ||
+ | PRATA=`expr $UMPOR \* 25` # 25% da taxa de transmissao | ||
+ | BRONZE=`expr $UMPOR \* 15` # 15% da taxa de transmissao | ||
+ | |||
+ | DEV=eth1 | ||
+ | |||
+ | # ----------- TC ------------------# | ||
+ | # eliminando as regras anteriores | ||
+ | tc qdisc del dev ${DEV} root 2>/dev/null | ||
+ | |||
+ | # adicionando a disciplina de fila na raiz | ||
+ | tc qdisc add dev ${DEV} root handle 1:0 htb default 12 | ||
+ | |||
+ | # criando a classe pai para limitar a velocidade | ||
+ | tc class add dev ${DEV} parent 1:0 classid 1:1 htb rate ${TAXA}kbps ceil ${TAXA}kbps | ||
+ | |||
+ | # criando 3 classes (ouro, prata e bronze) | ||
+ | tc class add dev ${DEV} parent 1:1 classid 1:10 htb rate ${OURO}kbps ceil ${TAXA}kbps | ||
+ | tc class add dev ${DEV} parent 1:1 classid 1:11 htb rate ${PRATA}kbps ceil ${TAXA}kbps | ||
+ | tc class add dev ${DEV} parent 1:1 classid 1:12 htb rate ${BRONZE}kbps ceil ${TAXA}kbps | ||
+ | |||
+ | # adicionando qdisc para cada classe | ||
+ | tc qdisc add dev ${DEV} parent 1:10 handle 10: sfq perturb 10 | ||
+ | tc qdisc add dev ${DEV} parent 1:11 handle 11: sfq perturb 10 | ||
+ | tc qdisc add dev ${DEV} parent 1:12 handle 12: sfq perturb 10 | ||
+ | |||
+ | # criando os filtros para direcionar os trafegos para cada classe de acordo com o IP | ||
+ | # de destino | ||
+ | tc filter add dev ${DEV} protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.2.1 flowid 1:10 # vai para ouro | ||
+ | tc filter add dev ${DEV} protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.2.2 flowid 1:11 # vai para prata | ||
+ | tc filter add dev ${DEV} protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.2.3 flowid 1:12 # vai para bronze | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Teste de Servidor DNS== | ||
+ | <syntaxhighlight lang=python> | ||
+ | #!/usr/bin/python | ||
+ | |||
+ | import os | ||
+ | |||
+ | def limpar(equipe, registro, servidor): | ||
+ | enter='' | ||
+ | print("Tecle ENTER...") | ||
+ | raw_input(enter) | ||
+ | os.system('clear') | ||
+ | print('@' + servidor + ' ' + registro + ' ' + equipe) | ||
− | + | def main(): | |
− | + | equipes = {} | |
− | + | prefixo = '200.135.37' | |
− | + | dominio = 'sj.ifsc.edu.br' | |
− | + | equipes.update({'iguana':'111'}) | |
− | + | equipes.update({'mlwnetworks':'112'}) | |
− | + | equipes.update({'technet':'113'}) | |
− | + | equipes.update({'urano':'114'}) | |
− | + | equipes.update({'epsilon':'115'}) | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | for equipe in equipes: | ||
+ | for registro in ('SOA', 'NS', 'MX', 'A'): | ||
+ | limpar(equipe, registro, prefixo + '.65') | ||
+ | os.system('dig @' + prefixo + '.65 ' + registro + | ||
+ | ' ' + equipe + '.' + dominio) | ||
+ | limpar(equipe, registro, prefixo + '.' + equipes[equipe]) | ||
+ | os.system('dig @' + prefixo + '.' + equipes[equipe] + | ||
+ | ' ' + registro + ' ' + equipe + '.' + dominio) | ||
+ | |||
+ | if __name__ == '__main__': | ||
+ | main() | ||
+ | </syntaxhighlight> | ||
− | + | {{Voltar|Projeto Integrador - 2009.2#Gerência de Redes|Página principal do Projeto}} |
Edição atual tal como às 19h49min de 8 de dezembro de 2009
Organização
- Usem mapas mentais ou grafos direcionados (dígrafos) para ver/compreender a relação entre camadas e serviços de rede. Exemplo:
<graphviz> digraph Serviços { splines = true
subgraph clusterRede { label = "Rede" DHCP }
subgraph clusterAplicacao { label = "Aplicação" DNS HTTP MySQL SMTP IMAP }
DHCP -> DNS -> HTTP MySQL -> HTTP -> MySQL DNS -> SMTP -> HTTP DNS -> IMAP -> HTTP } </graphviz>
Integração entre Aplicações
À espera da necessidade dos alunos :-)
Scripts
Firewal
#!/bin/bash
# Variáveis: MEXA aqui!
#
# Interfaces
EXTERNA_IFACE="eth0"
DMZ_IFACE="eth0:0"
LAN="eth0:1"
#
# Redes
EXTERNA_REDE="200.135.37.0/24"
DMZ_REDE="172.31.0.16/30"
LAN_REDE="172.31.0.0/28"
#
# Servidores
ROTEADOR="200.135.37.82"
DMZ_WEB="172.31.0.17"
#
# Portas
PORTAS_TCP_SERVIDOR="22"
PORTAS_UDP_SERVIDOR=""
PORTAS_TCP_WEB="25 80"
PORTAS_UDP_WEB="53"
limpa_regras()
{
echo "- Antigas regras de NAT."
iptables -t nat -F
echo "- Antigas regras de filtro de pacotes."
iptables -F
}
politica_padrao()
{
echo "- Política padrão para NAT."
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
echo "- Política padrão para filtro de pacotes."
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
}
regras_basicas()
{
echo "- Regras básicas:"
echo " - Loopback."
iptables -A INPUT -i lo -j ACCEPT
echo " - Conexões ativas."
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
}
roteamento()
{
echo "- Roteamento."
sysctl -w net.ipv4.ip_forward=1 > /dev/null
}
nat()
{
echo "- NAT para as redes internas."
iptables -t nat -A POSTROUTING -o ${EXTERNA_IFACE} -j MASQUERADE
}
redir_portas()
{ echo "- De externa para o servidor Web:"
for porta in ${PORTAS_TCP_WEB}; do
echo " - Redireciona porta ${porta}/TCP."
iptables -t nat -A PREROUTING -d ${ROTEADOR} -p tcp \
--dport ${porta} -j DNAT --to ${DMZ_WEB}
done
for porta in ${PORTAS_UDP_WEB}; do
echo " - Redireciona porta ${porta}/UDP."
iptables -t nat -A PREROUTING -d ${ROTEADOR} -p udp \
--dport ${porta} -j DNAT --to ${DMZ_WEB}
done
}
filtro_local()
{
echo "- Filtro de pacotes:"
for porta in ${PORTAS_TCP_SERVIDOR}; do
echo " - Libera porta ${porta}/TCP."
iptables -A INPUT -p tcp --dport ${porta} -j ACCEPT
done
for porta in ${PORTAS_UDP_SERVIDOR}; do
echo " - Libera porta ${porta}/UDP."
iptables -A INPUT -p udp --dport ${porta} -j ACCEPT
done
echo " - Bloqueia o resto."
iptables -P INPUT DROP
}
filtro_roteamento()
{
echo "- Filtro de pacotes:"
echo " - Bloqueia da DMZ para a LAN interna."
iptables -A FORWARD -s ${DMZ_REDE} -d ${LAN_REDE} -j DROP
echo " - Libera o resto."
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
}
status()
{
echo "#####################"
echo "# Filtro de pacotes #"
echo "#####################"
iptables -L -n -v
echo
echo
echo "#######"
echo "# NAT #"
echo "#######"
iptables -t nat -L -n -v
}
case ${1} in
"start"|"restart")
clear
echo
echo "Removendo:"
limpa_regras
echo
echo "Aplicando:"
politica_padrao
echo
echo "Para o acesso direto ao servidor:"
regras_basicas
filtro_local
echo
echo "Para o roteamento:"
roteamento
nat
redir_portas
filtro_roteamento
echo
echo "Pronto!"
;;
"stop")
clear
echo
echo "Removendo:"
limpa_regras
echo
echo "Aplicando:"
politica_padrao
roteamento
nat
echo
echo "Pronto!"
;;
"status")
clear
status
;;
*)
echo "Use: ${0} (start|stop|restart|status)"
exit -1
;;
esac
Controle de Tráfego
- Sugestão do Prof. Emerson:
#!/bin/bash
# variaveis
TAXA=4000 # 4Mbps
UMPOR=`expr $TAXA / 100`
OURO=`expr $UMPOR \* 60` # 60% da taxa de transmissao
PRATA=`expr $UMPOR \* 25` # 25% da taxa de transmissao
BRONZE=`expr $UMPOR \* 15` # 15% da taxa de transmissao
DEV=eth1
# ----------- TC ------------------#
# eliminando as regras anteriores
tc qdisc del dev ${DEV} root 2>/dev/null
# adicionando a disciplina de fila na raiz
tc qdisc add dev ${DEV} root handle 1:0 htb default 12
# criando a classe pai para limitar a velocidade
tc class add dev ${DEV} parent 1:0 classid 1:1 htb rate ${TAXA}kbps ceil ${TAXA}kbps
# criando 3 classes (ouro, prata e bronze)
tc class add dev ${DEV} parent 1:1 classid 1:10 htb rate ${OURO}kbps ceil ${TAXA}kbps
tc class add dev ${DEV} parent 1:1 classid 1:11 htb rate ${PRATA}kbps ceil ${TAXA}kbps
tc class add dev ${DEV} parent 1:1 classid 1:12 htb rate ${BRONZE}kbps ceil ${TAXA}kbps
# adicionando qdisc para cada classe
tc qdisc add dev ${DEV} parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev ${DEV} parent 1:11 handle 11: sfq perturb 10
tc qdisc add dev ${DEV} parent 1:12 handle 12: sfq perturb 10
# criando os filtros para direcionar os trafegos para cada classe de acordo com o IP
# de destino
tc filter add dev ${DEV} protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.2.1 flowid 1:10 # vai para ouro
tc filter add dev ${DEV} protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.2.2 flowid 1:11 # vai para prata
tc filter add dev ${DEV} protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.2.3 flowid 1:12 # vai para bronze
Teste de Servidor DNS
#!/usr/bin/python
import os
def limpar(equipe, registro, servidor):
enter=''
print("Tecle ENTER...")
raw_input(enter)
os.system('clear')
print('@' + servidor + ' ' + registro + ' ' + equipe)
def main():
equipes = {}
prefixo = '200.135.37'
dominio = 'sj.ifsc.edu.br'
equipes.update({'iguana':'111'})
equipes.update({'mlwnetworks':'112'})
equipes.update({'technet':'113'})
equipes.update({'urano':'114'})
equipes.update({'epsilon':'115'})
for equipe in equipes:
for registro in ('SOA', 'NS', 'MX', 'A'):
limpar(equipe, registro, prefixo + '.65')
os.system('dig @' + prefixo + '.65 ' + registro +
' ' + equipe + '.' + dominio)
limpar(equipe, registro, prefixo + '.' + equipes[equipe])
os.system('dig @' + prefixo + '.' + equipes[equipe] +
' ' + registro + ' ' + equipe + '.' + dominio)
if __name__ == '__main__':
main()