跟进:看起来与每个服务器运行几个月相吻合的一系列快速断开连接可能是巧合,只是用来揭示实际问题。它无法重新连接的原因几乎可以肯定是由于 AliveInterval 值(kasperd 的回答)。使用 ExitOnForwardFailure 选项应该允许在重新连接之前正确发生超时,这应该可以解决大多数情况下的问题。MadHatter 的建议(kill 脚本)可能是确保隧道可以重新连接的最佳方法,即使其他一切都失败了。
我在防火墙后面有一个服务器 (A),它在几个端口上启动一个反向隧道到一个小的 DigitalOcean VPS (B),所以我可以通过 B 的 IP 地址连接到 A。这条隧道已经持续工作了大约 3 个月,但在过去的 24 小时内突然发生了四次故障。不久前,另一家 VPS 提供商也发生了同样的事情——几个月的完美运营,然后突然出现多次快速故障。
我在机器 A 上有一个脚本,它自动执行隧道命令(ssh -R *:X:localhost:X address_of_B对于每个端口 X),但是当它执行时,它说Warning: remote port forwarding failed for listen port X.
进入/var/log/secure服务器上的 sshd显示以下错误:
bind: Address already in use
error: bind: Address already in use
error: channel_setup_fwd_listener: cannot listen to port: X
Run Code Online (Sandbox Code Playgroud)
解决需要重启VPS。在那之前,所有重新连接的尝试都会给出“远程端口转发失败”的消息,并且不会起作用。现在到了隧道只持续大约 4 小时才停止的地步。
VPS 上没有任何变化,它是一台一次性使用的单用户机器,仅用作反向隧道端点。它在 CentOS 6.5 上运行 OpenSSH_5.3p1。当连接丢失时,sshd 似乎没有关闭其末端的端口。我无法解释为什么,或者为什么在几个月近乎完美的操作之后会突然发生。
为了澄清,我首先需要弄清楚为什么 sshd 在隧道失败后拒绝侦听端口,这似乎是由 sshd …
更新:我现在开始工作了。Jim Zajkowski 的回答帮助我检测到我的/etc/init.d/couchdb重启调用实际上并未重启实例。在我手动终止 CouchDB 进程并启动一个新实例后,它获取了所需的 BindAddress 更改。
我已经通过以下方式安装了 CouchDB
aptitude 安装沙发数据库
从我的服务器,我可以通过连接
远程登录本地主机 5984
并执行 RESTful 命令。当我尝试从我们网络上的另一台机器或我们网络外部的一台机器访问服务器时,我收到一个The connection was reset错误。我已经在路由器上设置了端口转发,否则可以通过 Apache、Tomcat、SSH 等访问服务器。
我是 Linux/Ubuntu 的新手,所以我不确定是否有阻止连接的默认防火墙,所以我运行:
iptables -A 输入 -p tcp --dport 5984 -j 接受
但它没有帮助。
这是运行iptables -L -n -v的转储
Chain INPUT (policy ACCEPT 2121K packets, 1319M bytes)
pkts bytes target prot opt in out source destination
70 3864 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:5984
9 1647 ACCEPT tcp -- * …Run Code Online (Sandbox Code Playgroud) 我需要将所有对端口 80 的请求转发到 8020。我用谷歌搜索了一下,得到:
iptables -t nat -I PREROUTING --source 0/0 --destination 0/0 -p tcp --dport 80 -j REDIRECT --to-ports 8020
现在如果我必须撤消它,我该怎么做(除了重新启动系统)?
目前我有一个设置,由于配置需要永远修复,我有一个只能通过 ipv4 访问的服务器。但是,我也有一台可以通过 ipv6 访问的服务器。我想知道是否可以使用 iptables 将某个端口上的 ipv6 流量从一台服务器转发到另一台使用 ipv4 流量的服务器。
我目前可以这样做:
ssh 12.34.56.78 -L 8888:localhost:8000
然后我可以打开本地浏览器到 localhost:8888 并查看该应用程序在我的服务器中运行,地址为 12.34.56.78:8000。
我想避免输入该转发命令,而是将该配置放在我的 ssh 配置文件中。
目前我有这个:
Host myhost
User myuser
Hostname 12.34.56.78
IdentityFile ~/.ssh/id_rsa
LocalForward 8888 12.34.56.78:8000
Run Code Online (Sandbox Code Playgroud)
我认为它会工作相同,但是当我myhost像平常一样 ssh 进入,然后尝试打开浏览器到 localhost:8888 时,我无法再看到该应用程序正在运行,并且我在 myhost 控制台中收到以下消息:
channel 4: open failed: connect failed: Connection refused
channel 3: open failed: connect failed: Connection refused
channel 3: open failed: connect failed: Connection refused
channel 4: open failed: connect failed: Connection refused
channel 3: open failed: connect failed: Connection refused
Run Code Online (Sandbox Code Playgroud)
我想我可以添加一个别名来运行 ssh 命令并完成它,但我希望在我的配置文件中正确设置这个,并且,如果能够看到我的应用程序在浏览器中运行而无需 ssh进入我的主机可以实现可能是一个巨大的优势。
任何人都可以帮忙解决这个问题吗?
使用 Putty,我设置了一个反向代理,它允许我在服务器的端口 8080 上连接server.tld到启动 SSH 连接的机器的端口 80。
服务器允许我连接localhost:8080并返回initiator:80我在服务器上连接时的结果。
这个问题说要启用 GatewayPorts 并绑定到所有地址。
使用 Putty,如何在服务器上公开端口 8080,以便当外部接口(例如 Web 请求)上的请求通过时,端口被转发到initiator:80?

有没有办法使用 vagrant 1.2.1 或更高版本转发一系列端口?我知道您可以使用以下方法单独转发任意数量的端口
config.vm.forward_port 80, 4567
Run Code Online (Sandbox Code Playgroud)
或者,答案是干脆不使用 vagrant 来做这样的事情?
我有一个在 Amazon EC2 上运行的 Web 应用程序。它侦听端口 9898。
我可以通过输入IP地址和端口号来访问它。
例如 1.2.3.4:9898
但是,我真正希望能够做的是不必输入端口号。
对此进行研究,看起来端口转发可能是解决方案 - 即将在默认端口 (80) 上收到的 http 请求转发到我的非标准端口 (9898)。
这是正确的方法吗?如果是这样,我如何在 EC2 上进行设置?
如果没有,那么我如何实现我想要的?
在此先感谢您的帮助。
更新
我应该提到 EC2 实例是 Windows Server 2012 AMI。
http web-server port-forwarding amazon-ec2 windows-server-2012
我的~/.ssh/config文件条目中有本地转发定义,例如
HOST myServer
hostname 10.10.0.1
user xyz
LocalForward 8080 localhost:80
LocalForward 4000 127.0.0.1:4000
...
Run Code Online (Sandbox Code Playgroud)
这就像一个魅力,但我也有脚本来同步一些数据。
这些脚本在已经存在连接的情况下尝试连接到服务器时会显示许多警告。
bind: Address already in use
channel_setup_fwd_listener_tcpip: cannot listen to port: 8080
bind: Address already in use
channel_setup_fwd_listener_tcpip: cannot listen to port: 4000
....
Run Code Online (Sandbox Code Playgroud)
是否有一种巧妙的使用方法ssh或rsync选项可以禁用会话的所有本地转发?
显然我可以复制&粘贴每个配置块,并构建一个有本地转发的和一个没有本地转发的,但我希望有一个更好的解决方案。
我正在运行 Ubuntu Desktop 作为我的主要机器,我将其称为 D。我想通过 ssh 连接到服务器 S,但防火墙阻止了我。
我可以通过非常繁琐的路径访问服务器 S,涉及 Windows 虚拟机和PuTTY。这使得使用此服务器非常烦人:完全不同的环境,复制/粘贴不起作用,连接到桌面时我无法正确使用桌面(Alt-Tab 被虚拟机破坏)等
我已经验证我可以从服务器 S ssh 到我的台式机 D(与我需要的相反)。
我能否以某种方式从服务器启动“端口转发”或类似功能,以便我可以从我的桌面 ssh 到服务器?
port-forwarding ×10
ssh ×4
iptables ×2
ssh-tunnel ×2
amazon-ec2 ×1
couchdb ×1
firewall ×1
http ×1
linux ×1
localhost ×1
putty ×1
ubuntu ×1
vagrant ×1
web-server ×1