유동IP에 DDNS를 활용해서 홈서버 PC에 접속하는 과정, 여기에 C네임 레코드를 써서 도메인을 연결하는 과정까지 개괄했었습니다.
https://www.sobi.tips/유동ip-ddns-도메인연결-c네임레코드-이메일포워딩/
그런데 DDNS는 맹점이 있습니다. 일정한 시간 간격으로 IP주소 변경을 체크하기에, 체크시점 직후에 IP가 바뀌면 다음 체크시점 전까지 접속이 안됩니다.
DDNS 갱신주기를 짧게 잡으면 어느정도 보완이 되는데, 이게 항상 좋은 결과를 보장하지는 않습니다. 갱신작업시 홈서버 연결이 잠깐씩 안되기도 하기 때문입니다.
이 공백을 메꾸고자 (우분투 리눅스 쓰면서) 30분마다 체크해서 IP주소가 바뀌면 이메일로 통보하게끔 구축하는 과정을 예전에 글로 남긴 적이 있는데…
[Ubuntu 16.04LTS] IP주소 바뀌면 이메일로 통보되게끔 구축 : 구글(Gmail) SMTP 활용
https://www.sobi.tips/ubuntu-gmail-ssmtp-when-ip-changes/
위 글에는 시행착오를 겪은 부분도 그대로 적고, 우분투 버그때문에 우회한 과정까지 전부 적어놔서 깔끔한 맛이 떨어지는 고로… 되는 부분만 골라내서 정리해둘까 합니다.
——————————————————–
1.
먼저, 발신용으로 쓸 Gmail 세컨드 계정을 하나 만들고, 비밀번호를 최대한 어렵게 설정해 둡니다.
▶ 이유 : 메일 써주는 프로그램을 깔아서 환경구축 할텐데, 설정파일에 이메일 계정(Gmail ID&비밀번호)을 적게끔 되어 있더군요. 우분투 해킹 당해서 구글 계정정보 유출될 수 있으니까… 보안상의 이유로 세컨드 계정을 쓰자고 권하는 겁니다.
보안 필요없으면 메인 구글계정으로 진행해도 되고, SMTP(발신 메일 서버) 제공하는 다른 메일 서비스를 이용하셔도 됩니다. 본문 설명은 Gmail을 기준으로 할 겁니다.
2.
우분투에서 터미널 창을 하나 띄우고(단축키 : Ctrl+Alt+T), 아래의 명령어들을 차례로 입력하여 ssmtp와 mailutils 프로그램을 설치합니다. (Y를 눌러서) 의존성 패키지들도 함께 설치해줍니다.
sudo apt-get update
sudo apt-get install ssmtp mailutils
3.
ssmtp 프로그램의 설정 파일을 세팅할 차례예요. /etc/ssmtp/ssmtp.conf 파일을 에디터로 엽니다. root권한 쓰셔야 할거예요(sudo 블라블라~).
▲ 저는 초보라 지에디트 쓸겁니다. sudo gedit /etc/ssmtp/ssmtp.conf 라고 입력.
4.
설정파일 내용이 뭔가 복잡합니다. 그래서… 주석(#표시) 풀려있는 부분들(붉은 밑줄)을 전부 주석처리(#)해서 무력화하고, 하단에 옵션항목들을 깔끔하게 입력해줍니다. 스샷처럼요.
root=본인 세컨드 Gmail 계정
mailhub=smtp.gmail.com:587
AuthUser=본인 세컨드 지메일 계정
AuthPass=세컨드 지메일 계정 비밀번호(과거) or 앱 비밀번호(최신)
UseTLS=YES
UseSTARTTLS=YES
AuthMethod=LOGIN
rewriteDomain=gmail.com
FromLineOverride=YES
※ Gmail SMTP 서버 주소와 TLS 포트에 대한 정보는 아래의 문서들로부터 얻었습니다.
https://support.google.com/mail/answer/7126229
https://support.google.com/mail/?p=BadCredentials
5.
이제 메일이 잘 보내지나 테스트해 봅시다. 터미널 창에서 아래처럼 입력해 봅니다.
echo “test message” | mail -s “testing ssmtp” yourmail@gmail.com
(yourmail@gmail.com 은 수신 가능한 본인의 메일 주소로 바꿔주세요.)
웹브라우저로 메일함을 열어보고, 잘 도착했다면 테스트 성공. 다음 절차로 진행합니다.
※ 에러 메세지가 뜬다면 /var/log/mail.err 파일을 열어서 로그를 확인해 보고 해결책을 궁리해 보세요.
▲ Autorication failed 같은 오류가 떴을 때는… 구글계정의 보안설정을 의심해볼 만합니다.
▲ “내 계정”의 “로그인 및 보안” 부분에서 “보안 수준이 낮은 앱 허용”을 사용하겠다고 해주면 Autorication failed가 해결될 확률이 높습니다. 하지만 구글 메인계정에서 이런 설정을 했을 때 보안상 좋을 게 없으니까… 본문 도입부에서 권했던 것처럼 세컨드 계정을 만드는 게 낫다고 생각합니다.
▲ cannot send message : Process exited with a non-zero status 에러도 같은 방법으로 해결 가능할 겁니다.
각설하고,
6.
에디터를 하나 열어서(저는 gedit 씁니다) 아래의 코드를 입력 후 원하는 경로+파일명으로 저장합니다(저는 /home/우분투 계정명/emailipaddress.sh 로 했습니다.).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #!/bin/bash # check and send ip address to email let “loop_time=60*30” #30분마다 반복 while : do MYIP=`wget –O – –q http://checkip.dynu.com | awk –F“: “ ‘{print $2}’`; TIME=`date`; LASTIPFILE=‘/home/XXXXXX/.last_ip_addr’; LASTIP=`cat ${LASTIPFILE}`; if [[ ${MYIP} = ${LASTIP} ]] then echo “no IP change!” else echo “New IP = ${MYIP}” echo “sending email..” echo –e “Hello\n\nTimestamp = ${TIME}\nIP = ${MYIP}\n\nBye” | \ /usr/bin/mail –s “[INFO] New IP” yourmail@gmail.com; echo ${MYIP} > ${LASTIPFILE}; fi sleep $loop_time #loop_time 후에 다시 체크합니다 done | cs |
코드에서 붉은색+굵게 표시한 곳은 본인에게 맞게끔 수정해야 합니다. 만약 제가 우분투 계정을 sobi 라고 정해서 쓰고 있다면 /home/XXXXXX/.last_ip_addr 부분을 /home/sobi/.last_ip_addr 라고 바꾸어 적는 겁니다(사실은 .last_ip_addr 이름으로 생성되는 숨김파일의 저장위치를 정하는 것인데, 원하는 경로로 적당히 적어줘도 됩니다.). yourmail@gmail.com 부분도 본인이 받고자 하는 메일주소(예 : 메인 Gmail 주소)로 바꿉니다.
– 참고 : 코드 내용 파악해보기 –
① bash 스크립트임.
② 30분마다 (아래의 내용을) 반복하라.
③ http://checkip.dynu.com 사이트에서 MYIP 를 받고, 현재 시간(TIME)도 출력하라.
④ LASTIP 는 .last_ip_addr 파일에 있다(파일이 없으면 생성한다.). 이를 LASTIPFILE 라 칭한다.
⑤ 만약 MYIP = LASTIP 라면 “no IP change!” 메세지를 출력하라. 아니라면 MYIP 값을 출력하고 yourmail@gmail.com로 메일을 보내라.
⑥ MYIP 값을 LASTIPFILE 에 기록하라.
⑦ ②가 다시 발동하기 전까지 잠자라.
⑧ 끝.
7.
이제 이 스크립트 파일을 테스트할 차례입니다. 터미널을 띄워서 emlipaddress.sh가 저장된 경로로 이동한 다음…(저는 /home/우분투 계정명/ 디렉토리(기본 경로)에 저장했었기 때문에 경로이동을 하지 않습니다.)
bash emailipaddress.sh
라고 쳐봅니다(우분투는 dash 쉘이 기본이라 bash 쉘로 실행할 것을 명시해주는 겁니다. 배경 정보는 https://storycompiler.tistory.com/101 에서 확인해 주세요.)
cat: 블라블라/.last_ip_addr: 그런 파일이나 디렉터리가 없습니다.
라고 뜨면서 IP주소와 메일 보내고 있다는 메세지까지 뜰텐데요(구문이 종료되지 않고 멈춰있음. loop 구문 때문에.),
실제로 메일함을 보면 현재 IP주소가 메일로 와있을 겁니다. 그리고 nautilus 같은 파일관리자에서 숨긴 파일 보이기 옵션을 체크하고 살펴보면 .last_ip_addr 파일이 생성되어 있을 겁니다.
(다음 테스트를 대비하여 에디터로 .last_ip_addr 파일을 열고, IP 주소 중의 일부를 지우고 저장 후 빠져나옵니다. 이후 테스트 중 .last_ip_addr 파일이 갱신될 때마다 이런 식으로 대응해두면 상황 파악하기 좋기 때문에 추천합니다.)
이제 터미널 창에서 Ctrl+C를 눌러서 파일 작동을 중지시키고 이렇게 쳐보세요.
./emailipaddress.sh
그러면 “bash: ./emailipaddress.sh: 허가 거부” 라고 뜰겁니다. 이걸 해결하기 위해서는 터미널에서 아래처럼 쳐주면 되더군요.
chmod u+x emailipaddress.sh
이제 ./emailipaddress.sh 라고 쳐보면 정상적으로 실행되는 것을 확인 가능합니다. Ctrl+C 눌러서 중단해 주세요.
▲ 참고로 chmod u+x emailipaddress.sh 의 효과는 파일 속성에서 확인할 수 있습니다(764). 소유권 탭에서 “이 파일의 실행을 승인(R)”을 체크해준 거예요.
8-1. (우분투 16.04 까지) – /etc/rc.local 수정을 통해 시작프로그램으로 등록하기.
emailipaddress.sh 파일이 작동하는 것을 확인했는데, 부팅할 때마다 수동으로 실행하면 귀찮으니까… 부팅시 자동 실행되게끔 조치할 차례입니다.
▲ 에디터를 루트 권한으로 띄운 다음 /etc/rc.local 파일을 엽니다.
▲ /bin/bash /home/XXXXXX/emailipaddress.sh 내용을 추가하고 저장 후 빠져나옵니다.
(XXXXXX 는 우분투 계정 폴더명이겠죠?)
재부팅합니다.
emailipaddress.sh 파일이 백그라운드에서 잘 돌아가고 있는지 확인해 봅시다.
터미널 창을 새로 하나 띄워서(단축키 : Ctrl+Alt+T) 아래의 명령어를 입력해 봅니다.
▲ ps -ef | grep emailipaddress.sh | grep -v grep
root 권한으로 실행되고 있는 emailipaddress.sh 스크립트를 확인할 수 있을겁니다.
▲ 만약 프로세스를 종료하고 싶다면 터미널 창에서
sudo kill 1039
식으로 입력하면 됩니다.
8-2. (우분투 18.04부터) Systemd 서비스 등록을 통한 시작프로그램 설정
우분투 18.04에서 rc.local 가 없어지고 Systemd 로 시작프로그램이 관리되는 듯합니다.
rc.local 을 살리는 방법이 있는 것 같긴 한데, Systemd 에 적응하는 게 장기적으로 도움이 될 듯해서 적용법을 궁리해 봤습니다.
※ 참고한 글들
https://wiki.ubuntu.com/SystemdForUpstartUsers
https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files
https://askubuntu.com/questions/919054/how-do-i-run-a-single-command-at-startup-using-systemd
https://pinedance.github.io/blog/2017/09/12/Ubuntu-16.04-system-service-등록하기
▲ 터미널 창에서
sudo gedit /etc/systemd/system/emailipaddress.service
처럼 입력하여 에디터로 /etc/systemd/system/ 디렉토리에 emailipaddress.service 파일을 만들고, 위 스크린 샷처럼 내용을 구성합니다. Description 은 본인이 보기 편하게 넣으면 되고, ExecStart 도 한눈에 의미가 파악되죠?
저장하고 빠져나온 다음, 터미널 창에서 아래의 명령을 입력하여 서비스를 등록&실행합니다.
▲ sudo systemctl enable emailipaddress
sudo systemctl start emailipaddress
서비스 상태를 알고 싶다면 터미널 창에 다음과 같이 입력하면 됩니다.
sudo systemctl status emailipaddress
서비스를 멈추고 등록을 해제하고 싶다면 터미널 창에 아래의 명령어들을 입력하면 됩니다.
sudo systemctl stop emailipaddress
sudo systemctl disable emailipaddress
끝!!