Estou com um pequeno problema em obter uma configuração adequada do iptables no Ubuntu. Mas antes, deixe-me descrever a configuração da rede:
Estou usando uma linha xDSL terminada com modem + roteador + DHCP servindo a sub-rede 192.168.1.0/24. Meu laptop e PC estão conectados a esta rede e obtêm os endereços 192.168.1.6 e 192.168.1.3 respectivamente. No PC, tenho Ubuntu rodando com VBox e 2 máquinas virtuais (ambas Ubuntu também). A interface vboxnet0 no PC recebe o IP 10.10.10.1 e as máquinas virtuais individuais recebem 10.10.10.10 e 10.10.10.11. VM1 executa o servidor web Apache para fins de teste.
Agora, do meu PC (192.168.1.3), posso acessar o site VM1 hospedado pelo Apache em 10.10.10.10 digitando o endereço no navegador. Não há problemas aí.
Porém, gostaria de poder acessar o mesmo site do meu laptop (192.168.1.6), digitando o mesmo 10.10.10.10 na barra de endereço do navegador. Isso não funciona, no entanto. Não consigo acessar a rede por algum motivo. Parece que o endereço IP é desconhecido na rede 192.168.1.x. Se houver uma maneira de configurar isso de maneira simples via iptables, seria um ótimo começo.
Agora, se essa etapa for possível, gostaria ainda de poder configurar uma configuração mais complexa. Usando o endereço 192.168.1.3 e o endereço de porta adequado, gostaria de poder encaminhar solicitações de serviço específicas para a instância de VM adequada. Por exemplo, 192.168.1.3:80 deve ir para VM1 e buscar o site hospedado no Apache. 192.168.1.3:4000 (por exemplo), deve ir para VM2 e obter o serviço SFTP hospedado lá. Resumindo, gostaria de realizar o roteamento específico da porta de destino no PC para permitir a comunicação bidirecional entre computadores conectados a redes 192.168.1.x e VMs em execução na rede 10.10.10.x. Existe uma solução simples para isso usando iptables?
aqui está um exemplo que eu criei até agora, mas não consegui fazer o encaminhamento funcionar corretamente. Tenho certeza de que há muitos erros aqui - é meu primeiro dia no iptables.
clear
# cleaning Firewall Rules , change ACCEPT to DROP if you want to shield
# the server, then you open ports as you need
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
# Accepts all established inbound connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# opening INPUT ports (22,80,8080)
iptables -A INPUT --protocol tcp --dport 22 -j ACCEPT && echo "rule input 22 ok"
iptables -A INPUT --protocol tcp --dport 80 -j ACCEPT && echo "rule input 80 ok"
iptables -A INPUT --protocol tcp --dport 443 -j ACCEPT && echo "rule input 443 ok"
iptables -A INPUT --protocol tcp --dport 8080 -j ACCEPT && echo "rule input 8080 ok"
#allow Loopback and networks
iptables -A INPUT -i lo -j ACCEPT && echo "rule 7 ok"
#Accept any input from 10.10.10.0 network in vboxnet0 interface
iptables -A INPUT -s 10.10.10.0/24 -i vboxnet0 -j ACCEPT && echo "rule 8 ok"
#enable Port forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
# Opening PREROUTING - Filtering : this make the port forwarding trick.
# Forward as many ports you want to certain machines of the network to provide services such web server, ftp server, etc...
iptables -t nat -A PREROUTING -p tcp -i eth1 -d 192.168.1.0/24 --dport 8080 -j DNAT --to 10.10.10.10:80 && echo "rule 9 ok"
#iptables -t nat -A PREROUTING -p tcp -i eth1 -d xxx.xxx.xxx.xxx --dport 53 -j DNAT --to 10.10.10.14:53 && echo "rule 10 ok"
#iptables -t nat -A PREROUTING -p udp -i eth1 -d xxx.xxx.xxx.xxx --dport 53 -j DNAT --to 10.10.10.14:53 && echo "rule 11 ok"
#iptables -t nat -A PREROUTING -p udp -i eth1 -d xxx.xxx.xxx.xxx --dport 21 -j DNAT --to 10.10.10.16:21 && echo "rule 12 ok"
#Opening FORWARD ports for network services on vlan
iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 80 -j ACCEPT && echo "rule 13 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 21 -j ACCEPT && echo "rule 14 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 68 -j ACCEPT && echo "rule 15 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 22 -j ACCEPT && echo "rule 16 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p tcp --dport 53 -j ACCEPT && echo "Rule 17 ok"
#iptables -A FORWARD -s 10.10.10.0/24 -i vboxnet0 -p udp --dport 53 -j ACCEPT && echo "Rule 18 ok"
# Opening POSTROUTING PROCESSES
# Netmasking is absolutelly necesary to protect vlan from attacks, only it hides their ip....
iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth1 -j MASQUERADE && echo "rule 19 ok"
# Reject all other inbound - default deny unless explicitly allowed policy
iptables -A INPUT -j REJECT
iptables -A FORWARD -j REJECT
# test and display the rules if runs properly
iptables -L
Obrigado por qualquer ajuda
Marek
Responder1
Em primeiro lugar, você deve considerar a configuração mais simples do uso de rede em ponte no VirtualBox. Basicamente, isso colocará as VMs diretamente na LAN, para que elas obtenham endereços 192.168.1.0/24 e possam ser acessadas diretamente de outras máquinas na LAN.
Sua regra DNAT parece correta, mas suspeito que esteja bloqueada na cadeia FORWARD. Pacotes NAT ainda precisam atravessar a cadeia FORWARD e, portanto, precisam ser aceitos lá, com algo assim:
iptables --append FORWARD --in-interface eth1 --out-interface vboxnet0 --destination 10.10.10.10 --protocol tcp --dport 80 --jump ACCEPT
No entanto, eu sugiro que você configure a cadeia FORWARD para ACCEPT por padrão enquanto as regras NAT funcionam. Assim que o NAT estiver funcionando, comece a restringir a cadeia FORWARD.