2

У меня небольшая проблема с получением правильной конфигурации 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 в 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 должен перейти на VM1 и получить веб-сайт Apache. 192.168.1.3:4000 (например), следует перейти к VM2 и разместить там службу 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

Спасибо за любую помощь

Marek

1 ответ1

1

Во-первых, вы должны рассмотреть более простую настройку использования мостовой сети в VirtualBox. По сути, это приведет к тому, что виртуальные машины будут напрямую подключены к локальной сети, поэтому они получат адреса 192.168.1.0/24 и будут доступны напрямую с других компьютеров локальной сети.

Ваше правило DNAT выглядит правильно, но я подозреваю, что оно заблокировано в цепочке FORWARD. Пакеты NATed все еще должны проходить через цепочку 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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .