GNU параллельные множественные узлы sshlogin за NAT

GNU параллельные множественные узлы sshlogin за NAT

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

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

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

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

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

Есть ли какой-то «трюк» в gnu-parallel, с помощью которого задания можно было бы передавать на один узел за 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.

Связанный контент