我经常临时快速地(临时)想要使用 ssh 隧道将 http 流量(以及其他协议)从一台服务器隧道传输到另一台服务器。我为此使用(在源服务器上):
ssh -f -n -L *:80:target-server.com:80 target-server.com sleep 11555200
问题是,过了一会儿,我会看到数百个连接
lsof -n -i:80
ssh 17076 root 5u IPv6 425353159 TCP <source-serverIP>:http->173.245.48.218:52116 (ESTABLISHED)
ssh 17076 root 8u IPv6 425352908 TCP <source-serverIP>:http->82.177.80.10:49936 (FIN_WAIT2)
ssh 17076 root 9u IPv6 425353148 TCP <source-serverIP>:http->173.245.48.218:31791 (ESTABLISHED)
ssh 17076 root 10u IPv6 425353029 TCP <source-serverIP>:http->80.125.175.214:49837 (FIN_WAIT2)
ssh 17076 root 11u IPv6 425353100 TCP <source-serverIP>:http->90.10.149.220:47749 (FIN_WAIT2)
ssh 17076 root 12u IPv6 425353160 TCP <source-serverIP>:http->79.22.138.109:60744 (ESTABLISHED)
ssh 17076 root 13u IPv6 425353105 TCP <source-serverIP>:http->90.10.149.220:53312 (FIN_WAIT2)
这些连接似乎永远不会超时。当这些连接的数量达到约 1024 时,隧道根本不接受新连接。如果这些连接像没有隧道一样超时,我该怎么办?
# lsof -n -i:80|grep 'FIN_WAIT2'|wc -l
1016
更改/proc/sys/net/ipv4/tcp_fin_timeout
为较小的值并不能解决任何问题。
此外,这个问题似乎只发生在隧道 http 流量中(可能还有 https)。使用隧道 pop3/imap 时,我没有看到这样的问题。
另外,我想知道如何将开放隧道连接的最大限制更改为 > 1024。我绑定了
ulimit -n 99999 ssh -f -n -L *:80:target-server.com:80 target-server.com 'ulimit -n 99999 && sleep 11555200'
但它不能解决问题。即使设置tcp_max_orphans
为高值也不会影响这一点。
答案1
有三组命令可以启用连接保持。
TCPKeepAlive
ServerAliveInterval
结合ServerAliveCountMax
ClientAliveInterval
结合ClientAliveCountMax
TCPKeepAlive
通过在标准 ssh 加密之外发送 keepalive 来保持连接处于活动状态,这意味着任何网络设备都可以看到它只是一个 keepalive。这是可欺骗的。不建议使用此方法。
ServerAliveInterval
由客户端发起。 ServerAliveCountMax
将设置要发送的保持连接的最大数量,超过该数量后将断开连接。
ClientAliveInterval
与之相同,ServerAliveInterval
只不过它是由服务器发起的。
确保所有三个选项均未被调用。检查$HOME/.ssh/config
和/etc/ssh/ssh_config
。
答案2
你第一次就做对了,除了睡眠延迟..以秒为单位!尝试一个较小的值,对我来说这是有效的(将在 5 分钟后关闭):
ssh -f -n -L *:80:target-server.com:80 target-server.com 睡眠 300