Не могут SSH устройства внутри подсети

У меня есть три компьютера, настроенные так:

введите описание здесь

Но у меня возникают проблемы с пониманием того, как настроить /etc/network/interfaces для каждого устройства, чтобы все они могли получить доступ к Интернету.

Я попробовал это:

Load Balancer:
    Eth1 (Local)
        address 192.168.1.10
        netmask 255.255.255.0
        network 192.168.0.0
        gateway 192.168.1.254 #hub
    Eth0
        address 192.168.0.10
        netmask 255.255.255.0
        network 192.168.1.0
        broadcast 192.168.1.255 #hub

RPi1:
    address 192.168.0.20
    netmask 255.255.255.0
    network 192.168.1.0
    broadcast 192.168.0.10 #Load Balancer Eth0
    gateway 192.168.1.10 #Load Balancer Eth1
RPi2:
    address 192.168.0.30
    netmask 255.255.255.0
    network 192.168.1.0
    broadcast 192.168.0.10 #Load Balancer Eth0
    gateway 192.168.1.10 #Load Balancer Eth1

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

Я также пытался sshтак:

ssh -t 192.168.1.10 ssh 192.168.0.20 

Но это не работает

Править для Дуга Смитиса

Я перепробовал все, что вы предложили, и не было никаких ошибок, но это не сработало! Я собираюсь попробовать сейчас с

EXTIF="eth1"
INTIF="eth0"

Наоборот, потому что я думаю, что это так?

Итак, RPi1s /etc/network/interfaces файл выглядит примерно так:

auto lo etho
iface eth0 inet static

address 192.168.0.20
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.10
dns-nameservers 8.8.8.8
dns-search google.com

но, к сожалению, я не могу редактировать это сейчас, потому что я не рядом с Пи! И я не буду в течение нескольких недель.

Я пытался пинговать 8.8.8.8, прежде чем уйти, и он сказал что-то вроде:

192.168.1.10 сеть недоступна

Снова и снова.

Также мне нужно открыть какие-либо порты на маршрутизаторе? Я настроил переадресацию портов 8051 и 8052 на 192.168.1.10.

Ох, и я также отредактировал файл sshd на RPi1 для прослушивания порта 8051

редактировать 2

Я попробовал еще раз:

ssh -p 8051 pi@1.2.3.4

И я получаю ошибку:

ssh_exchange_identification: соединение закрыто удаленным хостом

Я чувствую, что мы приближаемся!

редактировать 3

Но когда я пытаюсь локально (используя teamviewer для локального компьютера) ssh вроде:

192.168.0.20:8051

Это не работает. Что я думаю, это очень плохой знак!

sudo netstat -plnt

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      644/rpcbind     
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1286/nginx      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1211/sshd       
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1428/cupsd      
tcp        0      0 0.0.0.0:445             0.0.0.0:*               LISTEN      814/smbd        
tcp        0      0 0.0.0.0:38503           0.0.0.0:*               LISTEN      697/rpc.statd   
tcp        0      0 0.0.0.0:139             0.0.0.0:*               LISTEN      814/smbd        
tcp6       0      0 :::111                  :::*                    LISTEN      644/rpcbind     
tcp6       0      0 :::80                   :::*                    LISTEN      1286/nginx      
tcp6       0      0 :::22                   :::*                    LISTEN      1211/sshd       
tcp6       0      0 ::1:631                 :::*                    LISTEN      1428/cupsd      
tcp6       0      0 :::445                  :::*                    LISTEN      814/smbd        
tcp6       0      0 :::54661                :::*                    LISTEN      697/rpc.statd   
tcp6       0      0 :::139                  :::*                    LISTEN      814/smbd   

2 ответа

Решение

Из нашего обширного сеанса чата: Ваша установка была / страдала от: Проблемы с вашим маршрутизатором, не пересылающим как ожидалось; Хакеры, пытающиеся проникнуть через существующий и работающий порт 22, перенаправят на ваш компьютер балансировки нагрузки; UFW включается, мешая предложенному сценарию iptables.

Метод доступа 1: Цепочка сессий SSH:

Создайте ssh-сеанс обычным способом с внешнего компьютера на свой (LB) компьютер с балансировкой нагрузки. Используйте этот сеанс для создания нового сеанса ssh между LB и RPi:

ssh pi@192.168.0.20

или, если RPi изменил свой прослушивающий порт ssh согласно методу 2 ниже:

ssh -p 8051 pi@192.168.0.20

Этот метод НЕ дает доступ к Интернету RPi самостоятельно.

Способ доступа 2: цепной порт вперед

Вам нужно будет выполнить переадресацию портов в двух местах (ваш маршрутизатор, а затем также и на вашем балансировщике нагрузки), чтобы иметь возможность ssh подключаться к компьютерам RPi1 и RPi2, и это другая история, чем они могут получить доступ к Интернету или нет. Поскольку вы упоминаете, что это уже работает, я предполагаю, что переадресация портов уже настроена на вашем маршрутизаторе для ssh к балансировщику нагрузки. Вам придется использовать два разных порта для пересылки, по одному для каждого из RPi1 и RPi2. Я произвольно выбрал порт 8051 и 8052, но вы можете изменить их.

Однако, прежде чем вы начнете думать о дальнейшей переадресации портов, вы должны сделать так, чтобы ваши компьютеры RPi1 и RPi2 могли выходить в Интернет. Вам нужно будет сделать балансировщик нагрузки маршрутизатором. Это может быть очень простой маршрутизатор, при условии, что маршрутизатор на 192.168.1.254 позаботится о вещах типа брандмауэра.

Исправьте ваши файлы интерфейсов. Предложение (отредактировано для отражения окончательной версии):

На LB:

# The loopback network interface
auto lo eth1 eth0
iface lo inet loopback

iface eth1 inet static
address 192.168.1.10
netmask 255.255.255.0
gateway 192.168.1.254
dns-nameservers 8.8.8.8
dns-search google.com

iface eth0 inet static
address 192.168.0.10
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255

RPi1: согласно вашему редактированию. RPi2: то же самое, за исключением IP-адреса.

Сначала отключите ufw, так как в этом случае он не добавляет никакого значения и конфликтует с тем, что мы хотим сделать:

sudo ufw disable

Теперь вот набор правил iptables, который нужно попробовать (редактирование было проверено Максимилианом, работает нормально):

#!/bin/sh
FWVER=0.01
#
# Maximilian rule set 2015.03.08 Ver:0.01
#     Port forward to RPi1 and RPi2
#     and be a NAT router for them also.
#
#     This may conflict with other stuff on the cluster computer,
#     I don't know.
#     If so, this may need to be merged somehow with whatever.
#
#     The router needs to be configured to forward ports 8051
#     and 8052 to 192.168.1.10
#     In turn, 192.168.1.10 will forward them again with this rule set.
#
#     run as sudo
#

echo "Loading Maximilian rule set version $FWVER..\n"

# The location of the iptables program
#
IPTABLES=/sbin/iptables

#Setting the EXTERNAL and INTERNAL interfaces and addresses for the network
#
EXTIF="eth1"
INTIF="eth0"
EXTIP="192.168.1.10"
INTIP="192.168.0.10"
RPI1="192.168.0.20"
RPI2="192.168.0.30"
UNIVERSE="0.0.0.0/0"

echo "  External Interface: $EXTIF  Internal Interface: $INTIF  External IP: $EXTIP  Internal IP: $INTIP  RPi1: $RPI1  RPi2: $RPI2"

#CRITICAL:  Enable IP forwarding since it is disabled by default
#
echo Enabling forwarding...
echo "1" > /proc/sys/net/ipv4/ip_forward

#Clearing any previous configuration
#
echo "  Clearing any existing rules and setting default policy to ACCEPT.."
$IPTABLES -P INPUT ACCEPT
$IPTABLES -F INPUT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -F OUTPUT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -F FORWARD
$IPTABLES -t nat -F
# Delete user defined chains
$IPTABLES -X
# Reset all IPTABLES counters
$IPTABLES -Z
# While my references do not have it, I think this is needed.
$IPTABLES -t nat -Z

$IPTABLES -t nat -A PREROUTING -p tcp -i $EXTIF --dport 8051 -j DNAT --to-destination $RPI1:8051
$IPTABLES -t nat -A PREROUTING -p tcp -i $EXTIF --dport 8052 -j DNAT --to-destination $RPI2:8052

#
# FORWARD rules would only be if the default policy is not ACCEPT
#

$IPTABLES -t nat -A POSTROUTING -o $EXTIF -j SNAT --to $EXTIP

echo Maximilian rule set version $FWVER done.

Проверьте, выполнив команду ping из RPi:

ping 8.8.8.8

Если это работает, попробуйте получить доступ из Интернета через SSH. Например, если внешний IP-адрес вашего маршрутизатора 1.2.3.4:

ssh -p 8051 pi@1.2.3.4

Обвиоулси, вам придется настроить ваш SSH-сервер RPi1 для прослушивания через порт 8051, а SSH-сервер RPi2 для прослушивания через порт 8052.

Если вы довольны сценарием iptables и хотите, чтобы он загружался автоматически, отредактируйте файл /etc/network/interfaces и добавьте команду предварительного запуска (укажите местоположение и имя файла независимо от того, что вы использовали):

# The loopback network interface
auto lo eth1 eth0
iface lo inet loopback
pre-up /home/maximilian/iptable

iface eth1 inet static
address 192.168.1.10
netmask 255.255.255.0
gateway 192.168.1.254
dns-nameservers 8.8.8.8
dns-search google.com

iface eth0 inet static
address 192.168.0.10
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255

Побочные проблемы SSH паролей:

Теперь, для вашей проблемы хакеров, пытающихся проникнуть через парольную атаку SSH, я использую этот трюк, который был чрезвычайно эффективным в течение многих лет. Однако обратите внимание, что другие предложат использовать другой порт и использовать ключи вместо паролей. Я делаю это так, потому что мне нравится изучать атаки:

# Allow any related traffic coming back to the server in.
#
#
$IPTABLES -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT
# Secure Shell on port 22.
#
# Dynamic Badguy List. Detect and DROP Bad IPs that do password attacks on SSH.
# Once they are on the BADGUY list then DROP all packets from them.
#$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 5400 --name BADGUY_SSH -j LOG --log-prefix "SSH BAD:" --log-level info
#$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 5400 --name BADGUY_SSH -j DROP
# Sometimes make the lock time very long. Typically to try to get rid of coordinated attacks from China.
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j LOG --log-prefix "SSH BAD:" --log-level info
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j DROP
$IPTABLES -A INPUT -i $EXTIF -p tcp -m tcp --dport 22 -m recent --set --name BADGUY_SSH -j ACCEPT

Но будьте осторожны, чтобы не запереть себя, как я это делал, когда уезжал в командировки. Обратите внимание, что я делаю еще одно изменение. Я редактирую sshd.conf и добавляю это:

#Limit the number of bad passwords per connection to 2. Default is 6.
#Then the iptables connection counter will kick in sooner to drop
#password attack hackers.
MaxAuthTries 2

Сокращения

  • Начальная точка - маршрутизатор
  • OUT/ Целевой ресурс - Rpi N
  • LB - Балансировщик нагрузки

Чтобы быть ясным

Что касается начала, мысль о том, что вы не можете подключиться к RPi извне, не означает, что Интернет недоступен из самой RPi. Так что это "плохая" проверка.

Вы можете легко подключиться к RPi из LB, просто через ssh в LB и из LB ssh в любой RPi, какой захотите.

Теперь о более сложных вещах

Вот две задачи:

а) обеспечить доступ в Интернет для RPis ( RPi -> INET)

ФУНТ:

  • маршрут по умолчанию должен быть установлен через локальный IP-адрес
  • пересылка должна быть включена в ядре
  • брандмауэр должен разрешить пересылку

RPi:

  • В качестве шлюза может использоваться кластер ip, в качестве днс - любой днс сервер.

б) обеспечить доступ из интернета / маршрутизатора к RPI ( IN -> RPis)

Между точками IN и OUT присутствует LB, так как в результате IN не увидит RPis напрямую. Чтобы решить вашу проблему, ваша кластерная IP-подсеть должна быть маршрутизирована LB.

Так что если вы:

  • изменить таблицу маршрутизации на маршрутизаторе (IN), пример: route add -net 192.168.0.0 маска сети 255.255.255.0 gw 192.168.1.10
  • разрешить пересылку пакетов на уровне ядра (LB): net.ipv4._ip_forward =1
  • разрешить пересылку на брандмауэре LB

    Вам будет хорошо с доступом к IN -> RPi. После этого вы сможете напрямую переадресовывать порты на RPi из IN (роутера).

Все эти способы реализованы с мыслью, что ваш LB находится в середине.

В качестве более простого варианта вы можете подключить коммутатор к маршрутизатору напрямую и построить топологию своей сети в одноранговой сети.

Подсказка:

не используйте ssh в качестве тестов или netstat для проверки прослушивания портов. В настоящее время у вас есть проблемы со связью между сетями, поэтому traceroute, команды маршрутизации из IN -> RPi, RPi -> IN, RPi -> INET предоставят больше информации о вашей проблеме

Другие вопросы по тегам