如何连接到定期更改IP的Linux机器?


12

我的问题是找到一种方法来SSH进入其IP地址每天更改的Linux服务器(Ubuntu 18.04)。

我有一个客户,我偶尔会帮助他完成管理任务。当他们需要帮助时,我需要进入机器,但它们没有静态IP,因此服务器的公共IP不断变化。我创建了一个小脚本来报告Linux机器的IP地址,发现它每天中午左右都会更改一次。

我能够设置SSH,它可以在本地和远程运行……直到IP地址更改为止。一旦发生这种情况,即使使用新的IP地址,我也无法再进行远程连接。

  • 每次IP地址更改时是否需要重新启动SSH服务?
  • 如果是这样,为什么?
  • IP地址更改时,我是否还需要采取其他措施以允许SSH访问?

更新

需要明确的是,我的问题是找不到新的IP地址。我已经有一个脚本可以做到这一点。问题是,即使我尝试使用新的IP地址进行连接,但IP更改后服务器也会停止响应。

如果我在目标计算机上重新启动SSH服务,则我将再次具有远程访问权限。但是我不明白为什么我必须这样做。我想知道根本原因,希望找到更好的解决方案。

大多数人似乎认为,只要我们知道新IP,SSH就应该起作用,因此18.04独有吗?我最近为客户端安装了该服务器,因此所有配置设置仍为默认设置。(他们不知道如何更改它。)


8
使用动态dns
Ipor Sircer

12
大喊他们的ISP。每天更改一次IP地址对于业务连接是荒谬的,对于住宅连接而言,这甚至是闻所未闻的。
迈克尔·汉普顿

2
您说IP地址更改时ssh访问停止工作。但是您还没有说它何时再次开始工作。我认为它必须以某种方式重新开始工作,否则您不会看到它每天都停止工作。IP地址更改时,您无需执行任何操作。ssh服务器将立即可在新IP地址上访问。
kasperd

1
可能会发生一些奇怪的事情,例如DDNS正在运行,以及诸如ListenAddress <dynamic host name>sshd配置文件中的内容,可能是因为有人不希望内部用户能够ssh进入服务器。实际上,每次IP更改时,这实际上都需要重新启动ssh服务器。
Guntram Blohm

1
@MichaelHampton:大喊大叫可能无济于事,付钱了。在目前IPv4地址稀缺的情况下,大多数提供商都会为静态IPv4地址收取额外的费用(有些提供商甚至为非静态公共IP地址收取额外的费用,否则您会获得Dual Stack Lite)。当然,如果OP在IPv6上,情况会发生变化……
sleske

Answers:


21

其他答案似乎忽略了您的问题中的一件事:

一旦发生这种情况,即使使用新的IP地址,我也将无法再进行远程连接

DDNS将帮助您找到新的IP地址,但这似乎不是问题所在。

不幸的是,服务器获得一个新的IP 应该不会在标准设置,其中的ISP提供的路由器,服务器,路由器后面的内部地址有问题,和路由器做端口转发。您可能需要提供有关网络拓扑的更多信息,以获得一个好的答案。

我能想象是不是与服务器的路由器后面,做自己的PPPoE连接,并且一)SSH服务器在服务器重启,B)的机器上安装了防火墙的角度,允许进入的ssh来绑定到特定的接口地址只是服务器的IP,而防火墙在IP更改时不会更新。

要检查第一种情况,请执行netstat -nta | grep -w 22 | grep LISTEN。如果它显示为0.0.0.0:22,那没关系;如果它列出了特定的IP,请检查sshd配置文件(/etc/sshd.conf)中的ListenAddress

要检查第二种情况,请执行iptables -L -n并检查INCOMING链中的规则之一是否与服务器的IP和端口22相匹配。

如果其中之一具有当前服务器地址,则需要将其更改为0.0.0.0(确保您了解安全隐患),或者在IP更改时更新规则/配置。

编辑

由于服务器位于路由器后面,因此上述想法可能不适用(*)。在此设置中,路由器具有外部IP(每天更改),而内部设备应具有不应更改的10.xyz或192.168.xy地址。您连接到外部地址,并且路由器应将端口转发规则连接到内部地址。

当外部IP更改时,该端口转发不应中断(但是,现有的ssh连接将被丢弃),但这也许不是您设置的规则,而是由一些UPNP魔术师来完成的,路由器在获得该IP时会丢弃UPNP转发一个新地址,并且仅在重新启动时调用sshd。您是否在路由器内部设置了端口转发器。

或者,是服务器的内部 IP发生了变化-在这种情况下,DHCP严重破坏了某些内容。给您的服务器一个固定的内部地址。

或者,您在使用IPV6吗?在某些配置中,设备会不断更改其IP,以使其难以跟踪。参见例如https://www.internetsociety.org/blog/2014/12/ipv6-privacy-addresses-provide-protection-against-surveillance-and-tracking/-但在这种情况下,请不要为自己感到羞耻在您的原始帖子中提及。这可能意味着您的路由器根本不执行NAT,即使在路由器后面,我的原始想法仍然有效。


2
+1是第一个实际回答问题的答案。
kasperd

@Guntram Blohm感谢您的回答!服务器在路由器后面。在这种情况下,这两种可能性仍然成立吗?如果是这样,我将在第二天左右在本地访问目标计算机时对其进行检查。
理查德

11

动态DNS是一种选择,另一种选择是拥有服务器邮件或以其他方式发送给您IP。一个简单的HTTP调用即可(到您控制并登录请求的端点)。

也可以用另一种方法解决整个公共网络。您可以让服务器设置反向隧道或VPN连接,而不受IP更改的影响。

关于服务不响应新地址:这完全取决于您的网络设置。例如:内部接口上的WAN IP通过DHCP和SSH服务器设置为仅侦听启动时已知的接口IP,这意味着sshd必须在接口更改时重新启动。


1
如问题中所述,已经存在找到新IP地址的解决方案。因此,添加动态DNS并不能真正解决任何问题。所描述的问题是IP地址更改时ssh服务器停止响应。您尚未解决该问题。当IP更改时,OTOH预计VPN连接和反向隧道会停止工作,因此您需要适当的位置来自动重新启动它们。
kasperd

7

您应该真正研究ddns服务。只要能够通过动态IP地址远程连接到特定计算机;ddns是最常用的解决方案。

前往https://noip.com并注册一个帐户(它是errr...。..coff..cof...。对于在同一网络上运行的1-3台机器免费(如果我没记错,请不要引用我在这里:一段时间以来,我就信任任何这些“免费”服务...),还有其他替代方案,例如Afraid DNS(https://freedns.afraid.org/ 甚至可以使用Cisco的Open DNS :(前提是这不是您的唯一客户,我建议您注册一个伞状帐户试用版,进行试用,然后再注册真实帐户)。交易>>>他们甚至得到了其中一个类似于GUI的可下载扩展名,每当您的客户端ip更改时,它们都会自动更新ddns主机名。这实际上是我知道的最简单,最不懂技术的方式万一您要打电话给您的一位客户并要求下载GUI而不是....])


3
尽管这对于在更改IP地址上访问主机肯定有帮助,但这并不是问题所在。问题是为什么ssh服务器在IP地址更改时停止响应,以及如何解决该问题。动态DNS服务无法解决该问题。
kasperd

4

我能够设置SSH,它可以在本地和远程运行……直到IP地址更改为止。一旦发生这种情况,即使使用新的IP地址,我也无法再进行远程连接。

有时,DHCP更改需要一段时间才能生效。尝试回收目标计算机上的DHCP客户端

$> sudo dhclient -r
$> sudo dhclient
Do I need to restart the service every time the IP address changes?
If so, why?

不需要。您只需要在配置更改(/etc/ssh/sshd_conf)时回收ssh服务。

IP地址更改时,我是否还需要采取其他措施以允许SSH访问?

没有。

我有一个解决方案,假设您在目标计算机上设置了sendmail。

该脚本会发送一封电子邮件,显示世界认为我们拥有的IP地址(谢谢ipify.org)。电子邮件将始终具有最新的IP地址。

  1. 创建dhcp-notify bash脚本(不带.sh扩展名)
  2. 将脚本放入 /etc/dhcp/dhclient-exit-hooks.d

    #!/bin/sh
    case "$reason" in (BOUND|RENEW|REBIND|REBOOT)
    (
       echo To: me@my.email
       echo From: me@my.email
       echo "Content-Type: text/html; "
       echo Subject: DHCP reason: $reason
       echo
       echo Your IP address is: `curl -s https://api.ipify.org`
    ) | sendmail -t
    ;;
    esac
    

如果这不起作用,您总是可以设置cron来向您发送当前的IP地址(使用case语句)。

#!/bin/sh
(
   echo To: me@my.email
   echo From: me@my.email
   echo "Content-Type: text/html; "
   echo Subject: IP address change
   echo
   echo Your IP address is: `curl -s https://api.ipify.org`
) | sendmail -t

我只是想提出这个建议,这是一个好主意,也是我阅读问题时想到的第一件事。另外,如果您在 api.ipify.org时(由于某种原因它在我的学校网络中被阻止),您可以使用我几个月前制作的另一个网站,该网站的功能相同:findip.win
撤消

@karlchilders感谢您的回答!我已经有一个cron脚本向我报告IP地址,但是我对dhclient钩子一无所知。太棒了!我宁愿只在实际更改时报告IP。问题:如果该脚本能够工作并报告IP地址,那么回收dhclient为什么会对SSH访问产生影响?
理查德

@karlchilders还是仅当您手动回收dhclient时此脚本才起作用?
理查德

dhclient -r; dhclient将续订dhcp租约,因此您的主机是最新的。无论何时手动或以其他方式发生dhcp事件,该挂钩都将起作用。
karlchilders

@Richard请标记其中一个答案为首选答案。谢谢。
karlchilders

3

在框外思考-您可以安排一个固定的IPv6地址吗?由于其稀缺性,通常只有IPv4地址需要更改。


我每次下拉的IP地址实际上都是IPv6。
理查德

1
@Richard:很抱歉听到它对您不起作用。我将答案留给其他对IPv4有此问题的人。
MSalters

@Richard您应该在问题中真正提到您正在处理IPv6。这使问题大为不同。
Dubu

1
@Dubu确实确实使问题有所不同。IPv6上根本不会发生这种问题,这可能就是为什么每个人都认为它是IPv4的原因。但是实际上,如果您错误地使用隐私地址而不是静态地址,则可能会遇到某些描述的症状。例如,如果您问一个网站您的IP地址是什么,它将显示您的隐私地址,而不是您的静态地址。将其用于ssh连接不是一个好主意。仍然没有解释为什么在重新启动ssh服务器之前它不起作用。
kasperd

1
@Dubu:这是一种非标准的方法。DHCPv6-PD(前缀委派)与DHCP唯一ID(DUID)的结合应该可以防止这种情况。
MSalters

1

我已经做了差不多一年了。今年1月,我在当地大学演讲时遇到了您的问题。

从那时起,该脚本就一直在我的机器上运行://相当不言自明//

import smtplib
from requests import get
import time

user = 'exampleemail@gmail.com'
psd = 'examplepassword'
msg = 'Hey, your ip has changed! Use this one from now on: '
currip = '0.0.0.0' # It'll send an email the first time you execute this aswell
while True:
    newip = get('https://api.ipify.org').text
    if currip == newip:
        print("nonewip")
        #You can just comment the line above this one if you want to
    else:
        tmpmsg = "\n"+msg + newip +" The old one used to be: "+currip
        currip = newip
        server = smtplib.SMTP('smtp.gmail.com', 587)
        server.connect('smtp.gmail.com')
        server.ehlo()
        server.starttls()
        server.ehlo()
        server.login(user,psd)
        #You can change the second parameter, use ('from','to','message')
        server.sendmail(user, user, tmpmsg)

        server.quit()
        with open('/home/pi/DEV/iphistory.txt', 'a') as f:
            f.write('newip: '+currip+'\n')
            f.close()
        print('New IP Found: '+tmpmsg)
    time.sleep(7200)

Python 3.x应该可以正常工作,也许不是最好的解决方案,但是它可以工作。

每当机器的公共IP发生变化时,您都会在收件箱中收到一封电子邮件。

现在,关于您的问题:

每次IP地址更改时,我都需要重新启动服务吗? 如果通过重新启动服务是要重新建立ssh连接,则可以。

如果是这样,为什么? 因为如果您尝试与之通信的地址不再提供您正在寻找的服务。不再是您的机器了。

IP地址更改时,我是否还需要采取其他措施以允许SSH访问? 只需SSH到新地址即可。

干杯! JSR


感谢您的回答@JSR!我实际上已经编写了一个类似的脚本来向我报告IP地址。但是一旦更改,即使知道新的IP地址,我也无法通过SSH进入远程计算机。你遇到那个问题了吗?
理查德

您确定要检索正确的地址吗?如果是这样,请在获得IP后尝试对其执行ping操作。我之前从未见过该问题。另外,以防万一,您可以使用“ python3 scriptname.py&”在后台运行脚本。此外,请检查路由器的转发端口,我认为本地IP不会并没有改变,但仍然值得一试。
Jaime Satorres Rey

是的,IP是正确的。如果在目标计算机上重新启动SSH服务,则可以再次连接。但是我不明白为什么会这样。
理查德

@Richard,这里的问题是,由于IP更改,主机将停止每个连接,因为用于身份验证的RSA密钥与请求的RSA密钥不匹配。我绝不是这个主题的专家,所以请不要以我的话为根据……但是由于我刚才所说的,您的情况很可能是这样。
Jaime Satorres Rey

1

值得从不同的角度看待这个问题:通常,创建向外的连接要简单得多从需要您注意的计算机(DNS,NAT和其他防火墙设置根本无关紧要,或者要简单得多)。

您可以使用它来建立防弹,简单的解决方案,以进入远程计算机R。唯一的要求是您可以提供ssh对自己的本地计算机之一的公共访问权限(我们称之为S)。然后执行以下操作:

  1. 创建sshR到的向外连接,并建立一条反向隧道S该反向隧道进入R

    ssh -L 22:<address-of-S>:22000

  2. 在上S,使用反向隧道ssh进入远程计算机R

    ssh -p 22000 127.0.0.1

第1步可以手动触发,并在需要帮助时由远程端按需触发。或者,您可以在R该服务上创建一个服务,该服务将持续维护到S

我使用这样的设置登录到位于防火墙/ NAT之后且根本没有DNS条目的远程(移动)系统。


1

如果只需要远程登录,请使用mosh。除了能够很好地应对IP更改(在切换过程中几乎没有延迟)之外,它还具有与普通协议相比其他的优势ssh,例如本地预测回波,低延迟,从断开的链接中更快恢复的方式。

如果您特别需要ssh(例如,您需要X11转发之类的东西),我建议您设置VPN(例如OpenVPN),最好是通过UDP并使用简短的keepalive。通过IP更改后,VPN上的TCP连接(即您的ssh)将恢复并保持连接,这只需要更长的时间(最多一分钟左右),但是您可以使用/proc/sys/net/ipv4/tcp_*来使其更容易被接受。

编辑:

  • mosh需要ssh身份验证,但是一旦身份验证,连接就会一直保持,直到您注销(或重新启动),然后您便可以随意进行调查ssh(例如strace -f -p pid_of_sshd
  • 它可以使用moshssh,答案改编自点击这里

在服务器上运行:

mosh-server new -p $randomport -- $shellprogram

你得到一个类似的结果 QzdRHbAWzL7eRobi75DCrz

在客户端上运行:

MOSH_KEY=QzdRHbAWzL7eRobi75DCrz mosh-client $serverip $radomport

注意 $serverip必须是ip,没有主机名解析。

如何从一侧到另一侧获取密钥取决于您。我建议使用预共享密钥进行加密并进行即时消息传递,发送邮件,或者让本地用户通过电话命令进行加密。

  • 如果确实存在问题ssh,请inetd从那里安装并运行ssh,而不是作为独立的守护程序运行,例如通过“经典” inetd.conf的此配置行,则每次登录时都会运行一个新的守护程序(请注意,并非所有inetd fork处理ipv6):

ssh stream tcp6 nowait root /usr/sbin/sshd sshd -i


1
感谢@Radovan的回答!Mosh看起来很有趣,但是看起来它使用SSH进行身份验证。所以问题的根源仍然存在,对吗?让我知道我是否误解了文档。
理查德

@Richard是的,但是有可能...我已经编辑了答案。
RadovanGarabík18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.