是否可以在具有 GNU 並行功能的 NAT 後面擁有多個遠端節點?
假設某些 GNU 平行叢集存在於相對於主節點的 NAT 後面(可能只能透過單一 IPv4 位址透過僅執行 IPv4 的 ISP 訪問,也可能無法存取)。即,多個 PC 節點擁有自己的子網路 IP 位址,存在於某個子網路上,而非託管主節點的子網路。
GNU 並行是否有辦法透過 NAT 將工作分配給所有這些節點?
經過對這個問題的一些研究和思考,包括看看這個有點相關的問題
我能想到的唯一方法是使用 -p 標誌為每個節點手動定義不同的端口手動的然後在NAT中為每個節點手動新增連接埠轉送規則:port
gnu-parallel 中是否有一些“技巧”,可以將作業傳遞到 NAT 後面的一個節點,然後從那裡分發到其子網路中的其他節點?
或者也許有一種方法,從屬節點可以透過帶有 cron 作業的 https POST 傳遞訊息,並以某種方式透過公共連接埠產生並保持已建立的連接?類似於如何取得公鑰,如這個問題(這個想法絕對超出了我對 TCP/IPTABLES 的理解,所以我確實意識到它從表面上看可能存在根本性缺陷)
一種可以僅在主節點和從節點內實現的解決方案比需要 NAT 條目的解決方案更可取。
答案1
有幾種解決方案。
工作人員位於 NAT 後方。無法存取跳轉主機。無法存取防火牆。
為此,您需要某種可以穿越防火牆的 VPN。此處可以使用工作執行緒上連接埠 22 的 TOR 隱藏服務。如果所有工作人員都啟用了 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 是主機 1 上的連接埠 22,連接埠 2002 是主機 2 上的連接埠 22,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
在 Jumphost 上安裝 (netcat)。