CentOS hostname 변경

# hostname            # 확인
# hostname [myhost]   # 변경

# vi /etc/sysconfig/network 수정      # 영구 변경 (CentOS 6)
# hostnamectl set-hostname [myhost]   # 영구 변경 (CentOS 7)

CentOS 주로 설치 하는 패키지

yum install vim
yum install net-tools       # ifconfig 등 네트워크 command
yum install psmisc          # pstree
yum install gcc
yum install rdate

yum install iftop           # 네트워크 사용량 체크
yum install iptraf-ng       # TCP 패킷 및 바이트 카운트
yum install jnettop         # 트래픽 모니터링
yum install nmap            # 네트워크 탐색도구 / 포트 스캐너

Linux에서 문자셋

$ echo $LANG    # 확인

ko_KR.UTF-8     # 유니코드
ko_KR.eucKR     # 기본언어

Prompt 변경

# .bash_profile 에 추가
export PS1="\u@\h:\W$ "

.vimrc 주로 이용하는 옵션

set t_ti= t_te=     # vim 종료시에 화면을 클리어 하지 않음
syntax on           # 문법 표현
colors desert       # 칼라 스킵 설정
set et              # TAB을 Sapce로 변경
set ts=4            # TAB 사이즈 설정
set sw=4            # 들여쓰기 사이즈 설정

.bashrc 주로 이용하는 설정

alias ls='ls --color=none'      # ls 실행시 칼라가 거슬릴때 사용
export LESS=-X                  # man 등의 화면이 닫히기 않게 처리

SSH 자동 로그인

  1. 인증키 생성

    $ ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/sysop/.ssh/id_rsa):
    Created directory '/home/sysop/.ssh'.
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/sysop/.ssh/id_rsa.
    Your public key has been saved in /home/sysop/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:HoiisAjLzOrBgGrBIg2W0dQYsEOFZIiWZPTOj+fUsLg sysop@sysop
    The key's randomart image is:
    +---[RSA 2048]----+
    |*XB++            |
    |*+=o .           |
    |o= .             |
    |+o+  . .         |
    |Booo... S        |
    |&+..+ +. .       |
    |*B o = ..        |
    |o . =            |
    |o. E .           |
    +----[SHA256]-----+
  2. 인증키 구성

    • SSH Client

      # SSH Client
      .ssh/id_rsa.pub         # 공개키
      .ssh/id_rsa             # 개인키 (유출 조심)
      Tip
      SSH Client는 chmod 600 id_rsa 처리
    • SSH Server

      .ssh/authorized_keys    # Client의 id_rsa.pub와 같아야 함
  3. 접속 명령

    $ ssh <id>@<ip>
    $ ssh -v <id>@<ip>      # 접속 과정의 문제 추적시 사용
  4. .ssh/config 설정으로 id 및 포트번호 지정

    Host <hostname>
        User <id>
        Port <port>
    Tip
    config 파일은 chmod 600 config 처리
  5. SSH 인증 여러개 사용

    # ~/.ssh/config 수정
    
    Host github.com
        User test1
        IdentityFile ~/.ssh/github_id_rsa
    Host gitlab.com
        User test2
        IdentityFile ~/.ssh/gitlab_id_rsa
  6. known_hosts 파일에 암호화(fingerprint) 값 저장

    • 최초 ssh 접속할 경우 아래와 같은 메시지로 yes/no 를 물음

      ECDSA key fingerprint is SHA256:ONPV8pd31CC4bl8R3iKwjzEmXaVUizxBV69MyQ7Zteg.
      ECDSA key fingerprint is MD5:a7:0f:7f:3d:ec:ec:ec:ed:52:92:c1:16:f1:f2:97:b2.
      Are you sure you want to continue connecting (yes/no)?
    • ssh-keyscan 을 이용하여 미리 등록

      #- 하나만 등록
      ssh-keyscan -p <port> -t rsa <hostname> >> ~/.ssh/known_hosts
      
      #- 여러개 등록 (호스트 리스트가 들어 있는 파일 만들어서 작업)
      ssh-keyscan -p <port> -t rsa -f <hostname_list_file> ~/.ssh/known_hosts

텍스트 파일 문자셋 변경

  1. 텍스트 파일 변환 하기 (eucKR → UTF-8 로 변환)

    $ iconv -f eucKR -t UTF-8 [파일명] > [변환파일명]
  2. 파일이 여러개일 경우 아래와 같이 쉘스크립트로 처리

    #! /bin/sh
    
    for FILENAME in `ls`
    
    do
    
        F=`echo ${FILENAME} | cut -d'.' -f 1`
    
        echo ${F}_UTF-8.log
    
        iconv -f eucKR -t UTF-8 ${FILENAME} > ${F}_UTF-8.log
    
    done

쉘스크립트에서 파일 유무 체크

  1. 기본 문법

    if [ -f "$FILENAME" ]
    then
        echo "파일 있음"
    else
        echo "파일 없음"
    fi
  2. 주요 옵션

    -b FILE

    파일이 존재하고 특별한 파일인지 체크

    -c FILE

    파일이 존재하고 툭수문자가 있는지 체크

    -d FILE

    파일이 존재하고 그 파일이 디렉토리 인지 체크

    -e FILE

    파일과 디렉토리를 가리지 않고 존재 하는지 체크

    -f FILE

    파일이 존재하고 보통 파일인지 체크

    -g FILE

    파일이 존재하고 group ID로 설정 되었는지 체크

    -L FILE

    파일이 존재하고 synmbolic link 파일인지 확인

    -r FILE

    파일이 존재하고 Read 가능한 파일인지 확인

    -s FILE

    파일이 존재하고 파일 사이즈가 0인지 체크

    -S FILE

    파일이 존재하고 그 파일이 소켓인지 확인

    -w FILE

    파일이 존재하고 쓰기 가능한 파일인지 확인

    -x FILE

    파일이 존재하고 실행 가능한 파일인지 확인

쉘스크립트에서 case 문 활용

#!/bin/bash

birth_date=$1

case $birth_date in
  921207)
    echo "저와 생일이 같으시군요!"
    ;;
  ??03??|??04??|??05??)
    echo "봄에 태어나셨군요!"
    ;;
  ??06??|??07??|??08??)
    echo "여름에 태어나셨군요!"
    ;;
  ??09??|??10??|??11??)
    echo "가을에 태어나셨군요!"
    ;;
  ??01??|??02??|??12??)
    echo "겨울에 태어나셨군요!"
    ;;
esac

BASH 쉘에서 파일 한줄씩 읽기

while read <변수명>
do
    echo ${<변수명>}

done < <파일명>

rsync

  1. 기본 사용법

    rsync <options> <source> <destination>
  2. 기본 옵션

    -v : verbose
    -r : recursively 데이터 복사
    -a : archive mode (이 모드를 이용하면 심볼릭 링크, 파일 유저/그룹 권한, timestamp 복사)
    -z : 파일 압축 후 전송
  3. 추가 옵션

    --progress : 진행 정도를 화면에 출력
    --checksum : 파일의 checksum을 이용하여 좀더 정교함 (크기/시간 비교 보다 느림)
    --exclude : 디렉토리 또는 파일을 제외 (예: --exclude='.*' 점(.)으로 시작하는 파일 제외)
    --delete : destination에만 존재하는 파일 또는 디렉토리를 삭제함
    --max-size : 전송할 파일의 최대 크기를 정함 (초과 하는 파일은 전송하지 않음)
    --bwlimit=KBPS : 사용하는 네트워크 대역폭을 제한함 (서비스중인 시스템에 사용시 유용함)
    --copy-links : 심볼릭 링크에 대하여 모두 원본 파일을 복사 (디렉토리, 파일 모두 해당)
    --copy-dirlinks : 심볼릭 링크를 디렉토리를 간주하고 복사 (디렉토리만 해당)
    --chown=<user>:<group> : 파일을 가져온 후 user와 group 지정
    --chmod=D775,F664 : 파일을 가져온 후 디렉토리와 파일의 퍼미션 지정(D775:디렉토리, F664:파일)
  4. 로컬 복사

    rsync -av /usr1/test/ /usr2/test/
    Note
    destinationtest 디렉토리가 없으면 생성됨
    Tip
    source의 /usr1/test//usr1/test 는 다르게 동작함
    /usr1/test//usr2/test
    /usr1/test/usr2/test/test
  5. ssh를 이용한 복사

    #- 로컬 서버에서 원격 서버로 복사
    rsync -ave ssh /home/sysop/test/ root@sysop-t1:/home/test2/
    
    #- 원격 서버에서 로컬 서버로 복사
    rsync -ave ssh root@sysop-t2:/home/test/ /home/sysop/test2/
    rsync -ave 'ssh -p 8392' root@10.11.25.80:/mysql . --bwlimit=10240 --progress
    
    #- 원격 서버에서 로컬 서버로 복사 (rsh 사용)
    rsync -av --rsh='ssh -p 11122' sysop2:/home/test/ home/test/
  6. rsync 데몬을 통한 원격로컬 복사

    • rsyncd.conf

      [test]
      path = /home/sysop/test
      comment = test
      uid = sysop
      gid = sysop
      use chroot = yes
      read only = yes
      hosts allow = 192.168.100.0/24
      max connections = 3
      timeout = 600
    • 복사 명령

      rsync -av sysop-t1::test/ /home/sysop/test2/
  7. rsync 데몬을 통한 로컬원격 복사

    • rsyncd.conf

      [test]
      path = /home/sysop/test2
      comment = test
      uid = sysop
      gid = sysop
      use chroot = yes
      read only = no
      hosts allow = 192.168.100.0/24
      max connections = 3
      timeout = 600
    • 복사 명령

      rsync -av /home/sysop/test2/ sysop-t1::test/

cwrsync (윈도우용)

  1. 설치

    • 공식 페이지에서 다운로드 (https://itefix.net/cwrsync)

    • 압축 풀기

      #- 압축 해제 후 디렉토리
      cwRsync_5.5.0_x86_Free
      
      #- 최초 실행
      cwrsync.cmd
  2. 데몬 실행

    • rsyncd.conf 생성

      [D]
      path = /cygdrive/d
      comment = D Drive
      use chroot = false
      read only = yes
      hosts allow = 192.168.0.0/24
      max connections = 5
      lock file = /cygdrive/c/Temp/rsync.lock
    • 데몬 모드로 실행

      bin\rsync.exe --daemon --config=rsyncd.conf
      Note
      프로세스 종료는 작업 관리자 에서 작업 끝내기 로 하면 됨
    • 상대쪽 호스트를 hosts 에 넣어줘야 Unknown Hosts 오류가 발생 안함

      윈도우즈 hosts 퍄일 위치: C:\Windows\System32\drivers\etc

screen

  • screen session 만들기

    $ screen -S <sockname>
    Tip
    session 이 만들어 지면서 연결까지 됨
  • screen session 리스트 확인

    $ screen -ls
    There is a screen on:
            32165.test      (Attached)
    1 Socket in /var/run/screen/S-pyhouse.
    Note
    "<PID>.<sockname>" 형태
  • screen session 끊기 (Detach)

    Ctrl + a, d

  • screen session 에 다시 연결 (Attach)

    screen -r <sockname>
  • screen session 죽이기

    $ screen -S <sockname> -X quit
    Tip
    해당 session에 연결된 상태에서는 exit로 나올 수 있음
  • Session 에서 윈도우 만들기

    Ctrl + a, c

  • 윈도우 간의 전환

    Ctrl + a, <숫자 0~9>

  • screen session Lock 걸기

    Ctrl + a, x

  • screen 에서 스크롤 방법

    1) Ctrl + a, Esc
    2) Page Up Page Down 으로 스크롤 가능
    3) Esc 스코롤 모드 종료

vim 에서 문법 지정

# vi /usr/share/vim/vim74/filetype.vim

# 대강 아래의 것 주어 하면 됨
au BufNewFile,BufRead *.asciidoc,*.adoc     setf asciidoc

SELinux 끄기

  • 파일 수정 후 리부팅

    vi /etc/sysconfig/selinux
    
    #SELINUX=enforcing   # 주석처리
    SELINUX=disabled     # 추가
  • 확인

    sestatus
    SELinux status:                 disabled

nss-softokn의 의한 Slab 메모리 누수

  1. 발생 상황

    • libcur + nss_softokn 라이브러리의 조합에서 curl 을 통해서 https 주소를 호출할 때 발생

  2. 원인

    • nss-softokn 라이브러리에서 sdb_measureAccess() 함수 호출

  3. 해결

    • 환경변수 NSS_SDB_USE_CACHE=yes 설정 하여 nss-softokn 라이브러리에서 sub_measureAccess() 호출하지 않도록 처리

    • Apache 웹서버의 경우 /etc/init.d/httpd 상단에 넣거나 전역 환경변수에 넣어 주면 될 듯

  4. Slab 메모리 비우기 (참고사항)

    # cat /proc/meminfo | grep Slab
    Slab:              47320 kB
    
    # echo 2 > /proc/sys/vm/drop_caches
    
    # cat /proc/meminfo | grep Slab
    Slab:              33412 kB
  5. 참조

MySQL yum으로 설치

  1. rpm 으로 yum repo 설치

    #- 온라인으로 설치 (또는 다운로드 후 rpm 설치)
    rpm -ivh https://dev.mysql.com/get/mysql57-community-release-el6-11.noarch.rpm
    
    #- 확인
    yum search mysql-community
  2. 설치

    #- Client
    yum install mysql-community-client
    
    #- Server
    yum install mysql-community-server

Apache(httpd) 웹서버 가상호스트에 인코딩(CharSet) 설정

  1. 설정 파일에서 가상호스트 부분 수정

<VirtualHost *:80>
    DocumentRoot /home/test
    ServerName www.test-site.com
    AddDefaultCharset Off               # 이 부분을 넣어야 글러벌 설정이 먹히지 않음
    IndexOptions CharSet=UTF-8          # 인코딩 설정
    ErrorDocument 404 http://www.test-site.com
</VirtualHost>

Linux 에서 VLAN

  • 관련 유틸리티 설치

    yum install bridge-utils
    
    yum install vconfig
  • VLAN(IEEE802.1Q) 모듈 확인 및 올리기

    # 확인
    modinfo 8021q
    lsmod | grep 8021q
    
    # 올리기
    modprobe 8021q
  • VLAN 인터페이스 생성

    # 생성
    # vconfig add enp0s3 70
    Added VLAN with VID == 70 to IF -:enp0s3:-
    
    # 확인
    # cat /proc/net/vlan/config
    VLAN Dev name    | VLAN ID
    Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD
    enp0s3.70      | 70  | enp0s3

Ubuntu 고정 IP 설정

  1. 설정 파일 수정 후 네트워트 재시작 방법

    • 설정 파일 수정

      vi /etc/network/interfaces
      
      iface eth0 inet static
          address 192.168.0.120
          netmask 255.255.255.0
          gateway 192.168.0.1
          # dns-* options are implemented by the resolvconf package, if installed
          dns-nameservers 58.227.193.227 221.143.20.131
    • 적용

      systemctl restart networking.service
  2. Netplan 사용는 방법

    • Interface 목록 확인

      $ ls /sys/class/net
    • 설정 파일 수정

      $ sudo vi /etc/netplan/50-cloud-init.yaml
      network:
          version: 2
          ethernets:
              eth0:
                  addresses: [192.168.100.79/24]
                  gateway4: 192.168.100.1
                  nameservers:
                     addresses: [210.94.0.73,168.126.63.1]
                  dhcp4: no
                  match:
                      macaddress: b8:27:eb:87:34:bb
                  set-name: eth0
    • 설정 반영 및 확인

      $ sudo netplan apply
      
      # ip addr
      # ip route

Linux 에서 GPT 파티션 생성 후 포멧 및 마운트

  • 파티션 생성 및 확인

    #- 명령 진입
    # parted /dev/sdb
    
    #- 도움말
    (parted) help
    
    #- GPT 라벨 생성 (레벨타입 : bsd, gpt, loop, mac, mips, msdos, pc98, sun)
    (parted) mklabel gpt
    
    #- 파티션 생성 (파티션타입 : primary, logical, extedned)
    (parted) mkpart primary 1 1000GB        # 0 부터 10000GB 까지 지정
    (parted) mkpart primary 1 3TB           # 0 부터 3TB 까지 지정
    (parted) mkpart primary 3TB 100%        # 3TB 부터 전체 지정
    (parted) mkpart primary 1 100%          # 하나의 파티션에 모든 용량 사용
    
    #- align 체크
    (Parted) align optimal 1
    1 aligned
    
    #- 확인
    (parted) print
    Model: ATA Hitachi HDS72101 (scsi)
    Disk /dev/sdb: 1000GB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt
    Disk Flags:
    
    Number  Start   End     Size    File system  Name     Flags
     1      17.4kB  1000GB  1000GB               primary
    
    #- 종료
    (parted) quit
  • 모든 블록장치의 파티션 레이아웃 확인

    # parted -l
    Model: LSI MR9271-8i (scsi)
    Disk /dev/sda: 90.0TB
    Sector size (logical/physical): 512B/4096B
    Partition Table: gpt
    
    Number  Start   End     Size    File system  Name  Flags
     1      1049kB  90.0TB  90.0TB  xfs
    
    
    Model: ATA INTEL SSDSC2BW12 (scsi)
    Disk /dev/sdb: 120GB
    Sector size (logical/physical): 512B/512B
    Partition Table: msdos
    
    Number  Start   End     Size    Type     File system     Flags
     1      1049kB  525MB   524MB   primary  ext4            boot
     2      525MB   17.7GB  17.2GB  primary  linux-swap(v1)
     3      17.7GB  120GB   102GB   primary  ext4
  • 포멧 후 확인

    mkfs.xfs -f /dev/sdb1
    
    parted /dev/sdb
    
    (parted) print
    Model: ATA Hitachi HDS72101 (scsi)
    Disk /dev/sdb: 1000GB
    Sector size (logical/physical): 512B/512B
    Partition Table: msdos
    Disk Flags:
    
    Number  Start   End     Size    Type     File system  Flags
     1      1049kB  1000GB  1000GB  primary  xfs
  • 마운트

    #- UUID 확인
    # blkid
    /dev/sdb1: UUID="8c0a8fb6-0cda-4ca3-ba36-0b2261ead18b" TYPE="xfs" PARTLABEL="primary" PARTUUID="2719c519-e753-4cb7-8b29-df37fa493f22"
    
    #- /etc/fstab 에 추가
    
    #- 정상 마운트 되는지 확인
    mount -a
    Note
    미리 /etc/fstab이 정상적으로 작동 하는지 *mount -a" 명령으로 마운트 되는 지 확인 필요
    /etc/fstab의 오타가 있을 경우 부팅시에 싱글모드로 빠지게 됨

파일 개수가 많을 경우 일괄 삭제

  • ls + rm 활용

    ls                  # 확인
    ls | xargs rm -f    # 삭제
  • find 명령 이용

    find./ -type f -exec ls {} \;   # 확인
    find./ -type f -exec rm {} \;   # 삭제
    Note
    항상 삭제 전에는 ls 로 확인 후 rm 실행

scp 활용

  • 사용 형식

    #- 기본 형싱
    scp <option> <surce_host>:<source_dir> <destination_host>:<destination_dir>
    
    #- 자주 사용하는 옵션
    -P <포트번호> : ssh 포트 지정
    -p : 원본 파일의  times, access times, modes 유지
    -r : Recursively copy
  • 활용

    #- 퍼미션과 하위 디렉토리까지 복사
    scp -rp ./test test2_server:/usr/local/src
    
    #- 서버의 포트와 계정 지정하여 복사
    scp -P 2222 * test@192.168.1.10:/home/imsi

디렉토리별 용량 확인 (du)

  • 해당 디렉토리 용량 확인

    du -hs <directory>
  • 현재의 하위 디렉토리 용량 확인

    du -hs *
  • 용량이 많은 디렉토리로 정렬하여 보기

    du -hsx * | sort -rh | head n 5
    Note
    x 옵션은 다른 파일시스템의 디렉토리는 제외함

find 명령 활용

  • 기본 명령 구조

    find [경로][옵션][작업]
  • 경로

    /                   # 전체 경로
    ./                  # 상대 경로
    ./[디렉토리]        # 특정 경로를 줄 수 있음
  • 옵션

    # 지정한 이름의 파일을 찾음 (와일드 카드 사용시 역슬레시를 함께 사용 하거나, 따옴표로 묶어야 함)
    -name [파일명] : 지정된 이름의 파일을 찾음
    
    # 지정된 사용자의 파일을 찾음
    -user [사용자이름]
    
    # 파일의 소유자가 없는 파일을 찾음
    -nouser
    
    # 지정된 그룹 소유의 파일을 찾음
    -group [그룹이름]
    
    # 소유자가 아닌 그룹을 찾음
    -nogroup [그룹이름]
    
    # 파일 퍼미션 조건이 맞는 것만 찾음
    -perm [모드]
    
    # 파일 타입을 지정하여 찾음
    -type [bcdflps]
        b : 블럭 디바이스
        c : 캐릭터 디바이스
        d : 디렉토리
        f :  일반 파일
        l : 심볼릭 링크파일
        p : 파이프
        s : 소켓
    
    # 지정된 크기의 파일을 찾음
    -size [+/-]n[bckw] : 지정된 크기의 파일을 찾음
        +n : n보다 큼
        -n : n보다 작음
         b : 512-byte
         c : byte
         k : kilobytes
         w : 2byte
    
    # 특정 inode 번호와 파일을 찾음
    -inum [number]
    
    # 최근 n일 이전에 액세스된 파일을 찾음
    -atime [+n/-n/n] : 최근 n일 이전에 액세스된 파일을 찾음
        +n : -n일 또는 그보다 더 오래전
        -n : 오늘 부터 n일 전까지
         n : n일 전에 액세스
    
    # atime과 비슷한 파일을 변경 시킨 날자를 의미 함
    -ctime [+n/-n/n] : atime 과 비슷하나 파일을 변경 시킨 날자를 의미 함
    
    # "파일명" 부분에 적어준 파일보다 더 최근에 수정된 파일들을 찾음
    -cnewer [파일명]
    
    # n개의 링크를 가진 파일을 찾음
    -link [n]
    
    # 경로를 함게 보여 줌
    -depth
    
    # 각 옵션 앞에 붙이면 not의 의미를 갖음
    !
    
    # 검색된 파일명을 표준 출력 함
    -print
    
    # 도움말
    --help
  • 작업

    # 찾은 각 파일에 대해 지정된 명령을 실행
    -exec [명령어] {} \;
    
    # 실행 여부를 사용자에게 확인한 후 명령을 실행
    -ok [명령어] {} \;
  • 예제

    #  홈 디렉토리 아래에 있는 확장자가 "txt" 인 모든 파일을 확인하면서 지움
    find $HOME -name '*.txt' -type f -ok rm {} \;
    
    # 위와 같으나 묻지 않고 바로 지움
    find $HOME -name '*.txt' -type f -exec rm {} \;
    
    # 현재 디렉토리 아래에서 "test" 라는 파일을 찾을때
    find ./ -name test -print
    
    # 루트 디렉토리에서 ".py" 로 끝 나는 파일을 출력 할때
    find / -name \*.py -print
    find / -name '*.py' -print
    
    # 현재 디렉토리 아래의 서브디렉토리를 모두 출력
    find ./ -type d -print
    
    # 현재 디렉토리 아래에서 소문자로 시작 하지 않는 파일을 검색
    find ./ ! -name '[a-z]*' -type f -print
    
    # 현재 디렉토리 아래에서 확장자가 c나 o 인 파일을 찾으면서 5일 이내에 수정 된 것 출력
    find ./ -atime -5 \( -name '*.c' -o -name '*.o' \) -print
    
    # 조건을 만족 하지 않을 때 찾기
    find ./ ! \( -atime -5 \( -name '*.c' -o -name '*.o' \) \) -print
    
    # 파일의 크기가 0인 파일을 찾을 때
    find / -size 0 -print
    
    # 홈 디렉토리 아래에서 파일의 크기가 1MB 이상인 파일을 찾아서 자세히 보고 싶을 때
    find ~ -size +1024k -exec ls -l {} \;
    
    # 디렉토리명이 "board" 로 시작하지 않는 디렉토리만 지우기
    find ./ -mindepth 1 -maxdepth 1 ! -name 'board*' -type d -exec rm -rf {} \;
    Note
    UNIX 기종과 버전에 따라 차이가 있을 수 있음으로 man find 로 확인 후 작업
    삭제 하는 명령은 ls 로 미리 확인하면 실수를 줄일 수 있음

github 연결 필요 도메인

  • api 연동 연결 하려면 아래의 도메인에 대한 IP를 찾아서 방화벽에 등록 필요

    github.com
    api.github.com
    codeload.github.com

unix timestamp 변경

  • date 명령어를 이용 unix timestamp 값 확인

    $ date -d "2019-10-01" +%s
    1569855600
    
    $ date -d "now" +%s
    1570003725
    
    $ date +%s
    1570003780
  • unix timestamp 값으로 날자 추출

    $ date -d @1570003725
    2019. 10. 02. (수) 17:08:45 KST

sshd 기본 포트 변경 절차 (CentOS7 기준)

  • 리눅스의 방화벽 조정

    #- 포트 추가
    firewall-cmd --permanent --zone=public --add-port=2222/tcp
    
    #- 적용
    firewall-cmd --reload
    
    #- 확인
    firewall-cmd --list-all
  • sshd 설정 변경

    #- 설정 파일 에디팅
    vi /etc/ssh/sshd_config
    
    #- 설정 수정
    Port 2222
    
    #- 적용
    systemctl restart sshd
    Caution
    원격으로 작업시 기존 포트(22)로 접속된 세션을 끊지말고 새로운 포트 접속 테스트 하여
    설정을 잘못 하였을 경우 대비해야 함

tcpdump 사용법

  • 기본 옵션들

    # tcpdump [ -AdDefIKlLnNOpqRStuUvxX ][ -B buffer_size ][ -c count ][ -C file_size ][ -G rotate_seconds ][ -F file ][ -i interface ][ -m module ][ -M secret ][ -r file ][ -s snaplen ][ -T type ][ -w file ][ -W filecount ][ -E spi@ipaddr algo:secret,... ][ -y datalinktype ][ -z postrotate-command ][ -Z user ]
  • 각종 예제

    # tcpdump -i eth0                   => 인터페이스 eth0 을 보여줌
    
    # tcpdump -w tcpdump.log            => 결과를 파일로 저장, txt 가 아닌 bin 형식으로 저장됨
    
    # tcpdump -r tcpdump.log            => 저장한 파일을 읽음
    
    # tcpdump -i eth0 -c 10             => 카운터 10개만 보여줌
    
    # tcpdump -i eth0 tcp port 80       => tcp 80 포트로 통신하는 패킷 보여줌
    
    # tcpdump -i eth0 tcp port 80       => tcp 80 포트로 통신하는 패킷 보여줌
    
    # tcpdump -i eth0 src 192.168.0.1   => source ip 가 이것인 패킷 보여줌
    
    # tcpdump -i eth0 dst 192.168.0.1   => dest ip 가 이것인 패킷 보여줌
  • and 옵션으로 여러가지 조건의 조합 가능

    # tcpdump -i eth0 src 192.168.0.1 and tcp port 80   => source ip 가 이것이면서 tcp port 80 인 패킷 보여줌
    
    # tcpdump -i eth0 dst 192.168.0.1   => dest ip 가 이것인 패킷 보여줌
    
    # tcpdump host 192.168.0.1          => host 를 지정하면, 이 ip 로 들어오거가 나가는 양방향 패킷 모두 보여줌
    
    # tcpdump src 192.168.0.1           => host 중에서 src 가 이것인것 만 지정
    
    # tcpdump dst 192.168.0.1           => host 중에서 dst 가 이것인것 만 지정
    
    # tcpdump net 192.168.0.1/24        => CIDR 포맷으로 지정할 수 있다.
    
    # tcpdump tcp                       => TCP 인것만
    
    # tcpdump udp                       => UDP 인것만
    
    # tcpdump port 3389                 => 포트 양뱡향으로 이것인 것.
    
    # tcpdump src port 3389             => src 포트가 이것인 것.
    
    # tcpdump dst port 3389             => dst 포트가 이것인 것.
  • combine : and ( && ) , or ( || ) , not ( ! ) 으로 여러가지를 조합해서 사용 가능

    # tcpdump udp and src port 53               => UDP 이고 src 포트가 53 인 것
    
    # tcpdump src x.x.x.x and not dst port 22   => src ip 가 x.x.x.x 이고 dst 포트가 22 가 아닌 것
  • grouping : ( )

    # tcpdump 'src x.x.x.x and ( dst port 3389 or 22 )' => src ip 가 x.x.x.x 이고 ( dst 포트가 3389 또는 22 ) 인 것  ==> 여기서는 ' ' 가 반드시 있어야 한다.

iptables 임시 룰 넣고 빼기

  • 룰 넣기

    iptables -A INPUT -s 192.168.10.0/24 -p tcp --dport 3306 -j ACCEPT
    iptables -A INPUT -p tcp --dport 3306 -j DROP
  • 확인

    iptables -L --line-numbers
    Chain INPUT (policy ACCEPT)
    num  target     prot opt source               destination
    1    ACCEPT     tcp  --  192.168.10.0/24      anywhere            tcp dpt:mysql
    2    DROP       tcp  --  anywhere             anywhere            tcp dpt:mysql
  • 룰 제거

    iptables -D INPUT 2
    iptables -D INPUT 1

Linux Root 직접 로그인 권한 관리

  • /etc/ssh/sshd_config 수정

    PermitRootLogin no   #root 직접 로그인 금지
    PermitRootLogin yes  #root 직접 로그인 허용
  • sshd 재시작

    service sshd restart    #CentOS6
    systemctl restart sshd  #CentOS7

인터페이스 개별 라우팅 처리

  1. 기본 구성

    • IP

      DEV: eth0
      IP: 222.222.222.100 /24
      GW: 222.222.222.1
      
      DEV: eth1
      IP: 192.168.0.101 /24
      GW: 192.168.0.1
    • 라우팅 및 IP 확인

      # route
      Kernel IP routing table
      Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
      192.168.0.0     *               255.255.255.0   U     0      0        0 eth1
      222.222.222.0   *               255.255.255.0   U     0      0        0 eth0
      link-local      *               255.255.0.0     U     1002   0        0 eth0
      link-local      *               255.255.0.0     U     1003   0        0 eth1
      default         22.222.222.1    0.0.0.0         UG    0      0        0 eth0
      
      # ifconfig -a
      eth0      Link encap:Ethernet  HWaddr 00:1B:78:A3:3F:BE
                inet addr:222.222.222.100  Bcast:222.222.222.255  Mask:255.255.255.0
                UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                RX packets:367 errors:0 dropped:0 overruns:0 frame:0
                TX packets:211 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:1000
                RX bytes:53333 (52.0 KiB)  TX bytes:150417 (146.8 KiB)
                Interrupt:16
      eth1      Link encap:Ethernet  HWaddr 00:1B:78:A3:3F:BF
                inet addr:192.168.0.101  Bcast:192.168.0.255  Mask:255.255.255.0
                UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
                RX packets:2270 errors:0 dropped:0 overruns:0 frame:0
                TX packets:27 errors:0 dropped:0 overruns:0 carrier:0
                collisions:0 txqueuelen:1000
                RX bytes:151511 (147.9 KiB)  TX bytes:4721 (4.6 KiB)
                Interrupt:17
  2. 관련 설정 파일 수정

    • /etc/iproute2/rt_tables 수정

      #
      # reserved values
      # 아래 붉은색 부분에 web, storage 이름의 테이블을 추가한다.
      255     local
      254     main
      253     default
      0     unspec
      200 web
      201 storage
      #
      # local
      #
      #1     inr.ruhep
      Note
      web, sotrage 추가
    • 개별 라우팅을 위한 파일 추가

      # vi /etc/sysconfig/network-scripts/route-eth0
      222.222.222.0/24 dev eth0 src 222.222.222.100 table web
      default via 222.222.222.1 dev eth0 table web
      
      # vi /etc/sysconfig/network-scripts/route-eth1
      192.168.0.0/24 dev eth1 src 192.168.0.101 table storage
      default via 192.168.0.1 dev eth1 table storage
      
      # vi /etc/sysconfig/network-scripts/rule-eth0
      from 222.222.222.100 table web
      to 222.222.222.100 table web
      
      # vi /etc/sysconfig/network-scripts/rule-eth1
      from 192.168.0.0/24 table storage
      to 192.168.0.101 table storage
  3. 적용 및 확인

    • 적용

      # ip route flush cache
      # service network restart
    • 확인

      # ip route list
      192.168.0.0/24 dev eth1  proto kernel  scope link  src 192.168.0.101
      222.222.222.0/24 dev eth0  proto kernel  scope link  src 222.222.222.100
      169.254.0.0/16 dev eth0  scope link  metric 1002
      169.254.0.0/16 dev eth1  scope link  metric 1003
      default via 222.222.222.1 dev eth0
      
      # ip rule list
      0:     from all lookup local
      32762:     from all to 192.168.0.101 lookup storage
      32763:     from 192.168.0.101/24 lookup storage
      32764:     from all to 222.222.222.100 lookup web
      32765:     from 222.222.222.100 lookup web
      32766:     from all lookup main
      32767:     from all lookup default
    • 테스트

      # traceroute -s 192.168.0.101 yahoo.com
      
      # traceroute -s 222.222.222.100 yahoo.com
      Note
      위 두개의 결과를 비교하여 잘 적용 되는지 확인함
  4. Ubuntu의 경우 추가되는 ip 에 대하여 아래 명령어 입력

    ip route add default via 115.71.29.1 dev eth0 table 101
    ip route add 115.71.29.0/24 dev eth0 src 115.71.29.173 table 101
    ip rule add from 115.71.29.0/24 lookup 101
    ip rule add to 115.71.29.173 lookup 101

ssh "yes" 입력 안하게 하기

  • /etc/ssh/ssh_config 에 추가

    StrictHostKeyChecking no
  • ssh 명령의 옵션으로 사용

    ssh -o StrictHostKeyChecking=no

Ubuntu ufw (iptables) 설정

  • 기본 명령

    #- 방화벽 활성화
    sudo ufw enable
    
    #- 방화벽 비활성화
    sudo ufw disable
    
    #- 기본 룰 확인
    sudo ufw show raw
    
    방화벽 상태 확인
    #- 방화벽 재시작
    sudo service ufw restart
    
    #- 방화벽 상태 확인
    sudo ufw status
  • 설정 저장 위치

    /etc/ufw/user.rules
  • 룰 추가

    #- 19.168.50.0/24 에서 접근 허용
    sudo ufw allow from 192.168.50.0/24
    
    #- 53 포트 허용
    sudo sudo ufw allow 53
    
    #- TCP 53 포트 허용
    sudo ufw allow 53/tcp
    
    #- UDP 53 포트 허용
    sudo ufw allow 53/udp
    
    #- 53 포트 거부
    sudo ufw deny 53
    
    #- TCP 53 포트 허용
    sudo ufw deny 53/tcp
    
    #- UDP 53 포트 거부
    sudo ufw deny 53/udp
    
    #- 53 포트 설정 삭제
    sudo ufw delete 53
    
    #- ssh 허용
    sudo ufw allow ssh
    
    #- ssh 거부
    sudo ufw deny ssh
    
    #- IP 123.123.123.123 허용
    sudo ufw allow from 123.123.123.123
    
    #- IP 123.123.123.123 거부
    sudo ufw deny from 123.123.123.123

SSL/TLS 인증서 패스워드 제거

Note
nginx 등 패스워드 입력이 안되는 웹서버에서는 패스워드 제거후 사용할 수 있음
  • openssl 명령으로 패스워드 제거

    openssl rsa -in  key.pem.bak -out key.pem

expect

  • 기본 명령

    spawn <명령어>

    명령어 실행

    expect "<특정문자열>"

    if 특정 문자열이 나타나면 정도의 의미

    send "<보낼문자열>\r"

    문자열을 전송한다. \r은 엔터키를 의미

    interact

    expect를 끝내고 사용자에게 제어권을 넘김

    set 변수 [lindex $argv 0]

    0번째 명령행 인자를 변수에 지정

    send “$변수”

    변수에 저장된 문자열을 전송

    expect eof

    expect 종료

  • 구문 옵션

    -nocase

    대소문자 구별안함

  • ssh login 샘플

    #! /usr/bin/expect
    
    set timeout 20
    set ip [lindex $argv 0]
    set user [lindex $argv 1]
    set password [lindex $argv 2]
    
    spawn ssh "$user\@$ip"
    expect "Password:"
    send "$password\r";
    
    interact
  • 쉘스크립트에서 호출

    #! /usr/bin/bash
    # 원하는 bash script 작업
    
    SOME_ENV_VAR1="값"
    SOME_ENV_VAR2="값2"
    
    expect <<EOF
    # expect script 작성
    # "$SOME_ENV_VAR1", "$SOME_ENV_VAR2" 형태로 shell script의 변수 사용가능
    
    expect eof
    EOF
    
    # 이제 다시 원하는 셸 스크립트 작업

flock (스크립트 잠금)

Note
crontab에 등록한 스크립트가 일정 시간안에 종료되지 않을 경우 중복 실행 방지에 주로 사용
  • crontab에 적용 예

    * * * * * /usr/bin/flock -n /tmp/check.lock /bin/bash /root/test/check.sh
  • 주요 사용 옵션

    -n, --nb, --nonblock

    실행 중인 스크립트가 존재 하면 바로 종료

    -w, --wait, --timeout <seconds>

    지정한 시간 대기 후 실행 중인 스크립트가 존재하면 종료, 실행 중인 스크립트가 없으면 실행

    -s, --shared

    두개의 스크립트에서 락파일을 공유

    -x, --exclusiv

    앞의 -s 옵션으로 실행한 스크립트가 존재하면 대기 후 실행

표준 에러를 표준 출력으로

  • 표준 파일 디스크립터

    0 : 표준입력
    1 : 표준출력
    2 : 표준에러
  • 표준 출력을 파일에 담기

    test.sh > test.log
    test.sh 1> test.log
  • 표준 에러를 파일에 담기

    test.sh 2> test.log
  • 표준 에러를 표준 출력으로 리다이렉트

    test.sh > test.log 2>&1
    Note
    cron 등에서 에러의 주요원인을 찾고자 할경우에 사용하면 좋음
  • 표준 출력을 표준 에러로 리다이렉트

    test.sh > test.log 1>&2

쉘 명령 실행 후 리턴 코드

  • 리턴 코드 확인 테스트

    $ ls "test"
    ls: cannot access test: 그런 파일이나 디렉터리가 없습니다
    
    $ echo $?
    2
    Note
    0이 리턴 되면 정상이고 0이 아니면 오류로 간주

자동 로그 아웃 설정

  • 환경 변수에 아래를 넣으면 됨

    export TMOUT=300
    Note
    단위는 초
    /etc/profile 또는 ~/.bash_profile 에 넣어 주면 됨

RAID로 구성되었던 HDD 장치 파티션이 지워지지 않을 때

  1. fidk 에서 확인 후 삭제

  2. 쉘에서 처리

    dmsetup remove <장치경로>
  3. 계속 존재하면 서버 리부팅

chronyd (타임 동기화 데몬)

Caution
chronyd 와 ntpd 가 동시에 구동 되지 않도록 해야함.
  1. 설치 및 실행

    #- 설치
    yum install chrony
    
    #- 실행
    systemctl enable chronyd
    systemctl start chronyd
  2. 시간 동기화 필요성

    • chronyd는 NTP 서버와 시간차가 있을 경우 시계의 속도를 서서히 올리거나 내려서 맞춤
      즉, 사라지는 시간을 없게 하여 DB등 시간 정보에 민감한 어플리케이션에 영향이 없도록 함

  3. chrony의 특장점

    • 설정 및 모니터링이 간단하고 편리함

    • 대부분의 Linux 에서 기본 지원

    • 최초의 시간차가 많이 발생하여도 step 처리 및 수동 동기화 제공

    • 네트워크 상태가 좋지 않은 환경에서도 시간 동기화가 잘 되도록 설계됨

    • 네트워크 문제 발생시 마지막으로 계산된 drift 파일을 참고하여 시간 교정

  4. 국내 타임서버 풀 확인 (www.ntppool.org/zone/kr)

    server 3.kr.pool.ntp.org
    server 0.asia.pool.ntp.org
    server 3.asia.pool.ntp.org
  5. 설정 파일 (/etc/crony.conf)

    server 192.168.50.6                 # ntp 타임서버 지정 (확인된 타임서버 지정)
    
    server 0.centos.pool.ntp.org iburst # iburst 는 동기화 주기를 짧게 하여 빠른 동기화 처리
    
    makestep 1.0 3                      # 최초 3회 업데이트시에 1초 이상의 offset 발생시 step 허용
    
    driftfile /var/lib/chrony/drift     # 시스템 클럭의 오차를 저장하는 파일 지정
    
    rtcsync                             # Kernel 시간으로 RTC 업데이트
    
    allow 192.168.50.0/24               # 내부 서버에서 ntp로 접속 허용
  6. 모니터링

    • timedatectl 활용

      # timedatectl status
            Local time: 금 2020-04-03 14:16:33 KST
        Universal time: 금 2020-04-03 05:16:33 UTC
              RTC time: 금 2020-04-03 05:16:33
             Time zone: Asia/Seoul (KST, +0900)
           NTP enabled: yes
      NTP synchronized: no
       RTC in local TZ: no
            DST active: n/a
      
      # NTP synchronized: no --> yes 로 변경
      timedatectl set-ntp
    • chronyc 활용

      # chronyc tracking
      Reference ID    : 6AF7F86A (106.247.248.106)            # 시간 동기화를 위한 원격지 IP 또는 도메인
      Stratum         : 3                                     # 원격 NTP서버 까지 hop 카운트 (로컬 머신 포함)
      Ref time (UTC)  : Fri Apr 03 07:45:02 2020              # 마지막으로 동기화된 UTC 시간
      System time     : 0.000019704 seconds slow of NTP time  # NTP 서버와의 시간차
      Last offset     : +0.000066970 seconds                  # 마지막으로 상쇄한 시간
      RMS offset      : 0.000057205 seconds                   # 평균 offset 값
      Frequency       : 9.155 ppm slow                        # 시스템 시계가 잘못되는 비율
      Residual freq   : +0.003 ppm                            # 기준 소스와 주파수 차이
      Skew            : 0.040 ppm                             # 주파수에 대한 추정 오차
      Root delay      : 0.005193877 seconds                   # 네트워크의 경로지연
      Root dispersion : 0.015543302 seconds
      Update interval : 1028.3 seconds                        # 마지막으로 업데이트한 두 클럭의 간격
      Leap status     : Normal
      
      # PPM (parts per million): 1PPM = 0.000001초
      
      
      # chronyc sources
      210 Number of sources = 4
      MS Name/IP address         Stratum Poll Reach LastRx Last sample
      ===============================================================================
      ^- dadns.cdnetworks.co.kr        2   9   177   499   -448us[ -448us] +/-   54ms
      ^+ send.mx.cdnetworks.com        2  10   377   217   -523us[ -523us] +/-   75ms
      ^* 106.247.248.106               2  10   377   556   -214us[ -147us] +/-   46ms
      ^+ ec2-54-180-134-81.ap-nor>     2  10   377   512   -130us[ -130us] +/-   41ms
      
      # M (소스의 종류)
        ^: 서버
        =: 피어
        #: 로컬
      
      # S (소스의 상태)
        *: 현재사용
        +: 사용 중인 서버와 결합
        -: 사용 중인 서버와 결합 하지 않음
        ?: 연결 불능
        x: 연결 불가
  7. 즉시 동기화 방법

    chronyc -a makestep

FD (File Descriptor) 파일 오픈 개수 설정

  • 시스템 전체 파일 오픈 개수 확인

    # cat /proc/sys/fs/file-nr
    1344    0   1607926
    
    # sysctl -a | grep fs.file-
    fs.file-max = 1607926
    fs.file-nr = 1312   0   1607926
  • 시스템 커널 파라 미터 수정하여 변경

    #- 바로 적용
    sysctm -w fs.file-max = 2048000
    
    #- 확인
    # vi /etc/sysctl.conf
    fs.file-max = 2048000
    
    #- 적용
    # sysctl -p
  • 계정별 파일 오픈 개수 확인

    # ulimit -a     # 모든 제한 사항 확인 (soft)
    # ulimit -aH    # 모든 제한 사항 확인 (hard)
    # ulimit -n
    Note
    이 값은 최대 값은 fs.nr_open 값에 의존
  • 계정별 파일 오픈 개수 변경

    #- 현재 로그인 계정에 대하여 변경
    ulimit -n 2048
    
    # 영구적 변경
    # vi /etc/security/limits.conf
    <username> soft nofile 2048
    <username> hard nofile 2048
  • 열린 파일 개수 확인

    lsof -u <UID> | wc -l
  • ulimit 사용 (프로세스의 자원 리미트 확인 및 설정 명령)

    soft: 새로은 프로세스를 생성하면 할당되는 한도
    hard: soft 한도에서 최대로 늘릴 수 있는 한도
    
    #- 주요 옵션
    -a  : 모든 리미트 확인
    -aH : 모든 하드 리미트 확인
    -n  : 최대 오픈 파일
    -u  : 해당 유저의 최대 프로세스 수

ethtool 을 이용하여 speed / duples / autoneg 설정

  • NIC 확인

    # ifconfig -a
    enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.100.71  netmask 255.255.255.0  broadcast 192.168.100.255
            inet6 fe80::a00:27ff:fe10:c375  prefixlen 64  scopeid 0x20<link>
            ether 08:00:27:10:c3:75  txqueuelen 1000  (Ethernet)
            RX packets 138  bytes 14740 (14.3 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 84  bytes 11060 (10.8 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  • ethtool 명령으로 현재 설정 상태 확인

    # ethtool enp0s3
    Settings for enp0s3:
        Supported ports: [ TP ]
        Supported link modes:   10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Full
        Supported pause frame use: No
        Supports auto-negotiation: Yes
        Supported FEC modes: Not reported
        Advertised link modes:  10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Full
        Advertised pause frame use: No
        Advertised auto-negotiation: Yes
        Advertised FEC modes: Not reported
        Speed: 1000Mb/s
        Duplex: Full
        Port: Twisted Pair
        PHYAD: 0
        Transceiver: internal
        Auto-negotiation: on
        MDI-X: off (auto)
        Supports Wake-on: umbg
        Wake-on: d
        Current message level: 0x00000007 (7)
                       drv probe link
        Link detected: yes
  • ethtool -s 명령으로 설정 변경

    #- 명령 형식
    sudo ethtool –s [device_name] speed [10/100/1000] duplex [half/full] autoneg [on/off]
    
    #- 설정 예
    sudo ethtool –s enp0s3 speed 1000 duplex full autoneg on
  • ETHTOOL_OPT 변수를 사용하여 리부팅 후에도 적용되도록 영구 설정

    #- 파일 편집
    vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
    
    #- 설정 형식
    ETHTOOL_OPTS="speed [100|1000|10000] duplex [half|full] autoneg [on|off]”
    
    #- 설정 예
    ETHTOOL_OPTS="speed 1000 duplex full autoneg on”

TCP Segmentation Offload (TSO)

  • TCP는 전송시 패킷을 분할(Segmentation)하는데, 이작업을 CPU가 아닌 NIC가 수행 하도록 설정 하는 것인 TSO (기본값 On)

  • 10G NIC에서는 이슈가 많이 발생하여 TSO를 OFF 하는 것이 좋음

    • TCP 패킷 유실 및 지연

    • TCP 연결 종료

    • Load Average 비정상적인 증가

  • 설정 확인 및 변경

    #- 설정 확인
    # ethtool -k <NIC Name>
    # ethtool -k eth0                           # ex
    tcp-segmentation-offload: on
        tx-tcp-segmentation: on
        tx-tcp-ecn-segmentation: off [fixed]
        tx-tcp6-segmentation: on
        tx-tcp-mangleid-segmentation: off
    
    #- 설정 변경
    # ethtool -K <NIC Name> tso off
    # ethtool -K eth0 tso off gso off gro off   # ex
    
    #- 리부팅시에도 적용 처리 (/etc/sysconfig/network-script/ifcfg-enp0s3 에 아래 라인 추가)
    ETHTOOL_OPTS="--offload enp0s3 tso off gso off gro off"
    Note
    변경 후 CPU 부하는 우려할 수준은 아니라고 함
  • 영구 설정 (리부팅 후에 자동 적용)

    vi /etc/sysconfig/network-script/ifcfg-enp0s3
    ETHTOOL_OPTS="--offload enp0s3 tso off gso off gro off"         # 추가
  • 참조 사이트

    http://sandilands.info/sgordon/segmentation-offloading-with-wireshark-and-ethtool
    http://www.linuxfoundation.org/collaborate/workgroups/networking/tso
    http://www.packetinside.com/2013/02/mtu-1500.html
    https://ston.readthedocs.io/ko/latest/admin/adv_topics.html

CentOS7 에서 rc.local 동작하게 하기

  • rc.local 파일에 실행 권한 할당

    chmod +x /etc/rc.d/rc.local
  • /usr/lib/systemd/system/rc-local.service 파일 수정

    [Unit]
    Description=/etc/rc.d/rc.local Compatibility
    ConditionFileIsExecutable=/etc/rc.d/rc.local
    After=multi-user.target   # 변경전  After=network.target
    
    [Service]
    Type=forking
    ExecStart=/etc/rc.d/rc.local start
    TimeoutSec=0
    RemainAfterExit=yes
    
    [Install]                       # 추가
    WantedBy=multi-user.target      #
  • systemctl reload

    systemctl enable rc-local.service
    systemctl start rc-local.service
    systemctl daemon-reload
  • 실행 하기

    systemctl start rc-local
  • 재부팅 하면 부팅시에 실행하게 됨

nmap 으로 열린 포트 확인

  • 로컬 서버의 열린포트 확인

    #-- UDP Scan
    # nmap 192.168.100.71 -sU
    
    Starting Nmap 6.40 ( http://nmap.org ) at 2020-06-04 11:32 KST
    Nmap scan report for test.test.co.kr (192.168.0.71)
    Host is up (0.0000080s latency).
    Not shown: 998 closed ports
    PORT     STATE         SERVICE
    111/udp  open          rpcbind
    1023/udp open|filtered unknown
    
    Nmap done: 1 IP address (1 host up) scanned in 1.25 seconds
    
    #-- TCP Scan
    # nmap 192.168.100.71 -sT
    
    Starting Nmap 6.40 ( http://nmap.org ) at 2020-06-04 11:33 KST
    Nmap scan report for test.test.co.kr (192.168.0.71)
    Host is up (0.0014s latency).
    Not shown: 994 closed ports
    PORT    STATE SERVICE
    21/tcp  open  ftp
    22/tcp  open  ssh
    111/tcp open  rpcbind
    443/tcp open  https
    548/tcp open  afp
    873/tcp open  rsync
    
    Nmap done: 1 IP address (1 host up) scanned in 0.07 seconds
  • IP별 열린 포트 스캔

    #- 특정 IP에 대하여 포트스캔
    nmap -v -A 192.168.100.71
    
    #- 특정 네트워크에 살아 있는 서버 확인
    nmap -v -sn 192.168.0.0/16

nohup, & 사용

  • nohup

    • 쉘스크립트파일(.sh)을 데몬 형태로 실행 시키도록 해주는 프로그램

    • 터미널 세션이 끊겨도 실행을 멈추지 않음

  • &

    • 프로세스를 백그라운드로 실행

  • 실행예시

    nohup test.sh &
    Note
    이렇게 실행하면 nohup.out 파일이 생성되고 표준 출력이 담김
  • nohup, & 차이

    • nohup 이 아닐 경우 터미널 세션이 끊어지면 프로세스도 종료 되지만,
      요즘은 & 만으로도 nohup 과 같이 동작을 함
      하지만 명시적으로 실행하는 것이 안전할 것으로 생각됨

  • nohup.out 안 남기게 하기

    nohup test.sh /dev/null 2>&1 &
    Note
    표준 에러를 표준 출력을 바꿔서 /dev/null 보내게 됨
  • nohup.out 파일을 변경하여 남기기

    nohup test.sh /temp/test_nohup.log 2>&1 &

로케일(locale) 설정

  • localectl (CentOS 7 이상 지원)

    #- 로케일 확인
    # localectl
       System Locale: LANG=ko_KR.UTF-8
           VC Keymap: kr
          X11 Layout: kr
    
    #- 설정 가능한 로케일 확인
    # localectl list-locales | grep ko
    ko_KR
    ko_KR.euckr
    ko_KR.utf8
    kok_IN
    kok_IN.utf8
    korean
    korean.euc
    ru_RU.koi8r
    ru_UA.koi8u
    tg_TJ.koi8t
    uk_UA.koi8u
    
    #- 로케일 설정
    # localectl set-locales "LANG=ko_KR.UTF-8"
  • locale

    #- 설정된 로케일 확인
    # locale
    LANG=ko_KR.UTF-8
    LC_CTYPE="ko_KR.UTF-8"
    LC_NUMERIC="ko_KR.UTF-8"
    LC_TIME="ko_KR.UTF-8"
    LC_COLLATE="ko_KR.UTF-8"
    LC_MONETARY="ko_KR.UTF-8"
    LC_MESSAGES="ko_KR.UTF-8"
    LC_PAPER="ko_KR.UTF-8"
    LC_NAME="ko_KR.UTF-8"
    LC_ADDRESS="ko_KR.UTF-8"
    LC_TELEPHONE="ko_KR.UTF-8"
    LC_MEASUREMENT="ko_KR.UTF-8"
    LC_IDENTIFICATION="ko_KR.UTF-8"
    LC_ALL=
    
    #- 설정 가능한 로케일 확인
    # locale -a | grep ko
    ko_KR
    ko_KR.euckr
    ko_KR.utf8
    kok_IN
    kok_IN.utf8
    korean
    korean.euc
    ru_RU.koi8r
    ru_UA.koi8u
    tg_TJ.koi8t
    uk_UA.koi8u
  • 로케일 설정 파일

    #- CentOS7
    /etc/locale.conf
    
    #- CentOS6
    /etc/sysconfig/i18n

쉘스크립트 if 조건문 종류

  • 비교식

    [ -z ${A} ] : A 문자열의 길이가 0이면 TRUE
    [ -n ${A} ] : A 문자열의 길이가 0이 아니면 TRUE
    [ ${A} -eq ${B} ] : A와 B값이 같으면 TRUE
    [ ${A} -ne ${B} ] : A와 B값이 다르면 TRUE
    [ ${A} -gt ${B} ] : A가 B보다 크면 TRUE
    [ ${A} -ge ${B} ] : A가 B보다 크거나 같으면 TRUE
    [ ${A} -lt ${B} ] : A가 B보다 작으면 TRUE
    [ ${A} -le ${B} ] : A가 B보다 작거나 같으면 TRUE
    
    [ 조건식A -a 조건식B ] : 조건식 A와 B가 모두 TRUE이면 TRUE (&& 와 동일)
    [ 조건식A -o 조건식B ] : 조건식 A가 TRUE거나 조건식B가 TRUE면 TRUE (|| 와 동일)
  • 파일관련

    [ -d ${A} ] : A 파일이 디렉토리면 TRUE
    [ -e ${A} ] : A 파일이(노드, 디렉토리, 소켓 등등 모두) 존재하면 TRUE
    [ -L ${A} ] : A 파일이 심볼릭 링크면 TRUE
    [ -r ${A} ] : A 파일이 읽기 가능하면 TRUE
    [ -s ${A} ] : A 파일의 크기가 0 보다 크면 TRUE
    [ -w ${A} ] : A 파일이 쓰기 가능하면 TRUE
    [ -x ${A} ] : A 파일이 실행 가능하면 TRUE
    [ -c ${A} ] : A 파일이 Special character file 이면 TRUE
    [ -f ${A} ] : A 파일이 디렉토리가 아닌 일반 regular 파일이면 TRUE
    [ -S ${A} ] : A 파일이 소켓이면 TRUE
    [ ${A} -nt ${B} ] : A 파일 B 파일보다 최신파일이면 참
    [ ${A} -ot ${B} ]  : A 파일이 B 파일보다 이전파일이면 참
    [ ${A} -ef ${B} ] : A 파일과 B 파일이 같은 파일이면 참

쉘스크립트 if 조건문에서 대괄호(bracket) 사용

Note
if 조건문에서 [ 조건식] [[ 조건식]] 차이
  • 대괄호 한개

    NUM=1
    
    if [ ${NUM} -eq 1 ]
    then
        echo "1"
    fi
  • 대괄호 두개

    NUM=1
    
    if [ ${NUM} -eq 1 ]
    then
        echo "1"
    fi
  • 차이점

    • 결과는 동일

    • 대괄호 하나는 별도의 프로세스를 실행

    • 대골호 두개는 Bash에 내장된 기능 사용

    • 반복이 많은 작업의 경우 두개를 사용하면 효율성이 좋다고 함

    • 대괄호 두개를 쓰면 대괄호에 의해 가독성을 높여줌

      NUM=1
      NAME="jun"
      
      #- 대괄호 한개
      if [ $NUM -eq 1 -a $NAME = "jun" ]
      then
          echo "$NUM: $NAME"
      fi
      
      #- 대괄호 두개
      if [[ $NUM -eq 1 ]] && [[ $NAME = "jun" ]]
      then
          echo "$NUM: $NAME"
      fi

다른 Linux 시스템 SSH 접속시 화면이 멈추는 증상

  • 증상 (아래와 같은 메시지 발생하면서 화면이 멈춤)

    packet_write_wait: Connection to x.x.x.x port 22: Broken pipe
  • 아무런 데이터가 오고가지 않은 휴지 상태가 되었을 때 발생 하는 것으로 보임

  • 해결 (서버 또는 클라이언트 둘중 하나만 설정 하면 됨)

    • 서버쪽 설정

      파일: /etc/ssh/sshd_config
      ClientAliveInterval 30
      ClientAliveCountMax 30
    • 클라이언트 설정

      파일: /etc/ssh/ssh_config  or ~/.ssh/config
      Host *
        ServerAliveInterval 30
        ServerAliveCountMax 30

FTP 로그인가 put 을 다른 서버로 구성 테스트 방법

  • Proftpd 설정

    AllowForeignAddress on
  • 로그인 할 서버에서 에서 작업

    # telnet 192.168.1.1 2002
    Trying 192.168.1.1...
    Connected to 192.168.1.1.
    Escape character is '^]'.
    220 ProFTPD 1.2.10rc1 Server (ProFTPD Default Installation) [test]
    USER <id>
    331 Password required for a0.
    PASS <password>
    230 User a0 logged in.
    PASV
    227 Entering Passive Mode (192,168,1,1,240,63).
    STOR <filename>
    150 Opening ASCII mode data connection for tttt
    226 Transfer complete.
    Note
    python 으로 만든 put 업스트림 실행 완료 후 226 Transfer complete. 메시지 발생
  • put 업스트림할 서버 에서 작업

    #! /bin/python
    
    import socket
    
    sock = socket.socket()
    sock.connect(("192.168.1.1", 61503))
    
    with open("testfile.txt", "rb") as fd:
           buf = fd.read(1024)
           while (buf):
               sock.send(buf)
               buf = fd.read(1024)
    sock.close()
    Note
    TCP 포트 번호 확인 수정/저장 후 실행

로그 파일의 내용만 지우기

  • cat 으로 NULL을 보냄

    /bin/cat /dev/null > <filename>

logrotate

  • 파일 및 디렉토리 구성

    /sbin/logrotate         # 실행 파일
    /etc/logrotate.conf     # 설정 파일
    /etc/logrotate.d        # 각 패키지별 설정 파일을 위한 디렉토리
                            # (logrotate.conf 에서 지정되어 있음 "include /etc/logrotate.d")
  • cron에 적용 여부 확인

    # ls -l /etc/cron.daily/logrotate
    -rwx------. 1 root root 219 10월 31  2018 /etc/cron.daily/logrotate
  • docker 에 적용한 예

    # pwd
    /etc/logrotate.d
    
    # cat docker
    /var/lib/docker/containers/*/*.log {
      rotate 31
      daily
      notifempty
      missingok
      copytruncate
      dateext
    }
  • 수동으로 실행 테스트

    logrotate -fv /etc/logrotate.d/docker
  • 옵션들의 의미

rotate <숫자>

로그 파일의 개수가 <숫자> 이상 되면 삭제

maxage <숫자>

로그 파일이 <숫자>일 이상 되면 삭제

daily|weekly|monthly

로테이트 단위

notifempty

로그 내용이 없으면 로테이트 하지 않음

ifempty

로그 내용이 없어도 로테이트 함

missingok

로그 파일이 없어도 에러처리 하지 않음

compress

로테이트 되는 로그파일을 gzip으로 압축

compress|nocompress

로테이트 되는 로그파일을 압축(gzip) 여부 설정

copytruncate

이전 로그파일을 복사 후 원본 파일의 크기를 0으로 만듬 (일부 로깅 파일의 손실 발생할 수 있음)

dateext

로테이트 되는 파일 이름에 날짜가 들어가도록 함 (이 옵션을 주지 않으면 로테이트 파일명에 숫자를 붙여서 구분하게 됨)

Promiscuous Mode 설정

  • ip 명령으로 설정

    ip link set dev enp0s3 promisc on
  • ifconfig 명령으로 설정

    #- 설정
    ifconfig enp0s3 promisc
    
    #- 해제
    ifconfig enp0s3 -promisc

SSL(TLS) 엑세스 확인

  • openssl 명령으로 확인

    openssl s_client -connect m.naver.com:443 -ssl3
    
    openssl s_client -connect m.naver.com:443 -tls1_1
    
    openssl s_client -connect m.naver.com:443 -tls1_2

snmpwalk 활용

  • 사용 형식

    snmpwalk -v 2c -c <community> <IP> <MIB>

Ubuntu 버전 확인

  • /etc/issue 확인

    $ cat /etc/issue
    Ubuntu 20.04.1 LTS \n \l
  • lsb_release 명령 활용

    $ lsb_release -a
    No LSB modules are available.
    Distributor ID: Ubuntu
    Description:    Ubuntu 20.04.1 LTS
    Release:    20.04
    Codename:   focal

Ubuntu sudo 패스워드 묻지 않도록 처리

  • /etc/sudoers 파일 수정

    $ sudo vi /etc/sudoers
    
    #- 추가할 내용 (service 에 적용)
    %sudo ALL=NOPASSWD: /usr/sbin/service

rpmrebuild 이용하여 설치된 패키지를 RPM 파일로 추출

  • 설치

    yum install rpmrebuild
  • 패키지 네임 확인

    rpm -qa | grep <package_name>
  • 패키지 추출

    rpmrebuild <package_name>
  • 추출 RPM 파일 저장 위치

    /root/rpmbuild/RPMS/x86_64

'리눅스 (Linux)' 카테고리의 다른 글

vim(vi) 즐겨 사용하는 설정  (0) 2021.03.23
Netatalk 리눅스에서 AFP 서버 구성  (0) 2021.03.18
CentOS의 firewalld 관리  (0) 2021.03.14