У меня небольшая проблема с правильной настройкой iptables в Ubuntu. Но прежде позвольте мне описать конфигурацию сети:
Я использую линию xDSL, оканчивающуюся модемом+маршрутизатором+DHCP, обслуживающую подсеть 192.168.1.0/24. Мой ноутбук и ПК подключены к этой сети и получают адреса 192.168.1.6 и 192.168.1.3 соответственно. На ПК у меня запущена Ubuntu с VBox и 2 виртуальными машинами (обе тоже Ubuntu). Интерфейсу vboxnet0 на ПК назначен IP 10.10.10.1, а отдельные виртуальные машины получают 10.10.10.10 и 10.10.10.11. VM1 запускает веб-сервер Apache для тестовых целей.
Теперь с моего ПК (192.168.1.3) я могу получить доступ к веб-сайту VM1 Apache hosted по адресу 10.10.10.10, введя адрес в браузере. Никаких проблем.
Однако я хотел бы иметь возможность зайти на тот же сайт с моего ноутбука (192.168.1.6), введя тот же 10.10.10.10 в адресной строке браузера. Но это не работает. По какой-то причине я не могу войти в сеть. Похоже, что IP-адрес просто неизвестен в сети 192.168.1.x. Если есть способ настроить это простым способом через iptables, это было бы отличным началом.
Теперь, если этот шаг возможен, я бы хотел иметь возможность настроить более сложную настройку. Используя адрес 192.168.1.3 и правильный адрес порта, я бы хотел иметь возможность пересылать определенные запросы на обслуживание на правильный экземпляр виртуальной машины. Например, 192.168.1.3:80 должен идти на виртуальную машину 1 и загружать веб-сайт, размещенный на Apache. 192.168.1.3:4000 (например) должен идти на виртуальную машину 2 и загружать размещенную там службу SFTP. Короче говоря, я бы хотел выполнить маршрутизацию на основе порта назначения на ПК, чтобы обеспечить двунаправленную связь между компьютерами, подключенными к сетям 192.168.1.x, и виртуальными машинами, работающими в сети 10.10.10.x. Есть ли простое решение для этого с использованием iptables?
Вот пример, который я уже состряпал, но не смог заставить пересылку работать правильно. Я уверен, что здесь куча ошибок — это мой первый день, проведенный с 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
Спасибо за любую помощь
Марек
решение1
Во-первых, вам следует рассмотреть более простую настройку с использованием мостовой сети в VirtualBox. Это по сути поместит виртуальные машины непосредственно в локальную сеть, так что они получат адреса 192.168.1.0/24 и к ним можно будет получить прямой доступ с других машин в локальной сети.
Ваше правило DNAT выглядит правильным, но я подозреваю, что оно блокируется в цепочке FORWARD. Пакеты NAT все еще должны пройти через цепочку FORWARD, и поэтому их нужно принять там, с помощью чего-то вроде этого:
iptables --append FORWARD --in-interface eth1 --out-interface vboxnet0 --destination 10.10.10.10 --protocol tcp --dport 80 --jump ACCEPT
Однако я бы посоветовал вам настроить цепочку FORWARD на ACCEPT по умолчанию, пока вы получаете работающие правила NAT. Как только NAT заработает, начните ограничивать цепочку FORWARD.