GNU параллельные многопильные узлы sshlogin за NAT
Можно ли иметь несколько удаленных узлов за NAT с параллельной GNU?
Предположим, что некоторый параллельный кластер GNU существует за NAT (который может или не может быть доступен только через один IPv4-адрес через интернет-провайдера, работающего только на IPv4) относительно главного узла. т.е. более одного узла ПК, имеющего собственный IP-адрес подсети, существует в некоторой подсети, отличной от той, в которой размещен главный узел.
Есть ли способ для GNU-параллельного распределять работу через NAT на все эти узлы?
После некоторых исследований и размышлений о проблеме, включая взгляд на этот несколько связанный вопрос
Единственное, о чем я могу подумать, это вручную определить отдельный порт для каждого узла с помощью флага -p, описанного в руководстве, а затем вручную добавить правило переадресации порта в NAT для каждого узла: порт
Есть ли какая-то "хитрость" в gnu -rallel, когда задания можно было передать одному узлу за NAT, а затем передать оттуда другим узлам в своей подсети?
Или, возможно, существует метод, с помощью которого подчиненные узлы могут передавать сообщение через https POST с заданием cron и каким-то образом генерировать и удерживать установленное соединение через публичный порт? Подобно тому, как можно получить открытые ключи, как описано в этом вопросе (эта идея определенно выходит за рамки моего понимания TCP/IPTABLES, поэтому я понимаю, что он может быть в корне ошибочным)
Решение, которое может быть реализовано исключительно внутри главного узла и подчиненных узлов, будет предпочтительнее решения, в котором требуются записи NAT.
1 ответ
Есть несколько решений.
Рабочие стоят за NAT. Нет доступа к хосту. Нет доступа к брандмауэру.
Для этого вам нужен своего рода VPN, который может проходить через брандмауэр. Здесь можно использовать скрытый сервис TOR для порта 22 на рабочих. Если все рабочие с поддержкой TOR:
parallel --ssh 'torsocks ssh' -S zij4uclus7xhwlhz.onion,isj4uclus7xhwlhz.onion,lzw4uclus7xhwlhz.onion echo ::: 1
Если только некоторые из них:
parallel -S 'torsocks ssh zij4uclus7xhwlhz.onion,torsocks ssh isj4uclus7xhwlhz.onion,torsocks ssh lzw4uclus7xhwlhz.onion' echo ::: 1
Рабочие стоят за NAT. Нет доступа к хосту. Доступ к брандмауэру.
Если вы можете переадресовывать порты, так что порт 2001 - это порт 22 на хосте 1, порт 2002 - это порт 22 на хосте 2, 2003 - это хост 3... тогда вы можете использовать -p:
parallel -S 'ssh -p 2001 firewall,ssh -p 2002 firewall,ssh -p 2003 firewall' echo ::: 1
Вы можете положить это в .ssh/config:
Host host1.v
Port 2001
Host host2.v
Port 2002
Host host3.v
Port 2003
Host *.v
Hostname firewall
А затем просто используйте host[1-3].v как обычные хосты:
parallel -S host1.v,host2.v,host3.v echo ::: 1
Рабочие стоят за NAT. Доступ к прыжковому хосту.
Если у вас есть доступ к хосту, с которого вы можете связаться с рабочими, очевидным будет:
parallel --ssh 'ssh jumphost ssh' -S host1 echo ::: DOES NOT WORK
Но это не работает, потому что команда дважды удаляется из ssh, тогда как GNU Parallel ожидает, что она будет удалена только один раз.
Поэтому вместо использования .ssh/config снова:
Host host1 host2 host3
ProxyCommand ssh jump.host.domain nc -w 1 %h 22
Это требует nc (netcat) для установки на Jumphost.