Назад | Перейти на главную страницу

Перенаправление порта SSH VPC в частную подсеть

Итак, я ДНЕЙ ломал голову над этой дилеммой. У меня есть настройка VPC с общедоступной подсетью и частной подсетью. Естественно, NAT на месте. Я могу подключиться по SSH к экземпляру в публичной подсети, а также к NAT. Я даже могу ssh подключиться к частному экземпляру из общедоступного экземпляра. Я изменил конфигурацию SSHD на частном экземпляре, чтобы принимать как порт 22, так и произвольный номер порта 1300. Это нормально работает.

Но мне нужно настроить его так, чтобы я мог напрямую подключиться к частному экземпляру, используя номер порта 1300, т.е.

ssh -i keyfile.pem user@1.2.3.4 -p 1300

и 1.2.3.4 должен направлять его на внутренний сервер 10.10.10.10.

Теперь я услышал, что iptables - это то, что нужно для этого, поэтому я пошел дальше, исследовал и поиграл с маршрутизацией с этим. Это правила, которые я установил для общедоступного экземпляра (не для NAT). Я не хотел использовать для этого NAT, поскольку AWS, по всей видимости, предварительно настраивает экземпляры NAT при их настройке, и я слышал, что использование iptables может это испортить.

*filter
:INPUT ACCEPT [129:12186]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [84:10472]
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state NEW -m tcp --dport 1300 -j ACCEPT
-A INPUT -d 10.10.10.10/32 -p tcp -m limit --limit 5/min -j LOG --log-prefix "SSH Dropped: "
-A FORWARD -d 10.10.10.10/32 -p tcp -m tcp --dport 1300 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on Wed Apr 17 04:19:29 2013
# Generated by iptables-save v1.4.12 on Wed Apr 17 04:19:29 2013
*nat
:PREROUTING ACCEPT [2:104]
:INPUT ACCEPT [2:104]
:OUTPUT ACCEPT [6:681]
:POSTROUTING ACCEPT [7:745]
-A PREROUTING -i eth0 -p tcp -m tcp --dport 1300 -j DNAT --to-destination 10.10.10.10:1300
-A POSTROUTING -p tcp -m tcp --dport 1300 -j MASQUERADE
COMMIT

Итак, когда я пробую это дома. Это просто время ожидания. Никакие сообщения отказались от соединения или что-то еще. И я не могу найти никаких сообщений журнала о потерянных пакетах.

Мои группы безопасности и настройки ACL разрешают обмен данными через эти порты в обоих направлениях в обеих подсетях и через NAT. Я в недоумении. Что я делаю не так?

Для потомков это пятиступенчатый процесс. Хост-бастион - это общедоступный сервер, который вы хотите защитить от потенциальных атак и через который ваши соединения будут передаваться на серверы в вашей частной подсети.

Шаг 1. Включите переадресацию IP (хост Bastion)

Подключитесь по SSH к хосту-бастиону и в командной строке выполните следующую команду:

echo 1 > /proc/sys/net/ipv4/ip_forward

Шаг 2. Измените IP-таблицы (хост Bastion)

Подключитесь по SSH к хосту-бастиону и в ответ на приглашение выполните следующие команды:

sudo iptables -t nat -A PREROUTING -p tcp -m tcp --dport {PUBLIC_SSH_PORT} -j DNAT --to-destination {PRIVATE_IP_ADDRESS}:22
sudo iptables -t nat -A POSTROUTING -p tcp -m tcp --dport {PUBLIC_SSH_PORT} -j MASQUERADE

где:

  1. {PUBLIC_SSH_PORT} порт на хосте бастиона, через который вы планируете подключиться
  2. {PRIVATE_IP_ADDRESS} это адрес сервера в частной подсети, к которой вы планируете подключиться

Для получения более подробной информации о том, что означают эти конфигурации, вы можете запустить следующие команды в командной строке для просмотра страниц руководства:

man iptables
man iptables-extensions

Шаг 3. Настройте группы безопасности (консоль Amazon AWS)

Войдите в консоль Amazon AWS и перейдите в панель управления группами безопасности. Отредактируйте группу безопасности, назначенную вашему бастионному узлу, и добавьте:

  1. Пользовательское правило TCP разрешить входящие и исходящие соединения на {PUBLIC_SSH_PORT} с любого IP-адреса, с которого вы будете подключаться
  2. Пользовательское правило TCP чтобы разрешить входящие и исходящие соединения для Весь трафик в / из группы безопасности частного сервера (введите идентификатор группы безопасности в поле Custom IP) - вы можете ограничить это только трафиком SSH, но если у вас есть другие службы и серверы, к которым вам необходимо получить доступ, это простейшая конфигурация

Отредактируйте группу безопасности, назначенную вашему частному серверу, и добавьте:

  1. Пользовательское правило TCP чтобы разрешить входящие и исходящие соединения для Весь трафик в / из группы безопасности хоста-бастиона (введите идентификатор группы безопасности в поле Custom IP) - вы можете ограничить это только трафиком SSH, но если у вас есть другие службы и серверы, к которым вам нужно получить доступ, это простейшая конфигурация

Шаг 4. Отключите проверку источника / назначения (консоль Amazon AWS)

Войдите в консоль Amazon AWS и перейдите на панель управления инстансами. Щелкните хост-бастион, который вы только что настроили для пересылки соединений. Отключите проверку источника / назначения в меню действий. Это единственное устройство, для которого необходимо отключить проверку источника / назначения.

Шаг 5. Сделайте конфигурации постоянными (перезагрузка сервера)

Измените /etc/sysctl.conf файл и обновите следующую строку (измените 0 на 1):

# Controls IP packet forwarding
net.ipv4.ip_forward = 1

Спасти iptables конфигурация (чтобы /etc/sysconfig/iptables), поэтому он будет перезагружен при загрузке:

sudo service iptables save

И наконец, убедитесь, что iptables сам запускается при загрузке:

sudo chkconfig iptables on

НОТА: Вам не нужно устанавливать и настраивать отдельный экземпляр Amazon NAT, чтобы получить SSH-доступ к частным серверам. Экземпляр NAT идеален, если вы планируете управлять доступом в Интернет для различных устройств, которые могут быть в вашей частной подсети.

Вы отключили проверку источника / назначения?

По умолчанию AWS проверяет источник и адресат сетевого трафика, поэтому экземпляр должен быть конечным пунктом назначения любого трафика, который он отправляет или получает. Чтобы перенаправить трафик от одного экземпляра к другому, вам необходимо отключить эту проверку:

http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_NAT_Instance.html#EIP_Disable_SrcDestCheck

Другая потенциальная проблема заключается в том, что маршрутизация не была включена на уровне ядра, запустив что-то вроде:

echo 1 > /proc/sys/net/ipv4/ip_forward