
奇妙な問題が発生しています。
トンネリングエンドポイントとして機能する新しい Linode を立ち上げました。
ポート 1194 をリモート転送できたので、linode-server@1194 への接続がマシンのポート 1194 に正常に行われ、linode-server のポート 1194 に接続することで VPN に接続できるようになりました。
私が使用したコマンドは以下のとおりです(動作するコマンドです)。
ssh -N -R 1194:localhost:1194 [email protected]
今度は 443 もポート転送したいです。これを試しました:
ssh -N -R 443:192.168.1.122:443 [email protected]
私のローカル サーバーは意図的に 192.168.1.122 (localhost ではない) でリッスンしています。
しかし、上記のコマンドはサーバーのポート 443 を開くことができません。次のエラーが表示されます。
警告: リスン ポート 443 のリモート ポート転送に失敗しました
そこで、linode サーバーでポート 443 で何かが実行されているかどうかを確認しました。何も実行されていません。
user@linode-server:~$ sudo netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:1194 0.0.0.0:* LISTEN 7438/sshd: user
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 411/systemd-resolve
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2377/sshd: /usr/sbi
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 1513/master
tcp6 0 0 :::1194 :::* LISTEN 7438/sshd: user
tcp6 0 0 :::22 :::* LISTEN 2377/sshd: /usr/sbi
tcp6 0 0 :::25 :::* LISTEN 1513/master
udp 0 0 127.0.0.53:53 0.0.0.0:* 411/systemd-resolve
user@linode-server:~$
サーバーにソフトファイアウォールがありません。Linode クラウド ファイアウォールはオフになっていますが、それでも実行できません。
443 転送が機能しない理由が全く分かりません。
PS - トンネルの作成中、ユーザー認証は正常に機能しています。
これが役立つかどうかはわかりませんが、私の sshd_config は次のようになります。
user@linode-server:~$ cat /etc/ssh/sshd_config | grep -v "^#" | grep -v "^$"
Include /etc/ssh/sshd_config.d/*.conf
PermitRootLogin no
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
UsePAM yes
GatewayPorts yes
X11Forwarding yes
PrintMotd no
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
user@linode-server:~$
そして、明確に言うと、/etc/ssh/sshd_config.d/
linode-server 上の sshd からの詳細なログ出力:
...
Aug 14 09:00:32 connect sshd[9499]: Postponed publickey for pi from *HIDDEN: My home public IP* port 49180 ssh2 [preauth]
Aug 14 09:00:32 connect sshd[9499]: Accepted key RSA *HIDDEN* found at /home/pi/.ssh/authorized_keys:1
Aug 14 09:00:32 connect sshd[9499]: Accepted publickey for pi from *HIDDEN: My home public IP* port 49180 ssh2: RSA *HIDDEN*
Aug 14 09:00:32 connect sshd[9499]: pam_unix(sshd:session): session opened for user pi by (uid=0)
Aug 14 09:00:32 connect systemd-logind[578]: New session 157 of user pi.
Aug 14 09:00:32 connect sshd[9499]: User child is on pid 9579
Aug 14 09:00:32 connect sshd[9579]: bind [0.0.0.0]:443: Permission denied
Aug 14 09:00:32 connect sshd[9579]: error: bind [::]:443: Permission denied
Aug 14 09:00:32 connect sshd[9579]: error: channel_setup_fwd_listener_tcpip: cannot listen to port: 443
...
なぜアクセスが拒否されるのですか? 上記で使用したリモート転送コマンドは、同じユーザーを使用します (成功したトンネルと失敗したトンネルの両方)。
見つけたばかりここ443 は特権ポートだからかもしれません。今、私は 443 でリモート転送を有効にするために root ユーザーを使用したくありません。linode-server をロックダウンし、root としてログインできません (また、root ログインを許可したくありません)。上記のリンクのとおり、setcap
linode-server で を使用できますが、トンネル オープン コマンドは実際にはローカルから実行されるため、どうすればよいでしょうか。他にどのような方法がありますか? linode-server でより高いポートを使用すれば機能するかもしれませんが、それはしたくありません。ポートを覚えておく必要がないように、ポート 443 にしたいです。
答え1
ローカル サーバーでは、代わりにポート 8080 (非特権ポート) からリモート ポート転送を開始しました。
ssh -N -R 8080:192.168.1.122:443 [email protected]
linode-server に、というツールをインストールしsocat
、以下のコマンドを使用して linode サーバー上で 8080 から 443 にローカル転送したところ、動作するようになりました :)
sudo socat TCP-LISTEN:443,fork TCP:0.0.0.0:8080
答え2
問題は、ポート 443 で何もリッスンしていないことです。ポート 443 に接続するには、ポート 443 でリッスンしているプロセスが必要です。netstat を見ると、現在ポート 1194 でリッスンしているプロセスがあり、それがポート 1194 への接続が成功している理由であることがわかります。そのプロセスをポート 443 でリッスンするように変更する必要があります。
tcp 0 0 0.0.0.0:1194 0.0.0.0:* LISTEN 7438/sshd: pi