Не могут 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 предоставят больше информации о вашей проблеме