Нет ничего сложного в том, чтобы зайти по ssh на машину за файрволл-ом с NAT, если у вас есть логин на сам firewall. Особенно, если на этом firewall-е установлен netcat.
У openssh есть полезная опция ProxyCommand, которая может быть использована для этой цели. Например можно написать в свой .ssh/config
Host *.intranet.mycompany.com ProxyCommand ssh firewall.mycompany.com nc -q 0 %h 22
После этого при попытке пойти по ssh на любой хост в домене intranet.mycompany.com будет производиться запуск netcat на машине firewall.mycompany.com, который и будет доставлять информацию от вашего ssh на 22 порт требуемой машины (обратите внимание на опцию -q 0).
Проблемы возникают если ваша машина — ноутбук, и находится то в корпоративном интранете, то только снаружи.
Нижеприведенный шелловский скрипт эту проблему решает. К нему имеется файл конфигурации, в котором описывается список nat-сетей, в которые хочется ходить по ssh.
Предусмотрены две директивы:
#!/bin/sh host=$1 shift declare -a OPTIONS myhost=`hostname -f` add_domain() { domain=$1 shift for i do if [ "$i" = "$host" ]; then host=$host.$domain return fi done } proxy() { [ -n "$OPTIONS" ] && return case "$host" in $2) case "$myhost" in $2) OPTIONS="" ;; *) OPTIONS="-o \"ProxyCommand /usr/bin/ssh $1 nc -q 0 %h 22\"" ;; esac ;; *) OPTIONS="" ;; esac } source ${HOME}/.rsrc [ -n "$1" ] || set exec '$SHELL' --login eval exec "/usr/bin/ssh -t ${OPTIONS} "$host" LANG=\$LANG \"\$@\"" |
add_domain home.ru dragon vasilisk hydra add_domain kontora.ru elk ibex bear wolf proxy gw.home.ru *.home.ru proxy firewall.kontora.ru *.kontora.ru |