サーバーが2つあり、サーバーAとサーバーBがあるとします。サーバーBをSSHトンネルとして使用したいので、サーバーAでこれを行いました。
ssh -D 1080 root@ip
接続し、サーバーBをSOCKS5プロキシとしてサーバーAに配置するとすぐに、サーバーBが次のエラーを引き起こします。
channel 3: open failed: administratively prohibited
VultrのようなホストからサーバーBを取得した場合、このエラーは発生しませんが、digitaloceanから取得した場合は、このエラーが発生します。私はいくつかの調査を行い、tcpforwardingをyesにする必要があることを確認しましたが、/ 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
編集する必要がある設定ファイルはsshd_config
と呼ばれ、あなたが書いたssh_config
です。リストしたものは、sshサーバーの構成ではなく、sshクライアントのデフォルト構成の内容のように見えます(/etc/ssh/sshd_config)
あなたがリストするものは、コメントアウトされた単なるデフォルト値です。
したがって、Host *
の下に次のように追加できます。
AllowTcpForwarding local
Yesがデフォルトであるべきであるので、それが動作しないのは奇妙であることに注意してください。 ssh -v
または-vv
または-vvv
を使用して詳細度を追加し、サーバーのsshdログファイルを調べて、何が問題なのかについてより多くの情報を提供する必要があります。
これを可能にするには、サーバーのAllowTcpForwarding yes
にsshd_config
を設定する必要があります。
最初に、/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
の動作になります。
たとえば、Socks 5プロキシwww.somenotexistingdomain.com
を介して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
)、接続の両側を監視します。