Локальная переадресация портов в зависимости от IP-адреса в Linux

Локальная переадресация портов в зависимости от IP-адреса в Linux

Я настроил sshd моего сервера на прослушивание нестандартного порта 42.

Однако на работе я нахожусь за брандмауэром/прокси, которые разрешают исходящие соединения только на порты 21, 22, 80 и 443. Соответственно, я не могу подключиться по ssh к своему серверу с работы, что плохо. Я не хочу возвращать sshd на порт 22.

Идея такова: на моем сервере локально перенаправляем порт 22 на порт 42еслиИсходный IP совпадает с внешним IP моей рабочей сети. Для ясности предположим, что IP моего сервера — 169.1.1.1 (на eth1), а внешний IP моей работы — 169.250.250.250. Для всех IP, отличных от 169.250.250.250, мой сервер должен ответить ожидаемым «подключение отклонено», как это происходит для не прослушиваемого порта.

Я совсем новичок в iptables. Я бегло просмотрел длинное руководство по iptables и эти связанные/релевантные вопросы:

Однако эти вопросы касаются более сложных сценариев с несколькими хостами, и мне не ясно, какие таблицы и цепочки следует использовать для локальной переадресации портов, и следует ли использовать 2 правила (для пакетов «вопрос» и «ответ») или только 1 правило для пакетов «вопрос».

Пока что я включил только пересылку через sysctl. Завтра начну тестировать решения и буду признателен за указания или, может быть, примеры для конкретных случаев для реализации моего простого сценария.

Правилен ли проект решения, представленный ниже?

iptables -A INPUT [-m state] [-i eth1] --source 169.250.250.250 -p tcp
    --destination 169.1.1.1:42 --dport 22 --state NEW,ESTABLISHED,RELATED
    -j ACCEPT

Должен ли я использовать mangleтаблицу вместо filter? И/или FORWARDцепочку вместо INPUT?

решение1

Для пересылки/перенаправления необходимо отредактировать таблицу NAT.

Такое правило, вероятно, ближе всего к тому, что вам нужно.

/sbin/iptables --table nat --append PREROUTING --protocol tcp \
               --source 169.250.250.250 --dport 22 \
               --jump REDIRECT --to-ports 42

Было бы гораздо проще и, вероятно, лучше просто оставить SSH на стандартном порту и как следует его защитить. Использование альтернативного порта замедлит мотивированного злоумышленника всего на пару секунд. Настройте систему предотвращения вторжений, например denyhosts/fail2ban, и отключите аутентификацию на основе пароля. Или рассмотрите возможность ограничения скорости входящих ssh-подключений.

Видеть:

решение2

Я бы использовал Shorewall для управления ip-таблицами. Он устанавливает приличный базовый брандмауэр, и делать то, что вам нужно, просто. Добавьте правило в /etc/shorewall/rules, например:

DNAT net:169.250.250.250 loc:169.250.250.250 tcp 42 22

Как и другие, я не уверен, почему вы запускаете sshd на другом порту. Если это интернет-порт, вы можете рассмотреть port knocking, чтобы держать порт закрытым, пока вы не нажмете на другой порт. Shorewall справляется с этим просто.

Связанный контент