Итак, я ДНЕЙ ломал голову над этой дилеммой. У меня есть настройка 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. Я в недоумении. Что я делаю не так?
Для потомков это пятиступенчатый процесс. Хост-бастион - это общедоступный сервер, который вы хотите защитить от потенциальных атак и через который ваши соединения будут передаваться на серверы в вашей частной подсети.
Подключитесь по SSH к хосту-бастиону и в командной строке выполните следующую команду:
echo 1 > /proc/sys/net/ipv4/ip_forward
Подключитесь по 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
где:
Для получения более подробной информации о том, что означают эти конфигурации, вы можете запустить следующие команды в командной строке для просмотра страниц руководства:
man iptables
man iptables-extensions
Войдите в консоль Amazon AWS и перейдите в панель управления группами безопасности. Отредактируйте группу безопасности, назначенную вашему бастионному узлу, и добавьте:
Отредактируйте группу безопасности, назначенную вашему частному серверу, и добавьте:
Войдите в консоль Amazon AWS и перейдите на панель управления инстансами. Щелкните хост-бастион, который вы только что настроили для пересылки соединений. Отключите проверку источника / назначения в меню действий. Это единственное устройство, для которого необходимо отключить проверку источника / назначения.
Измените /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