Возможно ли иметь несколько удаленных узлов за 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.