我有两台服务器,假设是服务器 A 和服务器 B。我希望使用服务器 B 作为 ssh 隧道,因此在服务器 AI 上执行了此操作
ssh -D 1080 root@ip
它连接了,当我在服务器 A 上将服务器 B 作为 SOCKS5 代理放入时,服务器 B 就会出现此错误:
channel 3: open failed: administratively prohibited
不知何故,如果我从 vultr 这样的主机获取服务器 B,我不会收到此错误,但如果我从 digitalocean 获取,我会收到此错误。我做了一些研究,发现我应该将 allowtcpforwarding 设置为是,但我在 /etc/ssh/ssh_config 中找不到它
这是我的 ssh_config 文件:
# Host *
# ForwardAgent no
# ForwardX11 no
# RhostsRSAAuthentication no
# RSAAuthentication yes
# PasswordAuthentication yes
# HostbasedAuthentication no
# GSSAPIAuthentication no
# GSSAPIDelegateCredentials no
# GSSAPIKeyExchange no
# GSSAPITrustDNS no
# BatchMode no
# CheckHostIP yes
# AddressFamily any
# ConnectTimeout 0
# StrictHostKeyChecking ask
# IdentityFile ~/.ssh/identity
# IdentityFile ~/.ssh/id_rsa
# IdentityFile ~/.ssh/id_dsa
# IdentityFile ~/.ssh/id_ecdsa
# IdentityFile ~/.ssh/id_ed25519
# Port 22
# Protocol 2
# Cipher 3des
# Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc
# MACs hmac-md5,hmac-sha1,[email protected],hmac-ripemd160
# EscapeChar ~
# Tunnel no
# TunnelDevice any:any
# PermitLocalCommand no
# VisualHostKey no
# ProxyCommand ssh -q -W %h:%p gateway.example.com
# RekeyLimit 1G 1h
如果有人能告诉我我做错了什么,我将不胜感激:3
答案1
您需要编辑的配置文件名为sshd_config
您编写的ssh_config
。您列出的内容看起来像是 ssh 客户端默认配置的内容,而不是 ssh 服务器的配置(/etc/ssh/sshd_config)
答案2
您列出的只是注释掉的默认值。
因此您可以添加如下Host *
内容:
AllowTcpForwarding 本地
请注意,yes 应该是默认值,所以它不起作用很奇怪。您可以使用ssh -v
或-vv
或添加更多详细信息-vvv
,并查看服务器 sshd 日志文件,该文件应该提供有关错误的更多信息。
答案3
您可能需要AllowTcpForwarding yes
在sshd_config
服务器上进行设置以允许这种情况发生。
答案4
首先,检查是否存在/var/log/secure
类似这样的条目;
Feb 1 19:59:58 vps001 sshd[30375]: error: connect_to
www.somenonexistingdomain.com: unknown host (Name or service not known)
第二,检查selinux是否阻塞;(如果你是基于RedHat的)
$ sudo ausearch -m avc -c httpd
----
time->Sat Jan 6 08:58:11 2018
type=AVC msg=audit(1515229091.030:7212): avc: denied { map } for pid=20581 comm="httpd" path="/var/
您可以像这样测试并禁用 selinux;
[~] $ sudo getenforce
Enforcing
[~] $ sudo setenforce Permissive
[~] $ sudo getenforce
Permissive
然后测试一下它是否能正常工作。
[~] $ sudo setenforce Enforcing
open failed: administratively prohibited
如果服务器无法连接到您在另一端请求的站点,我就会出现这种情况。
www.somenotexistingdomain.com
例如,如果我通过 socks 5 代理发送请求ssh -S none -D1083 -vvv my.cheap.vps.com
,则会导致以下输出;
debug1: Connection to port 1083 forwarding to socks port 0 requested.
debug2: fd 10 setting TCP_NODELAY
debug2: fd 10 setting O_NONBLOCK
debug3: fd 10 is O_NONBLOCK
debug1: channel 4: new [dynamic-tcpip]
....
debug2: channel 4: dynamic request: socks5 host www.somenonexistingdomain.com port 80 command 1
debug3: send packet: type 90
debug3: receive packet: type 92
channel 4: open failed: administratively prohibited: open failed
debug2: channel 4: zombie
debug2: channel 4: garbage collecting
debug1: channel 4: free: direct-tcpip: listening port 1083 for www.somenonexistingdomain.com port 80, connect from 127.0.0.1 port 42598 to 127.0.0.1 port 1083, nchannels 22
并且您会发现它无法连接。
如果您确定您尝试访问的服务器存在;例如,首先测试您是否可以从命令行远程wget
访问该站点。curl
$ wget -S -O - www.bbc.co.uk > /dev/null
Resolving www.bbc.co.uk (www.bbc.co.uk)... 212.58.244.69, 212.58.246.93
Connecting to www.bbc.co.uk (www.bbc.co.uk)|212.58.244.69|:80... connected.
HTTP request sent, awaiting response...
HTTP/1.1 301 Moved Permanently
Server: nginx
如果这不起作用,那么如果您转发到代理 DNS,则远程服务器可能无法解析 DNS。因此请检查;
$ dig www.bbc.co.uk +short
www.bbc.net.uk.
212.58.246.91
212.58.244.67
并且还使用 netcat、telnet 等检查与端口的直接连接。但是,使用 wget 拉取站点应该已经测试了 tcp 连接和 DNS。
$ telnet www.bbc.co.uk 80
Trying 212.58.244.26...
Connected to www.bbc.co.uk.
Escape character is '^]'.
并检查 /var/log/secure 文件中的条目。
否则,请立即启动日志记录程序 ( ssh -vvvvvvv
),并观察连接的两侧。