Зворотний тунель SSH: як я можу надіслати свій номер порту на сервер?


12

У мене є дві машини, клієнт і сервер.

Клієнт (який стоїть за корпоративним брандмауером) відкриває зворотний тунель SSH до Сервера, який має загальнодоступну IP-адресу, використовуючи цю команду:

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

У OpenSSH 5.3+, що 0виникає одразу після того, як -Rозначає "вибрати доступний порт", а не явно вимагати його. Причиною цього я є те, що я не хочу вибирати порт, який вже використовується. По правді, насправді існує багато клієнтів, яким потрібно встановити подібні тунелі.

Проблема на даний момент полягає в тому, що сервер не знає, хто це Клієнт. Якщо ми хочемо повернутися до одного з цих клієнтів (через localhost), то як ми можемо знати, який порт посилається на якого клієнта?

Мені відомо, що 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 dir

./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-адресу. Чому це? І B) чи означає такий підхід, що 4 з'єднання використовуються для кожного з'єднання?
Том

У деяких системах Linux синтаксис для рядка ifconfig-push відрізняється. Напр. ifconfig-push 192.168.100.2 192.168.100.3- Я не маю уявлення, чому це відрізняється на платформах. І так, це означає, що 4 клієнта використовуються на клієнта (марно, але характер звіра).
Бен Лессані - Сонассі

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]для вибору номера порту в цьому діапазоні.
kasperd

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

Запустити як корінь.


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

Ви можете або не знадобитися двом судо. Видаліть, якщо цього не зробите.

PS - Це модифікована версія рішення, яку я знайшов в іншому місці. Я думаю, що це можливо походить від StackOverflow, але не можу знайти оригінальну посилання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.