Обратный туннель SSH: как я могу отправить свой номер порта на сервер?


12

У меня есть две машины, клиент и сервер.

Клиент (который находится за корпоративным брандмауэром) открывает обратный туннель SSH к серверу, который имеет общедоступный IP-адрес, с помощью этой команды:

ssh -nNT -R0: localhost: 2222 insecure@server.example.com

В OpenSSH 5.3+, 0возникновение сразу после -Rсредства означает «выбрать доступный порт», а не явно вызывать его. Я делаю это потому, что не хочу выбирать порт, который уже используется. По правде говоря, на самом деле существует много Клиентов, которым необходимо установить похожие туннели.

Проблема в том, что сервер не знает, какой клиент какой. Если мы хотим подключиться к одному из этих клиентов (через локальный хост), то как мы узнаем, какой порт относится к какому клиенту?

Мне известно, что ssh сообщает номер порта в командную строку при использовании вышеуказанным способом. Тем не менее, я также хотел бы использовать autossh, чтобы сохранить сессии. Предположительно, autossh запускает свой дочерний процесс через fork / exec, так что вывод действительной команды ssh теряется в эфире.

Кроме того, я не могу придумать другой способ получить удаленный порт от Клиента. Таким образом, мне интересно, если есть способ определить этот порт на сервере.

У меня есть идея как-то использовать / etc / sshrc, который предположительно является скриптом, который запускается для каждого соединения. Тем не менее, я не знаю, как можно получить соответствующую информацию здесь (возможно, PID конкретного процесса sshd, обрабатывающего это соединение?) Я хотел бы некоторые указатели.

Благодарность!


2
Разве VPN не будет более подходящим? OpenVPN очень прост в настройке.
Бен Лессани - Сонасси

Звучит интересно. Я не знаю много о VPN. Может ли это работать, даже если клиентский компьютер настроен на использование DHCP?
Том

1
Да, он запускается из другого интерфейса TUN / TAP, поэтому другие интерфейсы не имеют значения.
Бен Лессани - Сонасси

@sonassi, похоже, что эта штука с VPN поможет. Спасибо за информацию.
Том

Ниже я добавил ответ, специально помогающий вам пройти через процесс VPN с OpenVPN (на основе Debian / Ubuntu)
Бен Лессани - Sonassi

Ответы:


4

Разве VPN не будет более подходящим? OpenVPN очень прост в настройке. Вот пример конфигурации и некоторые ссылки, которые помогут вам в процессе создания сертификата:

apt-get install openvpn
mkdir /etc/openvpn/easy-rsa
mkdir -p /etc/openvpn/ccd/client_server
touch /etc/openvpn/ipp.txt
cp -a /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
source ./vars
./clean-all
./build-ca 
./build-dh
./build-key-server server
cd /etc/openvpn/easy-rsa/keys
openssl pkcs12 -export -out server.p12 -inkey server.key -in server.crt -certfile ca.crt

Затем создайте новый файл /etc/openvpn/client_server.confи вставьте в него следующее, изменив SERVER_IP_ADDRESSсоответствующим образом

local SERVER_IP_ADDRESS
port 8443
proto udp
dev tun
ca /etc/openvpn/easy-rsa/keys/ca.crt
pkcs12 /etc/openvpn/easy-rsa/keys/server.p12
dh /etc/openvpn/easy-rsa/keys/dh1024.pem
ifconfig-pool-persist /etc/openvpn/ipp.txt
server 192.168.100.0 255.255.255.0
client-config-dir /etc/openvpn/ccd/client_server
ccd-exclusive
keepalive 10 120
comp-lzo
persist-key
persist-tun
status /var/log/openvpn-status.log
verb 3
reneg-sec 0

Затем создайте ключ для пользователя, который будет подключаться, и создайте файл конфигурации в директории ccd.

./build-key-pkcs12 user1@domain.com
echo "ifconfig-push 192.168.100.2 255.255.255.0" > /etc/openvpn/ccd/client_server/user1@domain.com

IP-адрес ДОЛЖЕН быть подходящим для подсети / 30 (см. Http://www.subnet-calculator.com/cidr.php ), поскольку для каждого соединения доступно только 2 адреса (сервер и клиент). Таким образом, ваш следующий доступный IP-адрес клиента будет 192.168.100.6 и так далее.

Тогда у вас теперь есть статические IP-адреса для каждого подключающегося пользователя.

Затем предоставьте the user1@domain.com.p12файл конечному пользователю и используйте следующий файл конфигурации

client
dev tun
proto udp
remote SERVER_IP_ADDRESS 8443
pkcs12 user1@domain.com.p12
resolv-retry infinite
nobind
ns-cert-type server
comp-lzo
verb 3
reneg-sec 0

Спасибо за подробный ответ! У меня есть два вопроса по этому поводу, хотя. A) Указание 255.255.255.0 для клиентской строки ifconfig-push не работает, но работает, если я указываю второй IP-адрес. Почему это? И Б) означает ли этот подход, что 4 IP-адреса используются для каждого соединения?
Том

В некоторых системах Linux синтаксис строки ifconfig-push отличается. Например. ifconfig-push 192.168.100.2 192.168.100.3- Я понятия не имею, почему это отличается на платформах. И да, это означает, что 4 IP-адреса используются для каждого клиента (расточительно, но характер зверя).
Бен Лессани - Сонасси

3

Если у каждого клиента разные имена пользователей, вы можете использовать, netstatчтобы узнать, какой порт sshdпрослушивает процесс этого пользователя . Например:

% sudo netstat -tlpn | grep 'sshd: mgorven@'
tcp        0      0 127.0.0.1:22220         0.0.0.0:*               LISTEN      5293/sshd: mgorven@
tcp        0      0 127.0.0.1:5120          0.0.0.0:*               LISTEN      5293/sshd: mgorven@

3

Вы можете изменить временной диапазон портов ( /proc/sys/net/ipv4/ip_local_port_rangeдля Linux), а затем использовать статически распределенные порты за пределами этого диапазона.


Для этого не нужно менять эфемерный диапазон. По умолчанию эфемерный диапазон заканчивается на 61000, поэтому над ним есть тысячи доступных номеров портов. Я часто использовал, echo $[61002+RANDOM%4532]чтобы выбрать номер порта в этом диапазоне.
Касперд

2

Я хочу такую ​​же настройку, как и вы, я увеличил уровень журнала SSH-сервера до DEBUG, и он показал в журналах, какой локальный порт был у клиента

например:

команда клиента: ssh -N -R0:127.0.0.1:5522 connector@example.com

журнал сервера:

Jun 30 11:28:59 debsid sshd[27577]: debug1: Local forwarding listening on 127.0.0.1 port 35391

там вы видите номер порта


0

Вы должны быть в состоянии извлечь соответствующую информацию из вывода:

lsof -i tcp

Запустите как root.


0

Запустите этот скрипт на сервере:

sudo lsof -i -n | grep "sshd" | grep "(LISTEN)" | awk '{print $2}' | while read line; do sudo lsof -i -n | egrep $line | sed 3~3d | sed 's/.*->//' | sed 's/:......*(ESTABLISHED)//' | sed 's/.*://' | sed 's/(.*//' | sed 'N;s/\n/:/' 2>&1 ;done

Вы можете или не можете нуждаться в двух sudo. Удалить, если вы этого не сделаете.

PS - Это модифицированная версия решения, которое я нашел в другом месте некоторое время назад. Я думаю, что это может быть из StackOverflow, но я не могу найти исходную ссылку.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.