GNU parallel を使用して NAT の背後に複数のリモート ノードを配置することは可能ですか?
マスター ノードを基準として、GNU 並列クラスターの一部が NAT (IPv4 のみを運用する ISP を通じて単一の IPv4 アドレスでのみアクセスできる場合とできない場合があります) の背後に存在するとします。つまり、マスター ノードをホストするサブネット以外のサブネット上に、独自のサブネット IP アドレスを持つ複数の PC ノードが存在するとします。
GNU-parallel が NAT を介してすべてのノードに作業を分散する方法はありますか?
この問題について調査し、検討した結果、多少関連する質問
私が考えられる唯一の方法は、-pフラグを使用して各ノードに異なるポートを手動で定義することです。マニュアルそして各ノードのNATにポート転送ルールを手動で追加します:ポート
gnu-parallel には、ジョブを NAT の背後の 1 つのノードに渡し、そこからそのサブネット内の他のノードに渡すことができる「トリック」がありますか?
あるいは、スレーブノードが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 によって 2 回引用符解除されるのに対し、GNU Parallel では 1 回のみ引用符解除されることが想定されているためです。
代わりに.ssh/config
再度使用してください:
Host host1 host2 host3
ProxyCommand ssh jump.host.domain nc -w 1 %h 22
nc
ジャンプホストに (netcat) をインストールする必要があります。