Назад | Перейти на главную страницу

GNU параллельно несколько узлов входа в систему ssh за NAT

Возможно ли иметь несколько удаленных узлов за NAT с параллельным GNU?

Предположим, что часть параллельного кластера GNU существует за NAT (который может быть доступен или недоступен только через один IPv4-адрес через ISP, работающий только с IPv4) относительно главного узла. то есть более одного узла ПК, имеющего свой собственный IP-адрес подсети, существуют в какой-либо подсети, отличной от той, в которой находится главный узел.

Есть ли способ для GNU-parallel распределять работу через NAT на все эти узлы?

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

Единственное, что я могу придумать, - это вручную определить другой порт для каждого узла с помощью флага -p, описанного в руководство а затем вручную добавьте правило переадресации портов в NAT для каждого узла: порт

Есть ли какой-нибудь «трюк» в gnu-parallel, когда задания могут передаваться одному узлу за NAT, а затем передаваться оттуда другим узлам в его подсети?

Или, возможно, есть метод, с помощью которого подчиненные узлы могут передавать сообщение через https POST с заданием cron и каким-то образом генерировать и удерживать установленное соединение через общедоступный порт? Подобно тому, как можно получить открытые ключи, как описано в этот вопрос (эта идея определенно выходит за рамки моего понимания TCP / IPTABLES, поэтому я понимаю, что она может быть фундаментально ошибочной на первый взгляд)

Решение, которое может быть реализовано исключительно в пределах главного узла и подчиненных узлов, будет предпочтительнее решения, в котором требуются записи NAT.

Есть несколько решений.

Рабочие за 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.