У меня две машины, клиент и сервер.
Клиент (который находится за корпоративным брандмауэром) открывает обратный 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, обрабатывающего это соединение?). Мне бы хотелось несколько указателей.
Спасибо!
Разве 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
Если у каждого клиента разные имена пользователей, вы можете использовать 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@
Вы можете изменить временной диапазон портов (/proc/sys/net/ipv4/ip_local_port_range
для Linux), а затем использовать статически выделенные порты за пределами этого диапазона.
Я хочу такую же настройку, как и вы, я увеличил уровень журнала 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
там вы видите номер порта
Вы должны уметь извлекать соответствующую информацию из вывода:
lsof -i tcp
Запускаем как root.
Запустите этот скрипт на сервере:
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, но я не могу найти исходную ссылку.