我遇到了一个奇怪的问题。
我启动了一个新的 Linode 作为隧道端点。
我能够成功地远程转发端口 1194,因此现在可以成功地将 linode-server@1194 连接到我的机器的端口 1194,并且我可以通过连接到我的 linode 服务器上的端口 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(不是本地主机)。
但是,上述命令无法在服务器上打开端口 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 是特权端口。现在我不想使用 root 用户在 443 上启用远程转发。我已锁定 linode 服务器,无法以 root 身份登录(并且我不想允许 root 登录)。根据上面的链接,我可以setcap
在 linode 服务器上使用,但我该怎么做,因为隧道打开命令实际上是从我的本地运行的。我有什么替代方案?我知道也许在 linode 服务器上使用更高的端口会起作用,但我不想这样做。我真的希望它是端口 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