web-dev-qa-db-ja.com

Firejailがsocks5SSHトンネルで機能しない

2つの仮想インターフェイスペア(veth0aとveth0b)を作成し、1つのインターフェイス(veth0b)の終わりを新しいネットワーク名前空間(netns0)に割り当てたUbuntu18.04サーバーがあります。

ip netns add netns0
ip netns exec netns0 ip link set lo up
ip link add veth0a type veth peer name veth0b
ip link set veth0b netns netns0

次に、firejailを使用して、特定のユーザー(test-user)に、このユーザーのデフォルトシェルとして/usr/bin/firejailを設定し、/etc/firejail/login.usersファイルに以下を追加して、デフォルトでこの新しい名前空間を使用するように強制しました。

test-user: --netns=netns0

これが機能することを確認するために、次のテストを実行しました。

  1. Rootアカウントからtshark -i veth0a -f "port 443"を実行します
  2. テストユーザーとしてサーバーにSSHで接続する
  3. SSHユーザーとしてcurl https://1.1.1.1を実行します

Tsharkの出力には、1.1.1.1トラフィックの適切なveth0b送信元IPアドレスが表示されます。

私が遭遇している問題は、test-userアカウントを使用してSSHを介したsocks5動的ポート転送を確立しようとしたときです。

ssh -D 10000 -q -C -N test-user@server_ip

ラップトップまたはワークステーションからこのコマンドを実行すると、ポート1000でローカルsocks5サーバーを確立し、SSH接続を介してトンネリングできます。これをローカルsocks5プロキシとして設定し、https://api.ipify.orgに移動すると、プロキシが機能しており、ラップトップがサーバーのIPアドレスを使用していることがわかります。

問題は、sock5トラフィックが適切な名前空間を通過していないように見えることです。言い換えると、テストユーザーのssh接続を介してsocks5サーバーに接続しているときに、ラップトップでWebを閲覧しているときに、トラフィックがtshark -iveth0aに表示されません。

ポートフォワーディングトンネルもファイアジェイルを使用するようにするために必要な追加の手順はありますか?/etc/passwdでシェルを設定すると、インタラクティブなログインシェルにのみ影響しますか?ユーザーの非対話型シェルも/usr/bin/firejailに変更する必要がありますか?もしそうなら、私はそれをどのように行うでしょうか?

どんな助けでも大歓迎です。

1
RogueKnight

あなたが試みていることはうまくいきません、そして私はその理由を説明しています。

Ssh接続は、ネットワーク名前空間ではなく、ホストで実行されているリモートサーバーのsshdデーモンに接続します。接続用のインスタンスが作成されます。次に、認証され、トンネルがセットアップされ、次にユーザーセッションがセットアップされます。

ssh -v -4 -D 10000 remoteuser@serverを使用してsshクライアントバージョン7.9p1で実行された例からの抜粋を次に示します。

debug1: Offering public key: /home/localuser/.ssh/id_ed25519 ED25519 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
debug1: Server accepts key: /home/localuser/.ssh/id_ed25519 ED25519 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
debug1: Authentication succeeded (publickey).
Authenticated to server ([192.0.2.2]:22).
debug1: Local connections to LOCALHOST:10000 forwarded to remote address socks:0
debug1: Local forwarding listening on 127.0.0.1 port 10000.
debug1: channel 0: new [port listener]
debug1: channel 1: new [client-session]
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug1: pledge: network
debug1: client_input_global_request: rtype [email protected] want_reply 0
debug1: Sending environment.
debug1: Sending env LANG = C.UTF-8

ご覧のとおり、Local connections to LOCALHOST:10000 forwarded to remote address socks:0 ... channel 0: new [port listener]が最初に発生します。 次にEntering interactive sessionが発生します。これは通常firejailなどを呼び出しますが、手遅れになります。以前に行われたことはすべて、ホストネットワークの名前空間で行われます。しかし実際には、-Nを使用しているので:

-Nリモートコマンドを実行しないでください。これは、ポートを転送するだけの場合に便利です。

シェルは実行されず、firejailは実行されず、代替ネットワーク名前空間は変更されません。上で説明したように、これは-Nがなくても問題にはなりません。

したがって、本当にそれを実行したい場合は、別のSOCKS5プロキシが必要になり、-Dオプションを使用できなくなります。sshdまたはその他のSOCKS5対応ツール(例: dante-server )のインスタンスを内部で実行できます。iptablenftables、またはの従来の-Lオプションを使用して、ネットワークネームスペースとポートリダイレクトを実行しますsshveth0bのIPとこのSOCKS5プロキシのリスニングポートにリダイレクトしますが、これにはおそらくfirejailと通常のユーザーだけです。この時点で、セットアップ全体をsystemdから実行するか、本格的な [を使用して実行することをお勧めします。 〜#〜] lxc [〜#〜] (または[〜#〜] lxd [〜#〜]またはDockerなど)コンテナ。 ip netns機能で十分な場合もあります( ip netns(iproute2) を使用した名前空間管理を参照)。

1
A.B