강좌

HOME > 강좌 >
강좌| 리눅스 및 오픈소스에 관련된 강좌를 보실 수 있습니다.
 
Sulinux17에서 lsync - 실시간 동기화 사용하기
조회 : 7,559  




lsync - 실시간 동기화




Lsyncd는 “Live Syncing Daemon”의 약자로 master 서버에 파일 또는 디렉토리가 변경 사항이 있으면 inotify로 변경사항을 체크 하여 slave 서버로 파일 또는 디렉토리가 동기화 또는 복제가 되며, 이때 rsync 와 ssh를 사용하게 됩니다.

  • inotify는 리눅스 커널에 포함된 기능으로 파일시스템에 변경 사항이 발생될때 이벤트를 통보해 줍니다.



rsync는 Remote synchronization 의 약자로 local 과 remote 의 데이터 동기화를 위한 유틸리티 입니다. Linux System과 Unix System 에서 백업 용도로 가장 널리 사용하는 유틸입니다.

rsync 유틸의 장점으로 네트워크 대역폭을 최소화하는 델타 인코딩 알고리즘을 사용하여 변경이 일어난 부분만 전송하므로 빠르고, 효율적으로 데이터를 동기화 및 복제를 할 수 있습니다.


동기화의 방식은 이동 방법에 따라 크게 4가지 종류가 있습니다.

A 와 B 서버의 동기화를 한다고 가정 한다면, 아래와 같이 나눌 수 있습니다.


  • A → B :    A 서버에서 B 서버로 파일을 밀어 넣는 방법 (Upload)

  • A → B :    B 서버에서 A 서버에 있는 파일을 당겨 받는 방법 (Download)

  • B → A :    B 서버에서 A 서버로 파일을 밀어 넣는 방법 (Upload)

  • B → A :    A 서버에서 B 서버에 있는 파일을 당겨 받는 방법  (Download)


lsyncd 사용을 위해서 A 서버에서 B 서버로 파일을 밀어 넣는 방법인 첫번째 방식을 사용하여 테스트를 진행 하겠습니다.




0. 기타

  1. 테스트 환경
    (주)에스유소프트에서 제공 받아 sulinux 17 64bit를 사용하였으며, 테스트 및 작업 진행을 확인 하기 위하여 서버 3대를 동일한 버전으로 설치하였습니다.
    - Kernel : 3.10.0-514.el7.x86_64
    - OS : sulinux-release-17-3.1703.el7.sulinux.x86_6
    - Master A 의 IP :    192.168.0.106
    - Slave B 의 IP :    192.168.0.128
    - Slave C 의 IP :    192.168.0.133


  1. 요구 사항 (설치 및 동작 조건)
    master A 서버에 rsync 와 종속 패키지들이 필요하며, yum 으로 설치 진행하였습니다.
    - kernel 2.6.13 이상
    - rsync libxml2 libxml2-devel
    - lsync lua lua-devel pkgconfig gcc asciidoc

  2. 글 내용과 실제 쉘상에 사용할 수 있는 명령어의 차이점을 두기 위하여 리눅스 쉘 상에서 사용하는 명령은 $ 기호를 앞에 두어 표시 하였습니다.

  3. 명령어를 그대로 복사하여 사용하면 기호  ' " ' ` 등 적용이 되지 않는 부분이 있을 수 있으며, 명령어 복사 후에 기호를 수정 하시고 사용하면 됩니다.




1. 커널 버전 확인


커널은 3.10.0으로 2.6.13 버전의 상위 버전으로 확인 되었으므로, 필요 패키지들을 설치 합니다. inotify 설정 또한 확인을 합니다. uname -r 은 서버의 kernel 을 확인하는 명령어 이며, inotify 설정 확인시 [ 따옴표 Apostrophe(') ]가 아닌 [ 물결표시 아래 따옴표 Grave (`) ] 입니다.


$ uname -r

3.10.0-514.el7.x86_64


$ cat /boot/config-`uname -r` | grep -i inotify

CONFIG_INOTIFY_USER=y




2. 설치 과정

@ 설치

rsync 와 libxml2 는 기본적으로 설치가 되어 있으며, 두 패키지의 설치 진행을 하면 업데이트 혹은 latest version(최신 버전)이라는 해당 메시지를 볼 수 있습니다.
libxml2-devel 패키지는 설치가 안되어 있으므로 설치 진행을 합니다.

동기화 파일이나 디렉토리가 있는 master A 서버, Slave B C 에 설치를 진행 하면 됩니다.


$ yum install libxml2 libxml2-devel rsync


..

..

Package libxml2-2.9.1-6.el7_2.3.x86_64 already installed and latest version

..

..

..


Dependencies Resolved


================================================================== Package        Arch        Version        Repository        Size

==================================================================

Installing:

libxml2-devel        x86_64    2.9.1-6.el7_2.3    base        1.0 M

Installing for dependencies:

xz-devel        x86_64    5.2.2-1.el7        base        45 k

zlib-devel        x86_64    1.2.7-17.el7        base        49 k


Transaction Summary

==================================================================

Install  1 Package (+2 Dependent packages)


Total download size: 1.1 M

Installed size: 9.1 M

Is this ok [y/d/N]: y


..

...

Installed:

 libxml2-devel.x86_64 0:2.9.1-6.el7_2.3                                                                                                                                                                      


Complete!


@ 설치_2

기본 저장소에서는 lsyncd 패키지를 사용 할 수 없으므로, epel repo를 추가 하여 활성화 하도록 합니다. 글쓴이는 dl.fedoraproject.org 의 URL에서 최신 repo를 추가 하였습니다.

추가가 완료 되면 yum 을 이용하여 종속 패키지와 lsyncd 패키지를 설치 합니다.

Complete! 메시지가 마지막에 출력이 되면 정상적으로 설치가 된 것 입니다.

master A 서버에 설치를 하며, 설정 또한 master A 서버에서 진행을 합니다.


rpm의 URL 경로는 바뀔 수 있으며, 웹브라우저에 수동으로 URL 주소를 입력하여 경로를 확인하도록 합니다.


$ rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm



# 종속 패키지

$ yum install lua lua-devel pkgconfig gcc asciidoc

.. ...

.. ...


Installed:

 asciidoc.noarch 0:8.6.8-5.el7                                                                         lua-devel.x86_64 0:5.1.4-15.el7                                                                      


Dependency Installed:

 boost-regex.x86_64 0:1.53.0-27.el7    docbook-dtds.noarch 0:1.0-60.el7 docbook-style-xsl.noarch 0:1.78.1-3.el7 graphviz.x86_64 0:2.30.1-19.el7 libXaw.x86_64 0:1.0.13-4.el7 sgml-common.noarch 0:0.6.3-39.el7

 source-highlight.x86_64 0:3.1.6-6.el7


Updated:

 gcc.x86_64 0:4.8.5-16.el7_4.1                                                                                                                                                                               


Dependency Updated:

 cpp.x86_64 0:4.8.5-16.el7_4.1       gcc-c++.x86_64 0:4.8.5-16.el7_4.1       gcc-gfortran.x86_64 0:4.8.5-16.el7_4.1        libgcc.x86_64 0:4.8.5-16.el7_4.1      libgfortran.x86_64 0:4.8.5-16.el7_4.1    

 libgomp.x86_64 0:4.8.5-16.el7_4.1   libquadmath.x86_64 0:4.8.5-16.el7_4.1   libquadmath-devel.x86_64 0:4.8.5-16.el7_4.1   libstdc++.x86_64 0:4.8.5-16.el7_4.1 libstdc++-devel.x86_64 0:4.8.5-16.el7_4.1  


Complete!


$ yum install lsyncd

.. ...

.. ...


Installed:

 lsyncd.x86_64 0:2.2.2-1.el7                                                                                                                                                                                 


Complete!




@ 설치 확인


$ rpm -qa | grep "rsync\|libxml2\|libxml2-*"

libxml2-2.9.1-6.el7_2.3.x86_64

libxml2-devel-2.9.1-6.el7_2.3.x86_64

rsync-3.0.9-18.el7.x86_64


$ rpm -qa | grep "lua\|lua-devel\|pkgconfig\|gcc\|asciidoc\|lsyncd"

lua-devel-5.1.4-15.el7.x86_64

libgcc-4.8.5-16.el7_4.1.x86_64

asciidoc-8.6.8-5.el7.noarch

gcc-4.8.5-16.el7_4.1.x86_64

gcc-gfortran-4.8.5-16.el7_4.1.x86_64

pkgconfig-0.27.1-4.el7.x86_64

lua-5.1.4-15.el7.x86_64

gcc-c++-4.8.5-16.el7_4.1.x86_64

lsyncd-2.2.2-1.el7.x86_64



@ lsync 사용 형식

lsyncd [OPTION]... [SOURCE] [TARGET 1] [TARGET 2] ...

[SOURCE] => 동기화시 원본이 존재하는 위치 /home/test/

[TARGET X] => 동기화가 필요한 서버 192.168.0.3::HOME/test

[OPTION]

--binary FILE        rsync 실행 파일 위치

--conf FILE         실행시 로드할 설정 파일명 (DEFAULT: /etc/lsyncd.conf.xml)

--debug         디버그를 위한 로그

--exclude-from FILE     동기화시 제외시킬 패턴의 옵션

--logfile FILE         로그 파일위치

--no-daemon         포그라운드로 실행 시킴

--pidfile FILE         pid 파일 생성위치




@ ssh keygen 작업


마스터와 슬레이브 서버 간의 키 기반 인증을 사용하기 위하여, 마스터 서버에 로그인 하고, ssh-keygen을 사용하여 공개 키와 개인 키를 생성 합니다.

생성 작업이 완료 되었다면, ssh-copy-id 명령을 사용하여 공개 키를 슬레이브 서버로 복사 합니다.


# keygen 생성

$ ssh-keygen

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa):

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /root/.ssh/id_rsa.

Your public key has been saved in /root/.ssh/id_rsa.pub.

The key fingerprint is:

0a:5d:c6:37:ec:2c:4b:ab:36:0a:5d:15:5f:e0:0c:97 root@localhost.localdomain

The key's randomart image is:

+--[ RSA 2048]----+

|        o oo.    |

|       . OE.     |

|        = B      |

|     . + + .     |

|    . o S o  |

|   . o o +       |

|  . . . o        |

|   . o.         |

|    .o..         |

+-----------------+


# 복제

$ ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.0.128

/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys

root@192.168.0.128's password:


Number of key(s) added: 1


Now try logging into the machine, with:   "ssh 'root@192.168.0.128'"

and check to make sure that only the key(s) you wanted were added.


@ 확인

keygen 까지 복사가 완료가 되었다면, slave 서버에서 확인을 하도록 합니다.

보안을 위하여 중간에 값들은 생략하여 출력하였습니다.


slave B

$ cat /root/.ssh/authorized_keys

ssh-rsa AAAA… .. ...bbbBB root@localhost.localdomain


  • (*) A → B 서버로 keygen 생성 복사를 하게 되면 A 서버에서 패스워드 필요 없이 shell 상에서 ssh 접근이 가능한 점 참고 하시고, keygen 에 대해서 각자 학습 하도록 합시다.
    $ ssh root@192.168.0.128



@ lsyncd의 구성 파일 설정

설치 작업을 완료 하였다면 항상 습관적으로 확인을 하도록 합시다.

확인까지 마친 후 구성 파일을 설정 하겠습니다.


샘플 파일을 /etc/lsyncd.conf 으로 복사를 합니다. 설정 파일이 생성되어 있다면, 백업 후 복사를 진행 하면 됩니다.

복사를 마친 후 구성 파일을 다음과 같게 설정 합니다.

  • slave C 에는 delete 옵션을 주어 master 서버에서 디렉토리나 파일 삭제시 slave C 서버에도 함께 삭제가 되도록 설정 하였습니다.

  • slave C 에는 archive 옵션을 주어 permission 과 소유권 또한 동일하게 복사가 되도록 설정 하였습니다.

  • slave C 에는 exclude 옵션을 주어 test01 디렉토리와 work_2018 이라는 파일을 제외하고 동기화 하도록 설정 하였습니다.



1) 샘플 파일 복사

$ cp /usr/share/doc/lsyncd-2.2.2/examples/lrsync.lua /etc/lsyncd.conf


$ cat /etc/lsyncd.conf ## 수정 전

----

-- User configuration file for lsyncd.

--

-- Simple example for default rsync.

--

settings {

       statusFile = "/tmp/lsyncd.stat",

       statusInterval = 1,

}


sync{

       default.rsync,

       source="src",

       target="trg",

}






# 설정을 위해 수정을 합니다.

$ vi /etc/lsyncd.conf

----

-- User configuration file for lsyncd.

--

-- Simple example for default rsync.

--

settings {

       logfile = "/var/log/lsyncd.log",

       statusFile = "/var/log/lsyncd.stat",

       statusInterval = 2,

}


sync{

       default.rsync,

       source="/home/",

       target="192.168.0.128:/root/home2/",

       rsync={rsh ="/usr/bin/ssh -l root -i /root/.ssh/id_rsa",}

}


sync{

       default.rsync,

       source="/home/",

       delete=true,

       target="192.168.0.133:/root/home3/",

       exclude={'/test01','work_2018'},

       rsync={rsh ="/usr/bin/ssh -l root -i /root/.ssh/id_rsa",archive=true,}


}




log 파일은 /var/log/lsyncd.log 파일 이며, lsync 서비스의 상태 확인은 /var/log/lsyncd.stat 에서 할 수 있습니다.


@ 서비스 시작

설정이 완료 되었다면, 시스템이 재부팅(reboot)이 될 때 사용하도록 설정을 하고 서비스를 시작 합니다.


$ systemctl start lsyncd

$ systemctl enable lsyncd



@ 확인

글쓴이는 master 서버의 /home/ 이하 디렉토리를 slave B 서버에는 /root/home2/ 의 경로로 동기화를 진행 하였으며, slave C 서버에는 /root/home3/ 경로에 동기화를 진행 하였습니다.


$ systemctl status lsyncd.service

lsyncd.service - Live Syncing (Mirror) Daemon

  Loaded: loaded (/usr/lib/systemd/system/lsyncd.service; enabled; vendor preset: disabled)

  Active: active (running) since 화 2017-12-25 19:20:19 KST; 5s ago

Main PID: 6119 (lsyncd)

  CGroup: /system.slice/lsyncd.service

          └─6119 /usr/bin/lsyncd -nodaemon /etc/lsyncd.conf


12월 25 19:20:19 localhost.localdomain systemd[1]: Started Live Syncing (Mirror) Daemon.

12월 25 19:20:19 localhost.localdomain systemd[1]: Starting Live Syncing (Mirror) Daemon...



@ Error

아래의 설정처럼 slave B 서버의 /root/ 디렉토리 밑에 home2 디렉토리가 생성되어있지 않아도 자동으로 생성이 되게 됩니다.


$ cat /etc/lsyncd.conf

.. ...

       source="/home/",

       target="192.168.0.128:/root/home2/",

.. …



하지만 slave B 서버의 생성되지 않은 home3 디렉토리의 test01 경로로 지정이 되면 정상적으로 동기화가 되지 않습니다. 따라서 slave B 서버에 mkdir 명령어 사용하여 해당 경로를 만들어 줘야 합니다.


$ cat /etc/lsyncd.conf

.. ...

       source="/home/",

       target="192.168.0.128:/root/home3/test01",

.. …


## error message

$ systemctl status lsyncd

lsyncd.service - Live Syncing (Mirror) Daemon

  Loaded: loaded (/usr/lib/systemd/system/lsyncd.service; enabled; vendor preset: disabled)

  Active: active (running) since 화 2017-12-25 17:50:21 KST; 7min ago

.. ...


.. ...

12월 25 17:57:11 localhost.localdomain lsyncd[28239]: rsync: connection unexpectedly closed (9 bytes received so far) [sender]

12월 25 17:57:11 localhost.localdomain lsyncd[28239]: rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]

4월 03 17:57:26 localhost.localdomain lsyncd[28239]: rsync: mkdir "/root/home3/test01" failed: No such file or directory (2)

.. ...


slave B

$ mkdir /root/home3/



@ 로그 확인

마지막으로 master 서버에서 slave 서버로 정상적인 동기화가 진행되는지 로그를 보도록 하겠습니다. 아래에는 master 서버 1대를 slave 2대 서버에 lsync 서비스를 적용한 예 입니다.

동기화 되는 디렉토리 및 파일을 확인 할 수 있습니다.



$ cat /var/log/lsyncd.log

.. ...

Wed Apr  4 09:50:28 2018 Normal: --- Startup ---

Wed Apr  4 09:50:28 2018 Normal: recursive startup rsync: /home/ -> 192.168.0.128:/root/home3/

Wed Apr  4 09:50:28 2018 Normal: recursive startup rsync: /home/ -> 192.168.0.133:/root/home3/

Wed Apr  4 09:50:29 2018 Normal: Startup of /home/ -> 192.168.0.133:/root/home3/ finished.

Wed Apr  4 09:50:29 2018 Normal: Startup of /home/ -> 192.168.0.128:/root/home3/ finished.

.. ...


$ tail -f /var/log/lsyncd.status

.. ...

Lsyncd status report at Wed Apr 25 10:00:00 2017


Sync1 source=/home/

There are 0 delays

.. …

.. ...

Sync2 source=/home/

There are 0 delays

Excluding:

 nothing.



Inotify watching 98 directories

 1: /home/

 2: /home/test01/

 3: /home/test01/다운로드/

 4: /home/test01/문서/

 5: /home/test01/.cache/

 6: /home/test01/.cache/abrt/

.. ...



@ slave 서버 확인

slave 서버 두대에 접속하여 정상적으로 파일이 동기화 되었는지도 확인해 주도록 합니다.

글쓴이는 위에서 slave 서버의 /root/home3/ 로 경로 지정을 하였기 때문에 아래와 같이 확인을 하였습니다. 마스터 서버의 동기화 디렉토리와의 용량이 일치하는지의 여부도 확인 방법 중 한가지 방법이라고 할 수 있습니다.


slave B

$ ls /root/home3/


$ du -sch /root/home3/



@ Trouble_1

운영하다 보면 디렉토리가 팔천개 이상 넘는 경우 동기화가 정상적으로 작동 되지 않는 경우가 있습니다. inotify 기본적인 설정 값 확인 후 수정을 하도록 합니다.


$ cat /proc/sys/fs/inotify/max_user_watches

8192


$ vi /etc/sysctl.conf

.. …

fs.inotify.max_user_watches = 16000


$ sysctl -p

.. …

fs.inotify.max_user_watches = 16000


$ cat /proc/sys/fs/inotify/max_user_watches

16000




@ Trouble_2

방화벽 문제로 실시간 동기화가 안되는 경우가 있습니다. 이는 873 포트의 문제가 아닌 sshd port 의 오픈이 안되어 생기는 장애 입니다. 아래와 같이 슬레이브 서버의 sshd 포트가 기본 포트가 아니며, 특정 IP만 허용 하였을 시 master A 서버에서도 접근 할 수 있도록 설정을 하여 해결 하도록 합니다. 추가적으로 master A 서버의 /etc/lsyncd.conf 파일도 수정을 하도록 합니다.


slave

$ cat /etc/ssh/sshd_config | grep -i port

Port 8281


$ vi /etc/sysconfig/iptables

.. …

-A INPUT -s 192.168.0.106 -m state --state NEW -m tcp -p tcp --dport 8281 -j ACCEPT

.. ...


$ systemctl restart iptables

$ systemctl status iptables

$ iptables -nL
.. ...

ACCEPT     tcp  -- 192.168.0.106        0.0.0.0/0            state NEW tcp dpt:8281

.. ...

master

$ cat /etc/lsyncd.conf

.. …

sync{

       default.rsync,

       source="/home/",

       target="192.168.0.128:/root/home2/",

       rsync={rsh ="/usr/bin/ssh -p 8281 -o StrictHostKeyChecking=no",}

}

.. ..

$ systemctl restart lsyncd

$ systemctl status lsyncd






이것으로 lsyncd 설치 및 운영 끝맺음을 하도록 하겠습니다.






## 참고 URL
http://axkibe.github.io/lsyncd/manual/config/layer4/





## 참고 사항 - rsync - ##

아래의 참고 사항 이며, 내용은 읽지 않고 넘어가도 lsync 사용에는 지장이 없습니다.

lsync 의 사용 방법을 위한 설치 방법은 크게 어렵지 않습니다.

하지만 lsync 를 사용하기 위해서는 rsync 의 이해가 필요하며,

이는 보안상 중요한 부분이기 때문에 아래 부분은 읽고 넘어 가도록 합시다.



$ cat /etc/rsyncd.conf

[ROOT]

       path = /

       uid = root

       gid = root

       use chroot = yes

       read only = no

       hosts allow = 192.168.0.128

#    hosts.allow = 192.168.0.126 ## 잘못된 설정



Issue_1) read only = no


path 설정된 디렉토리 이하에 있는 모든 파일이 변조 될 수 있으니 주의를 요구 합니다.


$ cat /etc/rsyncd.conf

.. ...

read only = no

.. ...

  • A 서버에 위와 같은 설정을 하였다면 접근 허용된 IP에서 모든 파일을 밀어 넣을 수 있습니다.

  • A 서버의 최상위 디렉토리 "/" 밑에 있는 /etc/passwd, /etc/shadow, /etc/group 파일을 B 서버의 임시로 만든 /etc/passwd_2 /etc/shadow_2 파일로 변조 할 수 있습니다.

    * 아래 명령어로 확인해 봅시다.

1) Master A 서버

## 테스트 이후 원복을 위하여 MasterA 서버의 passwd 파일을 백업 하도록 합니다.

$ cp -rp /etc/passwd /etc/passwd_backup


2) Slave B 서버

## B 서버에서 passwd2라는 파일을 만들어 파일 내용을 "test sulinux" 로 변경을 합니다.

$ touch passwd2

$ echo "test sulinux" > passwd2


## B -> A 서버로 변조파일을 밀어 넣어 보도록 합니다.

$ rsync -av ./passwd2 [A서버의 ip]::ROOT/etc/passwd


3) A 서버

## 변조 파일을 밀어 넣은 후 확인

$ cat /etc/passwd

test sulinux


4) A 서버

## 변조확인이 되었다면 원복을 합니다.

$ cp -rp /etc/passwd_backup /etc/passwd



Issue_2) 위와 같은 예제는 허용된 IP에서 모든 파일을 밀어 넣거나(Upload), 내려 받을 수 있습니다.(Download) 하지만 아래와 같은 잘못된 설정으로 특정 IP에서만 접근이 가능 하도록 설정을 하였다고 착각을 하고 작업을 종료 하였다면, 복구 방법에 많은 시간과, 금전이 소요 될 수 있으니 주의 하도록 합시다.


$ cat /etc/rsyncd.conf

[ROOT]

path = /

.. ...

read only = no

.. ...

hosts.allow = 192.168.0.128


1) read only = no

- 위와 같은 설정으로 특정 IP에 대해서 접근이 가능합니다.


2) hosts.allow = yes

- 잘못된 설정입니다. "hosts.allow" 라는 Parameter는 존재 하지 않습니다.

  그러므로 해당 설정은 적용이 되지 않으며, 모든 IP에서 접근이 가능합니다.


3) 실습 방법은 간단합니다.

 자신의 IP가 192.168.0.126 이라고 가정을 하고 "hosts.allow = 192.168.0.128" 으로 설정을 한다면, 192.168.0.126 은 허용이 되어 있지 않은 IP이기 때문에 rsync 데몬의 되지 않아야 합니다.

 그러나 잘못된 설정으로 접근이 가능 하며, 모든 IP 또한 접근이 가능 합니다.   


4-1) 해결 방법

/etc/rsyncd.conf 파일의 설정에 문제가 있다면 /var/log/messages log에 아래와 같이 기록이 된다. 아래 메시지와 같이 설정 파일의 파라메타에 잘못된 설정이 있으면 모든 서버에서 파일을 가져 올 수 있으니 주의 하도록 합시다.


잘못된 설정 부분이 없는지 확인 하려면 rsync 데몬을 사용 후 항상 messages 로그를 보는 습관을 기르도록 합니다.


 아래의 메시지의 의미는 hosts allow = [접근 허용 IP]의 설정에 점( . ) 들어가 설정 값에 맞지 않는 parameter로 로그에 기록 되었습니다.


$ tail -f /var/log/messages | grep -i para*


Mar 31 19:23:06 localhost rsyncd[8300]: Unknown Parameter encountered: "hosts.allow"

Mar 31 19:23:06 localhost rsyncd[8300]: IGNORING unknown parameter "hosts.allow"


위의 로그가 기록 되기 위해서는 아래와 같은 조건 등이 필요 합니다.

  • A 서버의 rsync daemon process 가 작동하고 있을 때

  • B 서버에서 A 서버로 rsync 작업을 진행할 때

  • rsync 서비스를 올리거나 재 시작 할 때




4-2) 해결 방법 2


두번째 해결 방법으로 리눅스에서 주로 사용되는 iptables 방화벽을 이용하여 rsyncd을 특정 IP만 사용 할 수 있도록 허용해주는 방법이 있습니다.


rsyncd 데몬의 port 는 873 포트입니다.


## sulinux 17 Version

$ netstat -nlpt | grep 873

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    

tcp6       0      0 :::873                  :::*                    LISTEN      5470/rsync        



## sulinux 2014 Version

$ netstat -nlpt | grep 873

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   

tcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN      1298/xinetd       


리눅스 사용자라면 iptables 기본적인 룰셋 적용은 할 수 있다고 판단하며, 방화벽 설정 설명은 생략 하기로 합니다.


## 설정 값

-A INPUT -s 192.168.0.128 -m state --state NEW -m tcp -p tcp --dport 873 -j ACCEPT


## 확인*


$ iptables -nL | grep 873

ACCEPT     tcp  -- 192.168.0.128        0.0.0.0/0           state NEW tcp dpt:873


4-3) 해결 방법 3

세번째 해결 방법으로는 TCP_wrapper 를 사용한 설정 방법이 있습니다.

TCP_wrapper 설명 또한 자세하게 설명을 하게 되면 내용이 길어지므로 생략하며,

아래에는 작성자의 설정 부분이며, 참고만 하기 바랍니다.

(*) 설정 하게 된다면 반드시 접속 확인이 필요합니다.


## rsync 서비스를 특정 IP에서만 허용 할 수 있도록 모두 차단 합니다.


$ cat /etc/hosts.deny

rsync : ALL



## rsync 서비스 접근을 허용 할 IP를 적용.

TCP-wrapper의 적용 이후 접속 테스트 및 서비스 확인이 반드시 필요 합니다.


$ cat /etc/hosts.allow

rsync : 196.128.0.128

rsync : 196.128.0.126


(*) /etc/hosts.deny -> /etc/hosts.allow 순으로 deny 파일의 적용이 우선 순위에 있으며,

/etc/hosts.deny 의 내용이 " ALL : ALL " 이라면 rsync 서비스 이외의 모든 서비스가 차단이 되니 설정을 위해서는 학습이 선행 되어야 합니다.

(*) hosts.allow 는 TCP-wrapper을 사용하기 위한 설정 파일 이름입니다.

(***) 중요 /etc/rsyncd.conf 파일의 설정 parameter과 헷갈리지 않도록 주의를 하도록 합니다.


5) 방화벽을 구입한다거나, 기타 다른 방법으로도 얼마든지 설정이 가능합니다.

윗 부분에서 언급 한 것처럼 꼭 rsync 서비스를 사용한 뒤에는 /var/log/messages 에 기록된 로그를 보는 것을 습관화 합시다.




[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1885


이 글을 트위터로 보내기 이 글을 페이스북으로 보내기 이 글을 미투데이로 보내기

 
윤상진
이름 : 윤상진
E-Mail : sjyun골뺑이linux.co.kr
소속 : (주)에스유리눅스