학습자료(~2017)/리눅스

[linux] avahi 란? 활용 (zeroconf , bonjour)

단세포소년 2013. 7. 30. 20:50
반응형

참고:
https://wiki.archlinux.org/index.php/Avahi

https://en.wikipedia.org/wiki/Zero-configuration_networking

http://linux.die.net/man/1/avahi-browse

http://linux.die.net/man/5/avahi-daemon.conf

http://www.linuxplanet.com/linuxplanet/reports/6826/1

http://qnibus.com/blog/bonjour-and-zeroconf/

http://zeroconf.sourceforge.net/

http://www.zeroconf.org/

http://www.dns-sd.org/

http://marknelson.us/2011/10/25/dns-service-discovery-on-windows/



avahi 란?


zero configuration networking(zeroconf)의 구현체이다. 이것은 멀티케스트 DNS/DNS-SD 서비스 발견을 포함한다. 이 프로그램은 자신의 서비스를 네트워크에 알리고 다른 알려진 네트워크 서비스를 발견한다. 예를 들어 네트워크 프린터나 공유 파일(samba, nfs ...)등 자신의 서비스를 알리거나 찾는다. 

zero configuration networking(zeroconf)의 리눅스 구현인 avahi 와 애플 구현인 bonjour 가 있다. windows 구현은 upnp 인가?

zero confiuration networking 은 NDS 서버 설정이나 ip를 이용하지 않은 networking 즉 DHCP환경이 없는 네트워크에서 peer to peer 연결이나 wireless 환경에서 수동설정없이 자동으로 네트워킹을 할 수 있는 환경을 만들어 준다.

예) eth1.10 이라는 network interface가 있고 이것을 dhcp 로 설정했다. 하지만 dhcp가 없는 환경이고 따라서 이 network interface는 ip를 할당받지 못한다. 이때 avahi 는 자동으로 ip을 할당받는다.

eth1.10   Link encap:Ethernet  HWaddr 00:25:90:68:50:a5  
          inet6 addr: fe80::225:90ff:fe68:50a5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:582 errors:0 dropped:0 overruns:0 frame:0
          TX packets:906 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:109106 (109.1 KB)  TX bytes:284017 (284.0 KB)

eth1.10:avahi Link encap:Ethernet  HWaddr 00:25:90:68:50:a5  
          inet addr:169.254.7.247  Bcast:169.254.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

보는 바와 같이 eth1.10은 ip할당에 실패했고 avahi는 eth1.10에 대한 가상 network interface를 만들고 이에 ip를 자동 할당했다.

  • addressing (allocating IP addresses to hosts)
    호스트에 대한 ip 주소 자동 할당
  • naming (using names to refer to hosts instead of IP addresses)
    ip 주소를 대신하는 호스트에 대한 이름
  • service discovery (finding services on the network automatically) 
    자동으로 네트워크내의 서비스 발견


avahi 활용


  • avahi daemon 실행

$ service avahi-daemon start




  • avahi-browse 로 서비스 발견(-a 는 모든 서비스 검색을 뜻함)

$ avahi-browse -a

+   eth0 IPv4 gmyi [00:0c:29:27:4e:a5]                      Workstation          local

+   eth0 IPv4 0 [00:25:90:68:50:a4]                         Workstation          local

+   eth1 IPv6 nas-gateway                                   Microsoft Windows Network local

+   eth1 IPv4 nas-gateway                                   Microsoft Windows Network local

+   eth0 IPv6 nas-gateway                                   Microsoft Windows Network local

+   eth0 IPv4  iMac (2)                           VNC Remote Access    local

+   eth1 IPv6 nas-gateway                                   Apple File Sharing   local

+   eth1 IPv6 TimeCapsule                                   Apple File Sharing   local

여러 서비스가 발견된다.




  • avahi-browse 로 ip 주소 얻기

$ avahi-browse -alr

=   eth1 IPv4 nas-gateway                                   Apple File Sharing   local

   hostname = [nas-gateway.local]

   address = [192.168.3.23]

   port = [548]

   txt = []

=   eth0 IPv6 nas-gateway                                   Apple File Sharing   local

   hostname = [nas-gateway.local]

   address = [fe80::225:90ff:feab:8176]

   port = [548]

   txt = []

=   eth0 IPv6 TimeCapsule                                   Apple File Sharing   local

   hostname = [a.local]

   address = [fe80::1278:d2ff:fe3f:301e]

   port = [548]

   txt = []

=   eth0 IPv4 DS713plus                                     Apple File Sharing   local

   hostname = [DS713plus.local]

   address = [192.168.1.55]

   port = [548]

   txt = []




  • avahi-browse 로 얻은 호스트네임과 ip 주소로 연결해보기

$ avahi-browse -alr

=   eth1 IPv4 nas-gateway                                   Apple File Sharing   local

   hostname = [nas-gateway.local]

   address = [192.168.3.23]

   port = [548]

   txt = []

$ ping 192.168.3.23

$ ping nas-gateway.local

특이하게도 nas-gateway.local 이란 호스트이름이 /etc/hosts 에 등록되어 있는 않은데도 ping nas-gateway.local 로 ping 이 보내진다. 즉 ip 주소가 없는 서비스도 hostname은 생성되기 때문에 avahi 란? 에서 언급했던 dns 와 ip 주소가 없는 네트워크 환경에서 peer to peer 가 가능하다는 것이 입증되었다.

$ avahi-browse -alr

=   eth0 IPv6 test                                    _smb._tcp       local

   hostname = [test.local]

   address = [fe80::a00:27ff:fe3c:af67]

   port = [3934]

$ ping test.local

이거 핑이 간다. 

확실히 네트워크 설정을 수동으로 잡지 않고서도 (혹은 실패해도) 자동으로 호스트네임이나 ip 주소가 생성되고 서비스가 된다는 것이 신기하다.



  • avahi 를 이용하여 나만의 서비스 알리기(publish)

우선 /etc/avahi/service 밑에 원하는 이름의 서비스를 등록한다.
$ vi /etc/avahi/service/mytest.service

<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">

<service-group>
  <name replace-wildcards="yes">%h</name>

  <service>
    <type>_mytest._tcp</type>
    <port>9876</port>
  </service>
</service-group>

$ service avahi-daemon restart


다른 호스트에서 avahi-browse 를 이용하여 mytest 서비스가 발견되는지 확인
다른 호스트(컴퓨터)에서 아래의 명령 수행

# 특정 서비스를 검색할 때는 아래와 같이 서비스명(_mytest._tcp)를 입력하면된다.
$ avahi-browse -lr _mytest._tcp

+   eth1 IPv6 nas-gateway                                   _mytest._tcp         local
+   eth1 IPv4 nas-gateway                                   _mytest._tcp         local
+   eth0 IPv6 nas-gateway                                   _mytest._tcp         local
=   eth1 IPv6 nas-gateway                                   _mytest._tcp         local
   hostname = [nas-gateway.local]
   address = [fe80::225:90ff:feab:8176]
   port = [9876]
   txt = []
=   eth1 IPv4 nas-gateway                                   _mytest._tcp         local
   hostname = [nas-gateway.local]
   address = [192.168.3.23]
   port = [9876]
   txt = []
=   eth0 IPv6 nas-gateway                                   _mytest._tcp         local
   hostname = [nas-gateway.local]
   address = [fe80::225:90ff:feab:8176]
   port = [9876]
   txt = []


놀랍다. 검색이 되었다. 




IP 자동 할당


우선 avahi-autoipd 패키지를 설치한다.

$ apt-get install avahi-autoipd


만약 eth1을 avahi-autoipd 로 ip를 자동 할당 받고 싶다면

$ avahi-autoipd -D eth1

$ ifconfig eth1:avahi

eth1:avahi Link encap:Ethernet  HWaddr 00:25:90:9b:56:8a  
        inet addr:169.254.8.33  Bcast:169.254.255.255  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          Memory:dfa20000-dfa40000 

ip 가 할당된 것을 볼수 있다. ip 가 할당되면 장비에 우선 접속은 가능하므로 실제 eth1에 대한 ip는 ssh던 모던 원격지에서 설정 가능하게 된다.(모니터가 없는 장비에 유용하다. avahi-autoipd 가 ip를 할당 받고 avahi-daemon 이 서비스를 알려주고 있다면 avahi-browse를 통해서 서비스를 검색하고 호스트네임으로 접속이 가능하기 때문이다.)



avahi 어디에 활용 할까?


여러 장치를 설치해야할때 일일히 해당 장비로 가서 네트워크등을 설정하기 힘들다. avahi-daemon 이 돌고 있다면 원격지에서 서 avahi-browse 로 검색해서 호스트이름으로 ssh 접속해서 네트워크나 기타 설정등을 해주면 된다.

소형장비의 경우 모니터나 기타 표시 장치가 없다. 또한 소형장비는 아무곳에서나 설치될 수 있다. avahi를 이용한다면 해당 장비가 어디에 설치되든 어디로 옮기든 문제가 되지 않는다. 자동으로 네트워크를 설정(호스트네임, ip 주소)하기 때문에 서비스를 검색하면 해당 소형장비에 대한 서비스 목록과 호스트네임, ip 주소가 나오기 때문에 어렵지 않게 해당 장비에 접속할 수 있다. 이런 소형장비의 경우 avahi를 이용하여 자신의 서비스명(예를 들어 mysmalldevice )을 알리고 데스트탑의 전용 서비스 검색 툴을 이용하여 해당 소형장비를 검색하여 사용할 수 있게 하는 것들이 많다.


반응형