Tuesday, October 4, 2011

Windows 7, VMWare, Ubuntu e roteamento

Roteamento básico em Linux, graças ao VMWare Workstation. Este não é um post apenas, é um suposto relato do que fiz hoje para conseguir manipular o roteamento entre duas máquinas virtuais com Ubuntu, no VMWare.

Fica um post chato por ser longo e não ter outputs mas foi a forma que encontrei de explicar o que decidi fazer. Existem N maneiras de fazer o que está abaixo, esta foi a MINHA forma de fazer as coisas, não é a mais correcta nem será a mais elegante mas é eficaz e funciona. Às vezes deslumbro-me e perco-me com pormenores secundários como por exemplo quantos CPU's e quantos cores de cada é que configurei numa VM - isso é completamente irrelevante aqui.


instalei duas máquinas virtuais no VMWare Workstation, um ubuntu 11.04 64 bits com 2 CPUs e 2 cores cada CPU, e um Ubuntu Server 11.04 64 bits com as configurações típicas de uma instalação VMWare.

A única coisa que forcei no server foi a configuração de rede, para Bridged. O Ubuntu Desktop também tem a placa em modo Bridged.

Briged porquê? Porque quero ter endereços atrás (directamente dados pelo DHCP do router) do meu router para poder chegar às máquinas de fora, sem ter que fazer mais do que um NAT. Os NATs subsequentes serão feitos manualmente por mim. Bridged de uma forma muito simples significa que as placas de rede das MVs funcionam como se fossem outros computadores ligados ao mesmo router.

A minha ideia é montar um ambiente em que eu possa fazer tráfego passar de uma máquina virtual para outra e manipular esse tráfego...

típicamente o Ubuntu server servirá de Router e o Desktop será apenas um cliente.

Neste momento temos uma máquina Windows7 que é efectivamente a única máquina física atrás do router e que serve de gateway das máquinas virtuais através da placa de rede. As 2 MVs chegam à internet pois usam como gateway o router (192.168.100.1).

Mudei o gateway do Ubuntu Desktop (daqui em diante designado por UD) para o Ubuntu Server (daqui em diante designado por US).

Removi o gateway antigo (192.168.100.1 - router) e adicionei o novo (192.168.100.130 - US) assim:

route add default gw 192.168.100.130
route del default gw 192.168.100.1

consigo do UD pingar o US mas não chego à internet... porquê? Porque o US não está a funcionar como router ainda... não deixa passar tráfego!

Vamos ver se o tráfego gerado no UD que deveria ir para a internet está a chegar ao US através dum tcpdump. Pelo tcpdump vi que o tráfego estava a chegar ao US, o próximo passo seria activar o ip forwarding no US e testar outra vez.

editei o ficheiro

vi /etc/sysctl.conf:

e descomentei (retirando o # à esquerda da linha) a linha

net.ipv4.ip_forward = 1

Feito isto, confirmo que o US já está a ser usado como gateway do UD e consigo chegar do UD à internet.

próximo passo: NAT.

no UD, alterei a configuração de rede, fiz com que a placa de rede ficasse com um IP diferente, desactivando assim o anterior

(192.168.100.128) da seguinte forma:

ifconfig eth0 10.10.10.1 netmask 255.255.255.0 up

no US, configurei uma sub-interface na placa de rede para que haja comunicação na rede 10.10.10.0/24.

ifconfig eth0:0 10.10.10.2 netmask 255.255.255.0 up

Isto não é nada mais nada menos que simular uma ligação física... funciona porque todas as interfaces virtuais das VMs estão penduradas à interface física do computador e estando elas na mesma interface física, desde que haja uma rede bem configurada nas diferentes placas virtuais, sempre haverá comunicação (a minha explicação pode não ser a mais correcta pois a nível de virtualização e integração, não entendo bem como isto tudo funciona).

agora fiquei sem gateway no UD pela reconfiguração da placa de rede.

Adicionei outra vez o gateway mas desta feita com o endereço da subinterface do US (10.10.10.2) porque o gateway tem de OBVIAMENTE* estar na mesma rede que o host.

route add default gw 10.10.10.2

agora consigo chegar ao 10.10.10.2 sempre que tento ir para qualquer endereço desconhecido mas não saio para a internet, porquê? NAT é

a resposta! Falta fazer o NAT, o meu US tem de perceber que eu quero traduzir todos os endereços da rede 10.10.10.0/24 para o endereço que ele tem na interface virtual principal (192.168.100.130) para que estes depois saiam pelo meu router e este por sua vez faça o seu NAT também... mas isso é outra história.

Vamos ver como funciona o NAT com iptables no US:

/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables --table nat -A POSTROUTING -o eth0 -j MASQUERADE

Pela adição dos dois comandos acima o NAT já está a funcionar no US.

Resumindo:

tenho uma máquina cliente com o IP 10.10.10.1 a chegar à internet via outra máquina através do IP 10.10.10.2 Esta segunda máquina tem uma outra interface de rede que está efectivamente ligada a um router que permite a saída para a internet.

* se alguém não perceber este obviamente, eu posso explicar, mas deveria ser elementar para quem entende minimamente de redes.

No comments:

Post a Comment