Моя установка сделана из (на том же хосте):

  • Сетевая интерфейсная карта (NIC) eth0 со статическим IP 192.168.1.10
  • метка для NIC eth0:0 со статическим IP 192.168.1.11
  • виртуальная гостевая машина (использующая KVM) по адресу 192.168.122.11 на virbr0

Я могу SSH гостевой машины с хоста, используя его IP 192.168.122.11, и я могу SSH хост-машины с удаленной машины в сети LAN, используя его IP 192.168.1.10.

Я хотел бы сделать виртуальный гость доступным из локальной сети через помеченную сетевую карту, чтобы я мог подключиться по SSH к 192.168.122.11, подключившись к 192.168.1.11 с удаленной машины.

+--------------+
| Machine Ext2 |
+--------------+
       | ssh to 192.168.1.11:2222
       |
   +--------+
   | Router |
   +--------+
       |
       | (192.168.1.11:2222)
+----------------------------------------------+
| Machine Ext1 (Host)                          |
| <--> iptables <--> Guest (192.168.122.11:22) |
+----------------------------------------------+

Я был вдохновлен многими вещами из разных уроков в Интернете (все выглядят более или менее одинаково), но ничего не работает, и я не могу понять правильную настройку ..

Идея состоит в том, чтобы создать правила PREROUTING, FORWARD и POSTROUTING с iptables, чтобы входящие и исходящие потоки трафика были перенаправлены правильно.

Я отредактировал /etc/sysctl.conf так, чтобы ip_fordward = 1, и запустил следующие команды iptables:

$ sudo iptables -t nat -A PREROUTING -i virbr0 -p tcp -d 192.168.1.11 --dport 2222 -j DNAT --to-destination 192.168.122.11:22
$ sudo iptables -A FORWARD -p tcp -d 192.168.122.11 --dport 22 -j ACCEPT
$ sudo iptables -t nat -A POSTROUTING -o virbr0 -p tcp -d 192.168.122.11 -j ACCEPT

Пинг 192.168.1.11 все еще работает нормально. Но подключение к 192.168.1.11:2222 не удается:

$ telnet 192.168.1.11 2222
$ telnet: Unable to connect to remote host: Connection refused

Я чувствую, что я близко, чтобы заставить это работать, но что-то упускаю .. Можете ли вы дать мне небольшую помощь?

С наилучшими пожеланиями,

1 ответ1

0
  • Ваше первое правило использует -i virbr0 . Если предполагается использовать его из локальной сети, это должно быть -i eth0 и, скорее всего, это ваша проблема.
  • Если ваша политика FORWARD по умолчанию - ПРИНЯТЬ, ваше второе правило бесполезно. Если это DROP, то вам нужно другое правило в FORWARD, чтобы разрешить обратный поток. Можете ли вы дать свой полный набор правил iptables с помощью: iptables-save -c ?
  • Ваше третье правило бесполезно. Таблицы nat не требуют явного ПРИНЯТИЯ. Обратный поток всегда выполняется корректно (с помощью conntrack), потому что он с состоянием. Убери это.
  • При тестировании обязательно выполняйте тестирование из локальной сети (другой системы), а не с вашего хоста (тестирование с самого хоста не будет использовать PREROUTING или FORWARDING, а будет OUTPUT nat и OUTPUT фильтра, так что для этого потребуется как минимум другой нац правило)

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