Skip to main content

33 posts tagged with "linux"

View All Tags

쿠버네티스 리눅스 커널 튜닝하기

· 2 min read

변경가능한 커널 설정​

노드 레벨의 sysctl과 네임스페이스 sysctl과 같은 커널 파라미터를 sysctl 인터페이스로 변경할 수 있다. 변경 가능한 파라미터는 다음과 같다.

  • abi: 실행 도메인 특성
  • fs: 특정 파일 시스템, 파일 핸들링, inode, dentry, 쿼터 조정
  • kernel: 전역 커널 설정 변경
  • net: 네트워킹
  • sunrpc: SUN rpc 호출
  • vm: 메모리 조정, 버퍼 및 캐시 관리
  • user: 사용자별 네임스페이스 제한

taint, toleration 을 같이 사용해 사이드이펙을 방지하라고 권하고 있다.

ARP 캐시​

neighbor: arp_cache: neighbor table overflow!

쿠버네티스가 대량의 IP를 소비하면서 ARP 캐시 공간을 모두 사용할 경우 ARP 캐시 관련 변수 조절이 가능하다. 대규모 HPC 클러스터에서는 흔한 일이며 쿠버네티스의 주소 소진을 방지할 수 있다. 이 오류는 nodes with 40+ cores && more than 16 segments in each node 정도에서 발생하는 듯 하다.

  • net.ipv4.neigh.default.gc_thresh1: gc_thresh1 represents the minimum number of entries that may be in the ARP cache. Garbage collection will not be triggered if the number of entries is below this setting.
  • net.ipv4.neigh.default.gc_thresh2: gc_thresh2 represents the soft maximum number of entries that may be in the ARP cache. This setting is arguably the most important, as ARP garbage collection will be triggered ~5s after reaching this soft maximum.
  • net.ipv4.neigh.default.gc_thresh3: gc_thresh3 represents the hard maximum number of entries in the ARP cache.
net.ipv4.neigh.default.gc_thresh1 = 80000
net.ipv4.neigh.default.gc_thresh2 = 90000
net.ipv4.neigh.default.gc_thresh3 = 100000

예시​

apiVersion: v1
kind: Pod
metadata:
name: sysctl-example
spec:
securityContext:
sysctls:
- name: kernel.shm_rmid_forced
value: "0"
- name: net.core.somaxconn
value: "10000"
- name: kernel.msgmax
value: "65536"
- name: fs.file-max
value: "2097152"
- name: net.ipv4.ip_local_port_range
value: "1024 65536"

여담​

  • 파면 팔수록 리눅스부터 다시 정리해야되겠다는 느낌이 든다.

참조​

Pi-hole과 라즈베리파이로 모든 광고 차단하기

· 3 min read

앞서​

유튜브 광고가 많아졌다. 명색이 프로그래머인데 AdGuard를 정액제로 사용하고 싶지 않았다. 이 문서엔 없지만 피캡을 구현해보고 싶었다.

기기 구매​

라즈베리파이3 B+ 스타터킷을 구매한다. 아래 재료가 있을 경우 빼고 구매해도 된다.

  • SD 카드 리더기
  • 5핀 충전기
  • 라즈베리파이용 방열판
  • 라즈베리파이 케이스

환경설정​

포맷​

SD 카드를 비워주기위해 파워쉘이나 CMD를 관리자 모드로 접근한다.

PS > diskpart

DISKPART > list disk
DISKPART > select disk ${SD_CARD_DRIVE_NUMBER}

DISKPART > clean

라즈비안​

운영체제인 Raspbian Stretch Lite 버전을 다운로드한다. 데비안 기반이다.

etcher​

컴퓨터에 SD 카드용 이미지 굽는 프로그램을 설치한다.

다운로드된 라즈비안과 etcher로 이미지를 굽는다. 직관적이라 1, 2, 3 선택하듯이 설치하면 된다. 도중에 깨질 경우 다시 포맷한다.

ssh 접근​

이미지 설치 후 다시 USB 를 인식시키면 Boot drive 가 보이는데 접근 후 루트에 ssh 란 이름의 터치파일을 만들어준다.

touch ssh

이 파일이 있어야 ssh 접근이 가능하다. 공유기에 꼽고 내부아이피 확인하자.

## ssh 접근
$ ssh pi@YOUR_RASPBERRY_INTERAL_IP

## 초기 비밀번호는 raspberry 이다.

패키지 설치​

부팅 후 apt-get 을 사용할 시간이다.

sudo apt-get upgrade -y && sudo apt-get update

vim​

vim 도 없다.

sudo apt-get install vim

oh-my-zsh​

sudo apt-get install zsh
chsh -s $(which zsh)
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

agnoster theme, zsh-syntax-highlighting, zsh-autosuggestion 세팅해주자.

pi-hole​

이제 파이홀을 설치할 수 있다.

라즈베리파이를 유선연결했으니 eth0 인터페이스만 잘 체크해주면, 나머진 기본옵션으로 다음 다음만 해주면 된다.

$ sudo curl -sSL https://install.pi-hole.net | bash

## 비밀번호 변경
$ sudo pihole -a -p

dns-encrypt​

이왕 DSN 가로채는 거 암호화도 해주자. 매뉴얼 내용을 정리했다.

$ cd /opt

## 설치
$ sudo wget https://github.com/jedisct1/dnscrypt-proxy/releases/download/2.0.22/dnscrypt-proxy-linux_arm-2.0.22.tar.gz

## 폴더 생성
$ sudo tar -xf dnscrypt-proxy-linux_arm-2.0.22.tar.gz
$ sudo mv linux-arm dnscrypt-proxy && cd dnscrypt-proxy

## 기본 설정 복사
$ sudo cp example-dnscrypt-proxy.toml dnscrypt-proxy.toml

## 설정 변경
$ sudo vi dnscrypt-proxy.toml

## 이 세 옵션을 찾아서 변경해준다.
server_names = ['dnscrypt.nl-ns0']
## 기본 53번 포트는 pi-hole에서 쓰고 있다.
listen_address = ['127.0.0.1:54', '[::1]:54']
require_dnssec = true

## 서비스 등록
$ sudo ./dnscrypt-proxy -service install

## 시작
$ sudo ./dnscrypt-proxy -service start

dnscrypt.nl-ns0 Public DNSCrypt 서버이다. 다른 서버는 여기를 참조하자. 일본이나 싱가폴 쪽에 있으면 좋을텐데 아쉽다.

Upstream DNS 변경​

관리자 화면의 Settings > DNS > Upstream DNS Servers 탭에서 '127.0.0.1:54', '[::1]:54'를 넣어주고 저장한다.

Primary DNS Address 변경​

공유기 설정에 들어가서 라즈베리파이 내부 아이피를 기본 DNS 주소로 설정한다. IPTIME 의 경우 고급 설정 > 네트워크 관리 > 인터넷 설정 정보 에 있다.

BlockLists​

Settings > Blocklists 에서 추가하고 Save and Update 하면 차단할 주소가 추가된다. 아래는 참고할만한 링크다.

확인​

Cloudflare Browsing Experience Security Check서 체크하자.

DNSSEC, TLS1.3에 초록불 들어오면 된다. 그리고 유튜브를 쾌적하게 즐기자.

여담​

  • Query Log 메뉴에서 어느 도메인을 확인하려는지 알 수 있다.
  • Instagram 광고 차단 필터를 찾아봐야겠다.
  • 정작 내 블로그엔 애드센스 달려있는데..
  • 세팅비 2만원 받아도 되지않을까? 😄

vi 에디터 단축키 마스터하기

· 2 min read

viemu 의 단축키 리스트가 있지만, 손에 익기 전엔 사용하기가 힘들다.

image from hexo

a, i, 저장, 나가기 이런 기초적인 건 제외하고 vi 에디터에서 더 빠른 작업을 위한 명령어들을 다시 알아보자.

이동​

키커서
l 또는 →오른쪽 한 문자
h 또는 ←왼쪽 한 문자
j 또는 ↓한 줄 아래로
k 또는 ↑한 줄 위로
0현재 줄 처음으로
^현재 줄 첫 번째 공백 아닌 글자로
$현재 줄 마지막으로
W다음 단어나 마침표 기호 처음으로
shift + W다음 단어 처음으로 (마침표 무시)
B이전 단어나 마침표 기호 처음으로
shift + B이전 단어 처음으로 (마침표 무시)
ctrl + F 또는 PageDown한 페이지 아래로
ctrl + B 또는 PageUp한 페이지 위로
number + shift + G (1G)해당 줄로
shift + G파일의 마지막 줄로

L, H, J, K 가 문자 이동에 사용되는 이유는, 방향키까지 손가락을 움직이기엔 너무 멀기 때문이다.

편집​

빈줄 추가​

키커서
o현재 줄 아래에 빈 줄 추가
shift + O현재 줄 위에 빈 줄 추가

삭제 및 자르기​

d 명령어는 삭제한 텍스트를 버퍼에 보관한다.

키커서
x현재 문자
3x현재 문자를 포함한 다음 2개 문자
dd현재 줄
4dd현재 줄을 포함한 다음 4줄
dW현재 커서부터 다음 단어 앞까지
d $현재 커서부터 현재 줄 끝까지
d0현재 커서부터 현재 줄 맨 앞까지
d^현재 커서부터 그 줄의 공백아닌 첫 글자까지
dG현재 줄부터 파일 끝까지
d10G현재 줄부터 다음 10번째 줄까지

복사​

키커서
yy현재 줄
4yy현재 줄을 포함한 다음 3줄
yW현재 커서부터 다음 단어 앞까지
y $현재 커서부터 현재 줄 끝까지
y0현재 커서부터 현재 줄 맨 앞까지
y^현재 커서부터 그 줄 공백아닌 첫 글자까지
yG현재 줄부터 파일 끝까지
y10G현재 줄부터 다음 10번째 줄까지

붙혀넣기​

p

치환​

:%s/Search/Replace/gc
  • %: 파일 열 전체 (1,$ 라면 1번 줄부터 파일 끝까지)
  • s: search and replace
  • /Search/Replace/: Search 를 Replace 문자열로 치환
  • g: global
  • c: confirm 실행

치환 확인 명령​

키작업
y치환 실행
n건너뛰기
a전체 치환
q종료
l이번만 치환하고 종료
ctrl + E스크롤 위로 이동
ctrl + Y스크롤 아래로 이동

IaaS, PaaS, SaaS 란?

· One min read

IaaS, PaaS, Sass​

아이아스, 파스, 싸스 언제 들어도 헷갈리는 단어 3종 세트를 쉽게 파헤쳐보자.

다이어그램​

image from hexo 출처: 5 tips if you are considering cloud-based BI

이 그림이 모든 걸 나타내준다. 아이아스는 DevOps(또는 운영자), 파스는 개발자, 싸스는 엔드유저(또는 사용자) 용이다.

IaaS​

  • Infrastructure as a Service
  • 사용할 준비가 된 컴퓨터 및 네트워크 하드웨어
  • 클라우드에서 리눅스 서버를 받는 것

PaaS​

  • Platform as a Service
  • 제공된 프레임워크 또는 스택에서 실행되는 소프트웨어
  • 구글 앱엔진, 아마존 엘라스틱 빈스톡 등

SaaS​

  • Software as a Service
  • 웹사이트로 제공되는 응용프로그램
  • CMS 등
  • 나이스해 보이고 싶어서 끼워 맞춘 용어

nginx에 letsencrypt 인증서로 https 가장 빨리 적용하기

· One min read

centos7 기준

nginx 설치​

$ vi /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

$ yum makecache
$ yum install -y nginx

$ vi /etc/nginx/conf.d/default.conf
## server_name에 도메인 연결

## 문법 체크
$ nginx -t

## nginx 시작
$ systemctl enable nginx
$ systemctl start nginx

certbot 설치​

$ yum install -y epel-release
$ yum install -y certbot-nginx

## 인증
$ certbot --nginx -d my.domain.com

ssl nginx 설정​

기존 포스트 nginx 연동 탭 참조

renew 설정​

$ crontab -e

1 0 1 * * certbot renew --nginx

$ systemctl restart crond

systemctl restart nginx 하면 완료

Linux startup 파일에서 피해야할 것

· One min read

스타트업 파일은 사용자가 로그인 할 때 시스템이 어떻게 반응해야 하는지를 결정한다. 스타트업 파일 수정시에 다음 사항들을 꼭 피해야한다.

주의​

  • 셸 스타트업 파일에 그래픽 명령을 넣지 않는다.
  • 셸 스타트업 파일에 DISPLAY 환경 변수를 설정하지 않는다.
  • 셸 스타트업 파일에 터미널 유형을 설정하지 않는다.
  • 스타트업 파일에서 표준 출력으로 인쇄하는 명령을 실행하지 않는다.
  • 셸 스타트업 파일에 LD_LIBRARY_PATH를 결코 설정하지 않는다.

LD_LIBRARY_PATH 변수 조작시 런타임 링커가 모든 프로그램에 대해 이 디렉터리들을 찾기 때문에 충돌을 일으킬 수 있고, 라이브러리의 조합이 틀어질 수 있기 때문이다.

추가적으로 디폴트 스타트업 파일에 상세한 주석을 충분히 첨부한다.

Top 명령어 단축키

· One min read

top 명령어는 자주 치는 명령어지만 예쁘게 소팅하기란 쉽지 않다.

단축키​

단축키내용
spacebar화면 즉시 업데이트
M현재 상주 메모리 사용량에 따라 분류
T전체 누적 CPU 사용량에 따라 분류
P현재 CPU 사용량(디폴트 값)에 따라 분류
c프로세스 경로 표시
u오로지 한 사용자의 프로세스만 보여줌
f다른 종류의 통계 자료가 나타나도록 선택
?모든 top 명령에 대한 사용법의 개요를 보여준다.

/etc/passwd 파일 구조

· One min read

구조​

로그인명:비빌번호:사용자 ID:그룹 ID:실제 유저명:홈 디렉토리:쉘

  • 예시: root❌0:0:superuser:/root:/bin/bash
  • 주석이나 공백은 허용되지 않는다.

비밀번호 필드​

  • x 표시: 암호화된 비밀번호가 /etc/shadow 파일에 저장되어 있다는 것
  • * 표시: 로그인할 수 없는 사용자
  • 공백: 로그인시 비밀번호가 필요 없음

비밀번호 변경​

  • passwd 명령어는 누구나 알지만
  • vipw 로 /etc/passwd 파일을 통째로 편집 가능

SSHD 보안 - fail2ban, port 변경

· One min read

실패한 로그인 IP 확인​

$ cat /var/log/secure | grep 'sshd.*Failed' | grep -Po "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | sort | uniq -c

## 실패 카운트와 IP
6 100.34.214.24
6 101.109.152.219
6 101.164.141.36

기본 포트를 사용 중이라면 어마어마한 IP 목록이 나올 것이다.

SSH 포트 변경​

SSH 설정 변경​

/etc/ssh/sshd_config 에 포트 설정을 변경한다.

/etc/ssh/sshd_config
Port 2020

SElinux 포트 추가​

semanage port -a -t ssh_port_t -p tcp 2020

방화벽 포트 추가​

firewall-cmd --permanent --zone=public --add-port=2020/tcp
firewall-cmd --reload

SSH 재시작​

systemctl restart sshd

Fail2ban​

일정 시도 이상을 실패하면 해당 IP 를 차단시키는 Fail2ban 을 설치하자

설치​

## repo가 없다면
## $ yum install -y epel-release

$ yum install -y fail2ban

SSH 설정 추가​

/etc/fail2ban/jail.local 또는 jail.conf 를 열어 [sshd] 의 enabled 속성을 true 로 변경한다.

서비스 시작​

systemctl enable fail2ban
systemctl start fail2ban

더 쉬운 방법​

쉘스크립트로 포트변경, 방화벽 룰 추가, Fail2ban 까지 한 방에 끝내버리자.

wget https://raw.githubusercontent.com/FunctionClub/Fail2ban/master/fail2ban.sh && bash fail2ban.sh 2>&1 | tee fail2ban.log

명령문에 따라 입력만 해주면 된다. 자세한 설명은 FunctionClub/Fail2ban 참고하자.

Cannot start container iptables failed

· One min read

오류​

Container를 다시 올릴 때 다음과 같은 오류로 올라가지 않는 경우가 있다. docker kill이 아닌 stop, rm으로 container를 지웠을 때 뭔가 충돌이 나는 것 같다.

Error response from daemon: Cannot start container aca936f2822fce32235e627ff539c58b74b2f4e66cfa701de47ce609e2590d13: iptables failed: iptables -t nat -A DOCKER -p tcp -d 0/0 --dport 50000 -j DNAT --to-destination 172.17.0.10:50000 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1)

해결​

이 중 마음에 드는 방법으로 해결하면 된다.

서비스 restart​

docker 서비스를 restart 한다.

iptables rule 추가​

오류 메세지에 필요한 rule을 추가한다.

iptables -t filter -N DOCKER
iptables -t nat -N DOCKER