web-dev-qa-db-ja.com

setcapを使用して、ポート80でリモートホストをローカルホストに転送するにはどうすればよいですか?

私がNAT処理されている場合、開発のために接続を短時間受け入れたいので、これを試みています。

$ ssh [email protected] -R 80:localhost:80

低いポートをバインドしようとすると失敗します。

Warning: remote port forwarding failed for listen port 80

だから私はsetcap 'cap_net_bind_service=+ep' /my/application 1024未満のポートをリッスンできるようにするため、これをsudersのcrontabに入れます。

@reboot setcap 'cap_net_bind_service=+ep' /usr/sbin/sshd

しかし、それでもポート80にバインドできません。何が問題なのですか?代わりにnginxを使用して8080やiptablesなどにプロキシするつもりですが、なぜ私がやろうとしていたのがうまくいかないのか、まだ興味があります。

9
Kit Sunde

OpenSSHは、ログインしているユーザーのユーザーIDが0(ルート)でない限り、特権ポートへのバインドを完全に拒否します。関連するコード行は次のとおりです。

if (!options.allow_tcp_forwarding ||
    no_port_forwarding_flag ||
    (!want_reply && listen_port == 0) ||
    (listen_port != 0 && listen_port < IPPORT_RESERVED &&
    pw->pw_uid != 0)) {
        success = 0;
        packet_send_debug("Server has disabled port forwarding.");

ソース: http://www.openssh.com/cgi-bin/cvsweb/src/usr.bin/ssh/serverloop.c?annotate=1.162 行1092-1098

興味があれば、pwstruct passwd *タイプであり、Linuxでは/usr/include/pwd.hで定義されています

12
dwurf

同様の問題に遭遇したので、私が解決したのは、DNATルールをOUTPUTテーブルのnatチェーンに追加することです。

iptables -t nat -A OUTPUT -d 127.0.0.0/8 -p tcp --dport 80 \
-j DNAT --to-destination :8080

このルールは、ローカルで生成されたすべてのtcpパケットの宛先ポート80を8080に効果的に置き換えます。

着信接続の転送も許可する場合は、PREROUTINGnatチェーンにルールを1つ追加します。

iptables -t nat -A PREROUTING -d 10.0.0.200 -p tcp --dport 80 \
-j REDIRECT --to-port 8080

どこ 10.0.0.200は、着信接続をWebサービスに転送するインターフェースのIPアドレスです。

2
Serge

これはsocatの優れた使用例です。

まず、リモートマシンのポート8080(または他の許可されたポート)にリモート転送を行います。

ssh [email protected] -R 8080:localhost:80

次に、リモートマシンで、ポート80をポート8080にマッピングします。

Sudo socat TCP-LISTEN:80,fork TCP:localhost:8080

メモ:

Dirk Hoffmanが提案したように、これらの2つのコマンドは1行に結合できます。

ssh -t [email protected] -R 8080:localhost:80 Sudo socat TCP-LISTEN:80,fork TCP:localhost:8080

Sudoパスワードを入力するためにインタラクティブ端末が必要な場合は、-tが必要です。)

1
Ben Mares

クライアント側から、Sudoを介してsshを実行できます。

Sudo ssh -L 80:127.0.0.1:80 [email protected]

ローカルシステムのセキュリティへの影響については確かにわかりませんが、それは機能します。

1
John Wilger

上記の Ben Mares のソリューション提案について詳しく説明します。

以下は、1つのライナーです。

2つのリモートポート転送を開きます。
1。リモートポート8888からローカルポート80
2。リモートポート8443からローカルポート443

リモートマシンでsocatは何でも接続します
1。ポート8888にストリーミングされるポート80に到着
次にローカルホストポート80にトンネリング
2。ポート8443にストリーミングされるポート443に到着
ローカルのホストポート443にトンネリングされる

ssh -t -i ~/.ssh/id_rsa \
    -R 0.0.0.0:8888:0.0.0.0:80 \
    -R 0.0.0.0:8443:0.0.0.0:443 \
    remoteUser@remoteMachine \
    -- "(Sudo socat TCP-LISTEN:80,fork TCP:localhost:8888) & \
        Sudo socat TCP-LISTEN:443,fork TCP:localhost:8443"

そのため、コマンドを実行する場合は、リモートマシンのrootパスワードを(ポート80/443にリストできるように)、次に(トンネルが確立されている限り)ポート80または443に到着するものをすべて与える必要があります。リモートホストのローカルマシンポート80または443にそれぞれトンネルされます...

覚えて!!

すべてのネットワークインターフェイス(0.0.0.0)でバインドできるようにするには、リモートマシン/etc/ssh/sshd_configを編集してGatewayPorts clientspecifiedまたはGatewayPorts yesを設定する必要があります

リモートマシンでこれを確認するには、netstat -tlpn | grep -E '8888|8443'を使用します。

tcp        0      0 0.0.0.0:8888            0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:8443            0.0.0.0:*               LISTEN      -

ではなく

tcp        0      0 127.0.0.1:8888          0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:8443          0.0.0.0:*               LISTEN      -
0
Dirk Hoffmann

公開鍵を/root/.ssh/authorized_keysリストに追加することもできます。偏執狂の場合は、次のようなrootとしてのコマンドの実行を禁止する必要があります。

no-pty,no-agent-forwarding,no-X11-forwarding,command="/bin/noshell" ssh-rsa YOUR_PUBLIC_KEY 

Rootとしてログインするには、/ etc/ssh/sshd_configに「PermitRootLogin without-password」を追加する必要がある場合があります。

0
moschops