私が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などにプロキシするつもりですが、なぜ私がやろうとしていたのがうまくいかないのか、まだ興味があります。
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
興味があれば、pw
はstruct passwd *
タイプであり、Linuxでは/usr/include/pwd.h
で定義されています
同様の問題に遭遇したので、私が解決したのは、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に効果的に置き換えます。
着信接続の転送も許可する場合は、PREROUTING
nat
チェーンにルールを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アドレスです。
これは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
が必要です。)
クライアント側から、Sudoを介してsshを実行できます。
Sudo ssh -L 80:127.0.0.1:80 [email protected]
ローカルシステムのセキュリティへの影響については確かにわかりませんが、それは機能します。
上記の 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 -
公開鍵を/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」を追加する必要がある場合があります。