跟进:看起来与每个服务器运行几个月相吻合的一系列快速断开连接可能是巧合,只是用来揭示实际问题。它无法重新连接的原因几乎可以肯定是由于 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 …
我有一台运行 L2TP/IPSec VPN 服务器的 Mac OS X Server (10.9) 机器。配置似乎没问题,服务器和 VPN 的主机名都设置为 DynDNS 主机名。服务器配置在带有端口转发的 AirPort Extreme 路由器后面,连接到 Arris 调制解调器/路由器,路由器禁用(桥接)。服务器配置有静态内部 IP,路由器也通过 DHCP 绑定其 MAC 地址以确保内部地址一致。
如果我输入服务器的内部 IP 地址 (10.0.1.x) 并尝试从网络内部连接到 VPN 服务器,则一切正常。但是,如果我输入外部主机名(DynDNS 名称)并尝试再次从网络内部连接,则无法连接。在网络外部(例如通过 LTE)时,它同样无法连接。
其他服务(SSH、远程桌面等)在网络内外都可以正常连接。只有 VPN 受到影响。我可以确认可以从 SSH 和远程桌面(端口 22/5900)访问服务器。
我进一步确认,除了其他服务使用的其他端口外,路由器还转发端口 500(UDP)、1701(UDP) 和 4500(UDP)。
当我尝试连接时,客户端控制台上会出现以下内容:
12/16/13 11:13:33.213 PM configd[28]: SCNC: start, triggered by (15822) com.apple.prefe, type L2TP, status 0, trafficClass 0
12/16/13 11:13:33.229 PM pppd[15967]: publish_entry SCDSet() failed: Success!
12/16/13 11:13:33.230 PM pppd[15967]: publish_entry SCDSet() failed: Success!
12/16/13 11:13:33.230 PM pppd[15967]: …Run Code Online (Sandbox Code Playgroud) 我一直在查找有关在 Linux 上运行后台进程的信息。基本要求是:
此外,某些进程需要不是连续运行,而是需要定期运行。这当然是 cron 的工作,而且很可能我会用它来做这件事。但对于连续过程,情况就不同了。
在 Mac OS X 上,我为此使用了 launchd。Launchd 是在 Mac OS X 上启动进程的规范方法。操作系统将它用于所有系统服务,所以我对依赖它毫不犹豫。到目前为止,我还没有为 Linux 找到类似的系统。各种发行版似乎都有自己的方法(Ubuntu 的新贵等),但我仍然找不到关于 /etc/rc.local、/etc/init.d/rc.local、/etc/initd 如何的直接答案/rc.local 或 /etc/init 都相关以及它们之间的区别是什么。它们在每个系统上都不同。再加上“服务启动/停止 x”不适用于所有系统(谷歌在这里没有帮助)这一事实,你有我所说的一团糟。
我想要的是一个可以保存我的脚本的地方,我可以在其中重新启动系统并在启动时将它们作为守护程序启动(在任何用户登录之前),然后在它们终止时自动重新启动它们。而且我希望它坚如磐石,可靠并与多个发行版完全兼容,而不是像暴发户那样事后诸葛亮。
这甚至可能吗?