IP를 정기적으로 변경하는 Linux 시스템에 연결하는 방법은 무엇입니까?


12

내 문제는 매일 IP 주소가 변경되는 Linux 서버 (Ubuntu 18.04)에 SSH하는 방법을 찾는 것입니다.

관리 작업을 도와주는 클라이언트가 있습니다. 도움이 필요할 때 컴퓨터에 ssh해야하지만 정적 IP가 없으므로 서버의 공용 IP가 지속적으로 변경됩니다. Linux 시스템의 IP 주소를보고하는 작은 스크립트를 작성했으며 정오 쯤 하루에 한 번씩 변경되는 것을 발견했습니다.

SSH를 설정할 수 있으며 IP 주소가 변경 될 때까지 로컬 및 원격으로 모두 작동합니다. 그런 일이 생기면 새로운 IP 주소를 사용해도 더 이상 원격으로 연결할 수 없습니다.

  • IP 주소가 변경 될 때마다 SSH 서비스를 다시 시작해야합니까?
  • 그렇다면 왜 그렇습니까?
  • SSH 액세스를 허용하기 위해 IP 주소가 변경 될 때 취해야 할 다른 조치가 있습니까?

최신 정보

분명히, 내 문제는 새 IP 주소를 찾지 못했습니다. 이미 할 스크립트가 있습니다. 문제는 새 IP 주소를 사용하여 연결하려고해도 IP가 변경되면 서버가 응답하지 않는다는 것입니다.

대상 시스템에서 SSH 서비스를 다시 시작하면 원격 액세스가 다시 가능합니다. 그러나 왜 내가 이것을 해야하는지 이해하지 못합니다. 더 나은 해결책을 찾기 위해 근본 원인을 알고 싶습니다.

대부분의 사람들은 새로운 IP를 알고있는 한 SSH가 작동해야한다고 생각하는 것 같습니다. 이것이 18.04의 고유 한 것입니까? 최근에 클라이언트 용으로이 서버를 설치 했으므로 모든 구성 설정이 여전히 기본값입니다. (변경 방법을 모를 것입니다.)


8
동적 dns를 사용하십시오 .
Ipor Sircer

12
그들의 ISP에 소리 치십시오. 비즈니스 연결에는 하루에 한 번 IP 주소를 변경하는 것이 터무니 없으며, 주거용 연결에 대해서는 들어 본 적이 없습니다.
마이클 햄튼

2
IP 주소가 변경되면 ssh 액세스가 작동하지 않는다고 말합니다. 그러나 다시 작동하기 시작한 시점에 대해서는 언급하지 않았습니다. 나는 그것이 어떻게 든 다시 작동해야한다고 가정합니다. 그렇지 않으면 매일 작동이 멈추는 것을 볼 수 없었습니다. 그리고 IP 주소가 변경 될 때해야 할 일은 없습니다. 새 IP 주소에서 ssh 서버에 즉시 연결할 수 있습니다.
kasperd

1
DDNS가 실행되고 ListenAddress <dynamic host name>sshd 구성 파일 과 같은 이상한 점이있을 수 있습니다. 누군가 내부 사용자가 서버에 ssh 할 수 있기를 원하지 않았기 때문일 수 있습니다. 실제로 IP가 변경 될 때마다 ssh 서버를 다시 시작해야합니다.
트람 Blohm 모니카 지원

1
@MichaelHampton : 고함을 지르는 것은 도움이되지 않을 것입니다. 현재 IPv4 주소의 부족으로 인해 대부분의 공급자는 고정 IPv4 주소에 대해 추가 요금을 청구합니다 (일부 비 정적 공개 IP 주소에 대해서는 추가 요금이 청구되며 그렇지 않은 경우 Dual Stack Lite가 제공됨 ). 물론, OP가 IPv6에 있다면, 상황이 변합니다 ...
sleske

답변:


21

다른 답변은 귀하의 질문에서 한 가지를 간과 한 것으로 보입니다.

그런 일이 생기면 새로운 IP 주소를 사용해도 더 이상 원격으로 연결할 수 없습니다

DDNS는 새 IP 주소를 찾는 데 도움이되지만 여기서 문제가되지는 않습니다.

불행하게도, ISP가 라우터를 제공하고 서버가 라우터 뒤에 내부 주소를 가지고 라우터가 포트 전달을 수행하는 표준 설정에서 새 IP를받는 서버 는 문제 되지 않습니다. 좋은 답변을 얻으려면 네트워크 토폴로지에 대한 자세한 정보를 제공해야 할 수도 있습니다.

내가 상상할 수있는 것은 서버가 라우터 뒤에 있지 않고 자체 PPPoE 연결을 수행 하고 a) 서버 다시 시작할 때 특정 인터페이스 주소에 바인딩하는 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 매직이 일부 라우터에 의해 라우터가 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

@ 건 트람 블롬 답을 주셔서 감사합니다! 서버가 라우터 뒤에 있습니다. 이 시나리오에서이 두 가지 가능성이 여전히 유효합니까? 그렇다면 다음 날 또는 대상 컴퓨터에 로컬로 액세스 할 수있을 때 모두 확인합니다.
Richard

11

동적 DNS는 하나의 옵션이며, 다른 하나는 서버 메일이 있거나 IP를 보내도록하는 것입니다. 간단한 HTTP 호출이 수행합니다 (요청을 제어하고 로그온하는 엔드 포인트에 대한).

전체 공개 네트워킹을 다른 방식으로 해결하는 것도 가능합니다. 서버가 역방향 터널 또는 VPN 연결을 설정하여 IP 변경의 영향을받지 않도록 할 수 있습니다.

새 주소로 응답하지 않는 서비스와 관련하여 : 이는 네트워크 설정에 따라 다릅니다. 예 : DHCP를 통한 내부 인터페이스의 WAN IP 및 시작시 알려진 인터페이스의 IP 만 수신하도록 설정된 SSH 서버는 인터페이스 변경시 sshd를 다시 시작해야 함을 의미합니다.


1
이 질문에 설명 된 것처럼 이미 새로운 IP 주소를 찾을 수있는 솔루션이 있습니다. 따라서 동적 DNS를 추가해도 실제로 문제가 해결되지는 않습니다. 설명한대로 문제는 IP 주소가 변경 될 때 ssh 서버가 응답을 중지한다는 것입니다. 그 문제를 해결하지 못했습니다. IP가 변경되면 VPN 연결 및 역방향 터널이 OTOH에서 작동을 멈출 것으로 예상되므로 자동으로 다시 시작하려면 무언가가 필요합니다.
kasperd

7

실제로 ddns 서비스를 살펴 봐야합니다. 동적 IP 주소로 특정 머신에 원격으로 연결할 수있는 한; ddns가 가장 일반적으로 사용되는 솔루션입니다.

https://noip.com으로 가서 계정에 가입 하십시오 (예 : errr ..... coff..cof .. 같은 네트워크에서 실행되는 1-3 대의 컴퓨터에 무료입니다 (실수하지 않은 경우, 인용하지 마십시오) 나도 여기에있다 : ive는이 '무료'서비스 중 하나를 신뢰 한 이래로 오랜 시간이 걸렸다 ... .Afraid DNS ( https://freedns.afraid.org/ 와 같은 다른 대안도 있습니다 그리고 심지어 시스코의 오픈 DNS :도 활용 될 수 있습니다. (이것은 귀하가 클라이언트가 아니라면, 우산 계정 평가판에 가입하고 스핀을 신청 한 후 나중에 실제 가입을하는 것이 좋습니다. 거래 >>> 고객의 IP가 변경 될 때마다 ddns 호스트 이름을 자동으로 갱신하는 GUI와 같은 다운로드 가능한 확장 기능 중 하나를 얻었습니다. 실제로 내가 알고있는 가장 쉽고 기술이 아닌 정통한 방법입니다. 경우 클라이언트 중 하나를 호출하고 오히려 GUI를 다운로드하도록 요청해야합니다 ....])


3
이것은 IP 주소를 변경하여 호스트에 액세스하는 데 확실히 도움이되지만 질문이 아닙니다. 문제는 IP 주소가 변경 될 때 ssh 서버가 응답을 중지하는 이유와 해결 방법입니다. 동적 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 서비스를 재활용하면됩니다 ( ).

SSH 액세스를 허용하기 위해 IP 주소가 변경 될 때 취해야 할 다른 조치가 있습니까?

아니.

대상 컴퓨터에 sendmail이 설정되어 있다고 가정하는 솔루션이 있습니다.

이 스크립트는 우리가 생각하는 IP 주소를 보여주는 이메일을 보냅니다 (감사합니다 ipip.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
    

그래도 문제가 해결되지 않으면 항상 현재 IP 주소를 보내도록 cron을 설정할 수 있습니다 (사례 설명을 잃어 버림).

#!/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
undo

@karlchilders 답변 주셔서 감사합니다! 이미 ip 주소를보고하는 cron 스크립트가 있지만 dhclient 후크에 대해서는 전혀 몰랐습니다. 대단해! IP가 실제로 변경 될 때 IP 만보고하는 것이 좋습니다. 질문 :이 스크립트가 작동하고 IP 주소를보고 할 수 있다면 dhclient를 재활용하면 SSH 액세스에 영향을 미치는 이유는 무엇입니까?
Richard

@karlchilders 아니면이 스크립트는 dhclient를 수동으로 재활용 할 때만 작동합니까?
Richard

dhclient -r; dhclient는 dhcp 임대를 갱신하여 호스트가 최신 상태입니다. 후크는 dhcp 이벤트가 수동 또는 다른 방식으로 발생할 때마다 작동합니다.
karlchilders

@Richard 답변 중 하나를 선호 답변으로 표시하십시오. 감사합니다.
karlchilders

3

상자 밖에서 생각하면-고정 IPv6 주소를 정렬 할 수 있습니까? 일반적으로 부족하기 때문에 변경해야하는 IPv4 주소 만 있습니다.


풀다운하는 IP 주소는 실제로 매번 IPv6입니다.
Richard

1
@Richard : 당신에게 효과가 없다 니 유감입니다. IPv4에이 문제가있는 다른 사람들을 위해 답을 남겨 두겠습니다.
MSalters

@Richard 당신은 당신의 질문에서 당신이 IPv6를 다루고 있다고 언급해야합니다. 이것은 문제를 상당히 다르게 만듭니다.
Dubu

1
@Dubu 실제로 문제를 다르게 만듭니다. 이런 종류의 문제는 IPv6에서 발생하지 않기 때문에 모든 사람들이 IPv4라고 가정했을 수 있습니다. 그러나 실제로 고정 주소가 아닌 개인 정보 주소를 실수로 사용하면 설명 된 증상 중 일부가 나타날 수 있습니다. 예를 들어 웹 사이트에 IP 주소가 무엇인지 물어 보면 고정 주소가 아닌 개인 정보 주소가 표시됩니다. 그리고 ssh 연결에 사용하는 것은 좋지 않습니다. 여전히 ssh 서버가 다시 시작될 때까지 왜 작동하지 않는지 설명하지 않습니다.
kasperd

1
@ Dubu : 그것은 다소 비표준 접근법입니다. DHCP 고유 ID (DUID)와 함께 사용되는 DHCPv6-PD (접두사 위임)는이를 방지해야합니다.
MSalters

1

내가 거의 1 년 동안하고있는 일. 올해 1 월에 지역 대학에서 연설을하면서 문제에 부딪 쳤습니다.

이 스크립트는 그 이후로 내 컴퓨터에서 계속 실행되었습니다 : // Pretty much self-explanatory //

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 연결을 다시 설정한다는 의미입니다.

그렇다면 왜 그렇습니까? 통신하려는 주소가 더 이상 원하는 서비스를 제공하지 않기 때문입니다. 더 이상 기계가 아닙니다.

SSH 액세스를 허용하기 위해 IP 주소가 변경 될 때 취해야 할 다른 조치가 있습니까? 새 주소로 SSH 만 연결하십시오.

건배! JSR


@JSR 답변 감사합니다! 실제로 IP 주소를 알려주는 비슷한 스크립트를 작성했습니다. 그러나 새로운 IP 주소를 알고도 변경되면 원격 컴퓨터에 SSH로 연결할 수 없습니다. 그 문제가 발생 했습니까?
Richard

올바른 주소를 검색하고 있습니까? 그렇다면 IP를 받으면 핑을 시도하십시오. 전에도 그 문제를 본 적이 없습니다. 또한, 당신이 모르는 경우에 대비하여, "python3 scriptname.py &"와 함께 백그라운드에서 스크립트를 실행할 수 있습니다. 또한 라우터의 전달 포트를 확인하십시오. 로컬 IP가 '변경하지는 않지만 여전히 체크 아웃 할 가치가 있습니다.
Jaime Satorres 레이

예, IP가 정확합니다. 대상 시스템에서 SSH 서비스를 다시 시작하면 다시 연결할 수 있습니다. 그러나 왜 그런지 이해가되지 않습니다.
Richard

@Richard의 문제는 IP가 변경되므로 인증에 사용하는 RSA 키가 요청한 키와 일치하지 않으므로 호스트가 모든 연결을 중지한다는 것입니다. 나는 결코이 주제에 대한 전문가가 아니므로 사실로 내 말을 받아들이지 마라. 그러나 당신의 상황은 내가 방금 말한 것 때문에 아마도 그와 같다.
Jaime Satorres 레이

1

다른 측면에서 볼 가치가 있습니다. 일반적으로 주의를 기울여야하는 시스템에서 외부 연결만드는 것이 훨씬 간단합니다 (DNS, NAT 및 기타 방화벽 설정은 전혀 중요하지 않거나 훨씬 간단합니다).

이를 사용하여 원격 시스템에 들어갈 방탄 및 간단한 솔루션을 구축 할 수 R있습니다. 유일한 요구 사항은 ssh자신의 로컬 컴퓨터 중 하나에 공개 액세스를 제공 할 수 있다는 것입니다 (이것을 호출하십시오 S). 그런 다음 다음과 같이 진행하십시오.

  1. 외부 만들기 ssh의 연결 RS, 에 역 터널 다시 설정을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 포워딩 또는 무언가 필요) 짧은 keepalive를 사용하여 UDP를 통해 VPN (예 : OpenVPN)을 설정하는 것이 좋습니다. VPN을 통한 TCP 연결 (예 : ssh)은 IP 변경 후에도 치유되어 연결 상태를 유지하지만 시간이 조금 더 걸리더라도 (최대 1 분 정도) /proc/sys/net/ipv4/tcp_*항목을 가지고 더 수용 할 수 있습니다 .

편집하다:

  • mosh는 ssh인증이 필요 하지만 일단 인증되면 연결은 로그 아웃 (또는 재부팅) 될 때까지 유지 ssh되며 여가 시간 의 실패를 조사 할 수 있습니다 (예 : strace -f -p pid_of_sshd )
  • mosh없이 ssh대답 을 사용할 수 있습니다 .

서버에서 다음을 실행하십시오.

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

당신은 같은 결과를 얻을 QzdRHbAWzL7eRobi75DCrz

클라이언트에서 다음을 실행하십시오.

MOSH_KEY=QzdRHbAWzL7eRobi75DCrz mosh-client $serverip $radomport

참고 $serverip이는 IP, 아니 호스트 이름 확인 할 수 있습니다.

한쪽에서 다른쪽으로 열쇠를 얻는 방법은 당신에게 달려 있습니다. 미리 공유 한 키를 사용하여 암호화하고 인스턴트 메시징, 메일 링 또는 로컬 사용자가 전화 통화를 통해 키를 지시하도록 제안합니다.

  • 실제로 문제가 있는 경우 독립형 데몬이 아닌 ssh를 ssh설치 inetd하고 실행하십시오 (예 : "classic"inetd.conf에 대한이 구성 행으로), 로그인 할 때마다 새 데몬이 실행됩니다 (모두가 아님) inetd 포크는 ipv6를 처리합니다) :

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


1
답변 @Radovan에 감사드립니다! Mosh는 흥미롭게 보이지만 SSH를 사용하여 인증하는 것처럼 보입니다. 내 문제의 근원은 여전히 ​​존재합니다. 맞습니까? 문서를 오해 한 경우 알려주세요.
Richard

@Richard 네, 그러나 가능성이 있습니다 ... 나는 내 대답을 편집했습니다.
Radovan Garabík
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.