라즈베리파이 부팅시 FTP통해 IP 알림 받기

라즈베리파이를 public 망에 물려서 공인 IP를 받아 쓰기 시작했다. 공인 IP를 받으면 어디서든 제약 없이 접근할 수 있으니 따로 서버 호스팅을 하는 것과 동일한 효과를 볼 수 있다. 공인 IP에 도메인을 연결해두면 도메인으로도 접근이 잘 된다.

라즈베리파이는 입출력 장치 없이 사용하는 서버이므로 부팅시 IP를 알려주는 방법이 필요해서 찾아봤는데, 처음 검색된 것이 gmail smtp를 이용하여 메일로 알림을 주는 것이다.

이것이 잘 되면 좋을텐데, 구글에서 비 보안 어플리케이션이 접근한다면서 보안 경고를 보내온다. 좀 꺼림직하여 다른 방법을 찾아봤다.

다음으로 시도해본것이 scp를 이용하여 ip를 다른 서버에 알려주는 것이다. authorized_keys도 입력을 해 두고 비번 없이 scp가 되도록 설정을 해 두었는데 이상하게 잘 안된다. pi 계정, root 계정 모두 pub key를 등록해봐도 안된다. rc.local에 스크립트를 추가하는 방식이었는데 될 것 같은데 안되는…

다음으로 시도해본게 NAS에 ftp로 ip 주소를 전송하는 방법이다. 라즈베리파이가 부팅하면서 ip.html 이라는 파일을 만들고 이를 ftp를 이용하여 NAS에 전송한다. NAS에 http로 접근하면 해당 주소를 web으로 바로 확인할 수 있다. cron 작업에 하루에 한번 IP를 리포트하도록 설정을 했다. 깔끔하게 동작한다.

pi@raspberrypi:~ $ cat startup.sh 
#!/bin/bash
HOST='nas.server.net'
USER='nas_ftp_id'
PASSWD='nas_password'
FILE='ip.html'

cd /home/pi

hostname -I > $FILE
date >> $FILE

ftp -n $HOST << END_SCRIPT
quote USER $USER
quote PASS $PASSWD
cd /web
put $FILE
quit
END_SCRIPT

위 스크립트는 ip address를 ip.html 파일에 기록한 후 ftp로 server로 전송하는 스크립트이다. 본인 상황에 맞게 수정하여 사용하면 될 것 같다.

부팅시 위 스크립트를 실행하기 위해 rc.local 파일에 다음 라인을 추가했다.

pi@raspberrypi:~ $ cat /etc/rc.local 
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
  /home/pi/startup.sh # 라인 추가
fi

exit 0

하루에 한 번 실행되도록 cron에도 추가해줬다.

pi@raspberrypi:~ $ crontab -l
# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command
0 4 * * * /home/pi/startup.sh

홈 네트워크 망 구성에 대한 고찰

요새 인터넷에 가입을 하면 공인 IP를 8개까지 열어준다. 인터넷 + 인터넷 전화 + IP TV까지 다 가입하는 경우 얘기다.

집에 사용하는 장비가 8개 이하라면 모두 공인 IP를 사용하면 괜찮을 것 같다. 하지만 IP 할당되는 장비가 8개 이상이라면 모두 공인 IP를 사용할 수 없기 때문에 공인 IP를 쓸 것과 사설 IP를 나눠야 한다.

이것이 또 문제가 되는게 장비들끼리 서로서로 엑세스가 안된다는 점이다. 예를들어 데스크탑은 공인 IP를 주고, 프린터는 사설 IP를 준다고 하면 데스크탑에서 프린터를 볼 수가 없다. 그렇다고 프린터에 공인 IP를 할당해주면 사설 IP인 아이폰에서 Air Print를 사용할 수 없게 되니 이것 또한 문제.

처음에는 이더넷은 브리지로 공인 IP를 받고 무선 장비들은 사설망으로 사설 IP를 받게 해 봤다. 그럭저럭 쓸만 하지만, 서로 엑세스 할 일이 아예없는것이 아니라서 불편하다. 예를들어 아이폰의 WiFi Sync를 할 수 없다던가 하는 문제가 생긴다.

그래서 내가 내린 결론은 다 사설 IP를 사용하는 것이다. -_-;;

이렇게 되면 외부에서 접근할 때 문제가 생기는데, 포트포워딩을 적절하게 해 줘서 해결하면 어느정도 사용할 수는 있다. SSH를 위한 포트를 리눅스 서버로 연결해두면 데스크탑 PC로는 외부에서 바로 엑세스를 못 하지만, 리눅스 서버에서 데스크탑에 접속할 수 있으니 좀 불편하더라도 사용할 수는 있다.

공인 IP 사용

  1. IP TV
  2. Time Capsule

사설 IP 사용

  1. Time Capsule (gateway)
  2. Airport Express
  3. 데스크탑
  4. 노트북
  5. 프린터
  6. iPhone 4S
  7. iPhone 5
  8. iPad
  9. NAS
  10. 인터넷 전화
  11. Eye-Fi 카드