반응형

나는 페이스북, 인스타그램 등 SNS를 안 하고, 어디 괜찮은 식당이나 카페를 갔다와도 리뷰를 작성하지 않는다.

(당장 회사 업무, 집안 일, 아이들 돌보는 일 등 시간이 없고, 심리적으로 귀찮아서~)

그런 귀차니즘과 시간의 쫓김을 떨치고, 오늘은 블로그에 끄적 거리는 이유가 "꽤 좋은 의사를 만나서"이다.

지금부터 썰을 풀자면~

어제 아내가 갑자기 어지럽다고 하면서 방바닥에 털썩 주저앉는 일이 있었다.

아내가 앉을 수 없을 정도로 어지럽다고 하여, 어지럼증을 치료하는 이비인후과를 찾아봤다.

그리하여 집에서 거리가 좀 멀지만, 안양성모이비인후과를 방문했다.

 

우선 병원 지하의 주차 공간이 넉넉하고, 넓어서 좋았다. 아파서 병원 왔는데 주차할 때부터 에너지가 소진되는 기분을 여기서는 느낄 수 없었다. 지하 주차장을 진입하자마자 비어있는 주차면이 많아서, 편하게 아무데나 주차했다.

병원이 있는 2층으로 올라가서 진료 접수하고, 진료 대기실 의자에 잠시 앉아 있었다.

아내의 어지럼증이 너무 심해서 대기실 의자에 앉는 것도 힘들 것 같은 생각이 들었다. 그래서 간호사에게 아직 진료 순서는 아니지만 검사실 침대에 가서 누워있어도 괜찮겠냐고 물었더니, 바로 검사실 침대로 안내를 해주었다.

바로 침대에 눕고, 20분 정도 기다리니 의사가 검사실로 들어왔다.

 

어지럼증의 원인이 무엇인지 확인하기 위해 검사 장비를 이용해서 이것저것 검사를 진행했고, 의사의 소견은 이석증이었다.

그리고

  • 왜 이런 증상이 생기는지,
  • 이와 유사한 증상의 병들이 몇 가지 더 있는데 왜 본인(의사)가 다른 병이 아니라고 판단했는지,
  • 앞으로 치료를 어떻게 할 것이고,
  • 일반적인 환자의 치료 경과가 어떻게 예상되는지 등... 

의사가 A부터 Z까지 상세하게 설명해줬다.

검사 결과와 관련 치료법에 관한 설명을 10분 넘게 들은듯.. ^^

그리고 보호자인 나만 따로 원장실로 불러서, 또 한번 치료 중에 조심해야 할 내용을 추가로 설명해주었다.

이렇게 진료와 검사를 마치고 집으로 가려고 하는데, 병원 현관 밖으로 나간 우리에게 또 의사가 따라나와서

이런 저런 강조할 부분을 또 설명해주었다. (앞서 10분 넘게 설명해준 것에 대한 요약 내용 정도... ^^)

40년 넘게 병원을 다니면서 이렇게 친절한 의사는 처음 본다. ^^

​이왕에 병원을 가야할 상황이 생긴다면, 나는 다음에도 이 병원을 또 가겠다.

절대로 병원 광고가 아니다. 나는 이 병원에 지인이 있거나 이 병원의 이득이 나의 삶과 아무런 관련이 없다.

진짜 이 병원 의사가 친절해서 이렇게 글을 쓰고 있는 것이다.

 

(시간이 없어서, 사진 올리기는 패쑤~)

반응형

 

1) Domain name 결정하기

가장 먼저 할 일은 "Domain의 이름을 무엇으로 할 것인가?" 정하는 것이다.

예를 들어, "hahahoho.com"과 같이 이름을 정한다.

 

2) Domain name 등록 업체 찾기

그 다음으로 할 일은 "어느 등록 업체에서 인터넷 도메인 네임을 등록할 것인가?"를 정하는 것이다.

가격이 중요한 요소가 아니라면, '후이즈(whois)', '예스닉(YesNIC)' 또는 '가비아(Gabia)' 같은 대중에게 잘 알려진 인터넷 도메인 등록 업체에서 등록하면 된다.

인터넷 도메인을 관리하는 웹 UI가 한글로 되어 있고, 뭔가 잘 모르겠다 싶을 때 고객센터에 전화하면 잘 응대해줘서 비싸더라도 이곳에서 도메인 네임을 등록하면 편하다.

그러나 돈이 넉넉하지 않다면, 'Domain.Com' 같은 해외 업체를 이용하는 것이 좋다.

 

(해외 업체에서 등록하면 외화가 낭비될 것이라고 생각할 수 있을텐데, 어짜피 후이즈 또는 가비아 같은 한국 업체도 도메인 네임을 등록할 때 Verisign 같은 Registry 기관에 외화를 송금해줘야 한다. 즉, 내가 직접 해외에서 카드 결제를 할 것이냐, 아니면 후이즈를 통해서 해외 송금을 할 것이냐 정도의 차이만 있을 뿐이다. 어떤 방법을 사용하던 간에~ 어짜피 외화가 지출된다. 서글픈 현실이다 ㅜㅜ)

 

싼 업체를 찾는다면, Domain.Com

나는 여러 업체를 알아보다가 Domain.Com이 그나마 저렴하고 서비스 신뢰성이 높아서 이 업체를 선택했다.

고객센터에 문의할 때 영어를 써야하는 불편함이 있을 수 있겠지만, 실제로 문의를 해보니...

고급진 영어를 구사하지 않아도 Domain.Com 고객센터에서 잘 응대하고 문제도 잘 해결해주었다.

나는 Domain Name 등록하는 웹 화면에서 유효하지 않은 Postal Code 때문에 카드 결제만 되고 실제로 Root name DB에 domain name이 등록되지 않는 에러가 발생했는데, Domain.Com 운영자가 나의 짧은 영어 표현에도 찰떡 같이 알아듣고 착착착 문제를 해결해줬다.

그리고 고객센터의 일처리가 빨라서 좋았다.

Domain.Com 아주 만족스런 도메인 등록 회사(Registrar)이다.

내년에도 이 Domain.Com에서 도메인 등록 기간을 연장할 생각이다.

 

 

싸면서 한국인이 고객 응대를 하는 업체를 찾는다면, YesNIC.COM

내가 등록한 도메인 네임 중에서 1개는 YesNIC.COM에서 등록했다.

다른 도메인 등록 관리 업체는 이것저것 부가 서비스(웹 호스팅, 클라우드 서비스 등)가 덕지덕지 붙고, UI가 현란하지만

YesNIC.COM은 Domain name만 전문적으로 관리하는 업체라서 Web UI가 심플하다.

나는 이점이 마음에 들어서 이곳에서 도메인 네임을 등록했다.

게다가 .KR 도메인이 싸다 ^^ 

예를 들어,  hahahoo.kr 같은 도메인을 등록할 것이라면 YesNIC을 추천한다.

 

 

도메인을 등록했으면, 그 다음으로 할 일이 네임서버 설치 ~~

 

 

Install BIND for name server(DNS) on Ubuntu 22.04

테스트한 날짜: 2023년 2월 6일 테스트 환경: Ubuntu 22.04 / Ubuntu 20.04 / Ubuntu 18.04 (이 3개 버전 모두 잘 동작했다) BIND 설치에 관해 참고하면 좋은 문서: https://www.hiroom2.com/2018/05/06/ubuntu-1804-bind-en/ BIND(DNS

andrewpage.tistory.com

 

반응형

Shell script를 작성하다보면, Random 숫자가 필요한 경우가 있다.

아래 예제 스크립트처럼 $RANDOM 변수를 사용하면, 매번 새로운 random integer를 구할 수 있다.

 

 

간단한 Example Script

#!/usr/local/bin/bash

for i in `seq 3`
do
    myrand=$RANDOM
    echo "Original random number: $myrand"

    mynum=$(expr $myrand / 1000)
    echo "Devided number: $mynum"
done

 

 

Random 초 만큼 쉬면서 CURL 명령을 반복 수행하는 Example Script

아래 예제는 실제로 ISTIO의 BookInfo 예제를 돌릴 때, 내가 종종 이용하는 Script이다.

 

#!/bin/bash

test_url="http://node-40.hub.cncf/productpage"

for i in $(seq 1 99999)
do
    curl -s -o /dev/null $test_url -: \
         -s -o /dev/null http://grafana.hub.cncf/?orgId=1 -:   \
         -s -o /dev/null http://tracing.hub.cncf/jaeger/search

    myrand=$RANDOM
    mysleeptime=$(expr $myrand % 7)
    printf "Run count: %d    (Sleep: %d seconds)\r" $i $mysleeptime
    sleep $mysleeptime
done
반응형
#!/usr/local/bin/bash

for i in $(seq 1 99)
do
    printf "Run count: %d \r" $i
    ## To do something at this line.
    sleep 0.5
done

Shell script로 for loop을 돌리면서, 'echo' 또는 'printf' 명령을 사용할 때 화면 아래로 text가 쭉 출력된다.

단순하게 count 값이 증가되는 것을 출력하는 것이라면, 아래로 쭉 내려가는 것보다는 같은 자리에서 counter 숫자만 갱신되는 것이 훨씬 예쁘다.

방법은 간단하다. C언어에서 사용한 것처럼 Carriage Return을 사용하면, 같은 자리에서 증분되는 counter만 출력할 수 있다.

 

아래 예제처럼 작성하고 돌려보시라 :D

 

 

 

반응형

매번 kubernetes pod에 접속(attach)하기 귀찮을 때, worker node에서 'nsenter' 명령을 이용하면 쉽게 pod 내부의 resource에 접근하는 Linux command를 실행할 수 있다.

예를 들어, Pod 내부의 NIC port의 상태를 조회하거나 packet flow를 dump할 때 nsenter 명령을 사용하면 손가락이 편해질 수 있다.

 

 

아래 블로그에 nsenter CLI를 이용하여 container network에 접근하는 예제가 있다.

(Linux container와 network namespace를 만들어 가는 과정을 설명하는 중간에 nsenter CLI가 사용된다. nsenter 자체에 대한 블로그 글이 아님에 주의할 것)

https://labs.iximiuz.com/tutorials/container-networking-from-scratch

반응형

스마트폰, 액션캠, 디지털카메라로 촬영한 동영상을 웹 페이지로 보려면, WEBM 형식으로 파일을 변환해야 한다.

변경 방식은 간단하다. 아래와 같은 명령을 수행하면 Web browser에서 바로 볼 수 있는 동영상 파일로 변환된다.

 

##
## 만약 MacOS를 사용한다면, 아래와 같이 ffmpeg을 먼저 설치한다.
##
$ brew install ffmpeg


##
## 명령 예시
##  아래 명령에서 'input.avi'가 스마트폰으로 촬영한 동영상 원본 파일명이고, 
##  'output.webm'이 변환된 이후에 web server에 올릴 파일명이다. 
##
$ ffmpeg -y -i my_input_movie.avi -c:v libvpx-vp9 -c:a libopus my_output_movie.webm


## 원본 파일이 .mp4 파일이면, 아래와 같이 수행하면 된다.
$ ffmpeg -y -i my_input_movie.mp4 -c:v libvpx-vp9 -c:a libopus my_output_movie.webm

참고:
꼭 Web browser로 포기 위한 용도가 아니더라도 위와 같인 webm 파일로 변경하면 좋은 점이 하나 더 있다. 그것은 바로, 동영상의 사이즈가 1/10 수준으로 확 줄어든다. 신기하게도 90% 정도의 사이즈 압축이 있지만, 동영상 품질의 차이는 눈으로 느낄 수 없을 정도이다. 동영상 품질이 거의 원본과 동일하다.

반응형

 

iptables의 Chain(Rule) & Table 구조 

iptables는 다수의 Chain(예: PREROUTING, INPUT, OUTPUT, POSTROUTING, FORWARD)과 그 Chain에 정의된 Rule, 그리고 각 Chain에는 다수의 Table(raw, mangle, nat, filter, security)이 포함되어 있다.

 

Iptables의 Chain 종류와 Table 종류

 

 

IP Packet이 유입된 이후에 아래 그림과 같이 패킷의 L2, L3, L4 Header를 조작하거나, Header의 내용을 보면서 IP Packet을 다음 Chain에서 처리하게 할지, 아니면 Client(Sender)로 되돌려 보낼지를 처리한다.

 

IPTables Chains Order Scheme  (from  https://jimmysong.io/en/blog/sidecar-injection-iptables-and-traffic-routing/)

 

위 그림을 볼 때, 주의할 점은 노란색 메모장 같은 라벨이 붙은 table에서는 IP packet을 조작한다는 것이다. 그리고 filter 같은 table에서는 IP packet을 열람만하고 조작하지 않는다.

 

그리고, 아래 그림은  istio의 envoy proxy container와 app container가 어떻게 IP Traffic을 전달하는지 보여준다. 이때도 역시 iptables가 IP traffic의 전달에 관여한다.

 

image from  https://jimmysong.io/en/blog/sidecar-injection-iptables-and-traffic-routing/

 

 

image from  https://jimmysong.io/en/blog/sidecar-injection-iptables-and-traffic-routing/

 

 

Packet Flow in Netfilter and General Networking  (from wikipedia.org/wiki/Netfilter)

 

 

 

iptables 명령 기본 표기법

iptables [-t table] [action] [chain] [pattern] [-j target] 

  • [table] 크게 nat와 filter로 나누며 기본값은 filter이다. 
  • [action] 전체 체인에 대한 정책을 지정 / -A , -L , -D , -F 등 대문자 옵션이 해당한다. 
  • [chain] 일반적 필터링에 속하는 INPUT.OUTPUT.FORWARD가 있으며 NAT테이블에는 POSTROUTING / PREROUTING / OUTPUT 이 있다. 
  • [pattern] 세부규칙을 지정하는 것으로 소문자 옵션 -s / -p /-d 등이 이에 해당한다. 
  • [target] 정책을 지정하는 것이며 DROP / ACCEPT / LOG 등등이 있다. 

 

iptables 명령 예시

Example - A

$ iptables -t filter
           -A INPUT  # 들어오는 패킷에 대한 필터링 
           -i eth0   # eth0 네트워크 아답터로 들어오는 패킷들이 대상임
           -p ICMP   # 프로토콜이 ICMP이면
           -j DROP   # 위 조건을 만족하는 패킷을 소멸(삭제)

 

Example - B

$ iptables -t filter
           -A INPUT       # 들어오는 패킷에 대한 필터링
           -i eth0        # eth0 네트워크 아답터로 들어오는 패킷들이 대상임
           -o eth0        # eth0 네트워크 아답터로 나가는는(output) 패킷들이 대상임
           -p TCP         # 프로토콜이 TCP이면
           --dport 22     # destination port가 22번이면
           --sport 39321  # source port가 39321번이면 
           -j ACCEPT      # 위 조건을 만족하는 패킷을 Accept

 

 

 

iptables 사용하기

iptables는 사용하는 방법은 크게 두가지가 있다.  

  • 첫번째는 전체 체인에 대한 설정이고,
  • 두번째는 각 체인에 대한 규칙을 사용하는 방법이다.  

체인에 대한 동작설정은 대문자 옵션을 사용하고 체인에 대한 세부규칙은 소문자 옵션을 사용한다. 

 

체인 전체옵션 설명 

-N 새로운 체인을 만든다 
-X 비어있는 체인을 제거한다 
-P 체인의 정책을 설정한다 
-L 현재 체인의 정책을 보여준다 
-F 체인의 규칙을 제거한다 
*체인 동작옵션 설명 (내부규칙을 뜻함) 
-A 체인에 새로운 규칙을 추가한다. 해당체인에 마지막규칙으로 등록된다. 
-t 가 filter 인 경우 INPUT, FORWARD 사용가능 
-t 가 nat 인 경우 POSTROUTING , PREROUTING 사용가능 
-I 체인에 규칙을 맨 첫부분에 등록한다. 
-R 체인의 규칙을 교환한다. 
-D 체인의 규칙을 제거한다 

 

 

 

iptables 세부 옵션

-s / -d 출발지('-s' , '--source') / 도착지 ('-d' , '--destination')를 뜻함 
$ iptables -A INPUT -s 192.168.10.0/24 -j DROP   # 192.168.10.0/24 네크워크에서 들어오는 패킷들을 모두 DROP한다. 
                                                 # -j 옵션에 대해 ACCEPT | DROP | DENY | REDIRECT 등등 설정 

$ iptables -A INPUT -s 192.168.10.20 -j DENY     # 192.168.10.20으로 들어오는 패킷에 대해서 거부한다.

 

-p (프로토콜의 지정) 
     (예) -p ! TCP      # TCP 프로토콜이 아닌경우를 뜻함 

-i (--in-interface) 패킷이 들어오는 인터페이스를 지정 
     INPUT / FORWARD 체인에서 사용 
     -t nat 이면 PREROUTING에서만 사용 가능 

-o ('--out-interface') 패킷이 나가는 인터페이스를 지정 
     OUTPUT / FORWARD 체인에서 사용 
     -t nat 이면 POSTROUTING에서만 사용 가능 

-t (--table) 테이블 선택의 의미 
     -t filter / -t nat / -t mangle 세가지 선택을 할수 있다. 

 

 

 

iptables 의 추가 옵션 설정하기 

-p 같은 프로토콜 관련 옵션들의 기능에 대한 세부적인 추가 옵션을 제공한다. 
--sport 발신지에서의 하나의 포트나 포트범위를 지정한다. 
--dport 도착지에서의 포트를 지정한다. 
--tcp-flags 플래그를 지정하는 옵션이다. 첫번째는 검사하고자 하는 지시자 리스트 . 
두번째는 지시자에 어떻게 할것인가를 설정 
$ iptables -A INPUT -p tcp --tcp-flag ALL SYN<ACK -j DENY  # 모든플래그를 검사(ALL의 의미는 SYS,ACK,FIN,RST,URG,PSH를 의미)SYN 과 ACK만 거부한다.

 

 

 

정책(Rule) 확인법

ping test를 이용하여 traffic policy를 확인할 수 있다.

$ ping localhost   # 127.0.0.1로 핑 보내기 
## 정상적으로 ping packet이 전송되는 것을 확인한다.

$ iptable -A INPUT -s 127.0.0.1 -p icmp -j DROP   # 출발지가 127.0.0.1 이며 프로토콜 icmp 사용해 들어오는 패킷을 DROP 한다. 

$ ping localhost 
## DROP 정책이 정상적으로 적용되었다면, ping이 되지 않을 것이다.

 

 

 

정책(Rule) 지우기

우선, 지우고자 하는 정책을 확인하고, -D 옵션을 이용하여 해당 정책을 지운다.

$ iptables -L --line   # 정책 순서대로 리스트 번호가 설정되어 보여짐

## 개별 정책 지우기 (-D) 
## iptables -D [해당정책] [리스트번호] 
$ iptables -t nat -D PREROUTING 2 

## 전체 정책 초기화 (-F) 
$ iptables -F INPUT    # INPUT체인에 부여된 정책 모두 제거

 

 

 

iptables rule 저장하고 불러오기

방법 A : 수작업 복구

원하는 방화벽 체인을 설정해 놓은후 그 설정을 저장하여 설정된 내용을 불러 올수 있다. 

## iptables-save > [파일명] 
$ iptables-save > my-save.txt 

## 저장한 내용 화면에 출력하기 
$ iptables-save 

## iptables-save로 저장한 체인을 복구 명령: iptables-restore 
$ iptables-restore < my-save.txt

 

방법 B :  자동 복구 (부팅 시 백업된 Rule 적용)

## root 사용자로 변경
$  sudo -s

## 자동 복구를 위한 관련 SW 패키지 설치
$  apt install iptables-persistent

## 아래와 같이 /etc/iptables 폴더가 생성되었는지 확인
$  ls -al /etc/iptables/

## netfilter-persistent 서비스 상태를 확인
$  systemctl status netfilter-persistent

$  systemctl is-enabled netfilter-persistent


## 테스트를 위해 아래와 같이 Rule을 추가해보고, OS Reboot해본다.
$  iptables -A POSTROUTING -t nat -o br-ex -s 172.16.0.0/16 -j MASQUERADE

##
## OS Reboot 완료 후, iptables 명령으로 netfilter rule이 잘 복구되었는지 확인한다.
##
$ iptables-save | grep 172.16.0.0

 

## 아래 명령과 같이 'save' 서브 명령이 있는데,
## 지금까지 테스트해본 결과를 보면, 'save' 명령을 수행하지 않아도
## 그때그때 netfilter rule의 변화를 /etc/iptables 폴더에 반영하는 것 같다.
## (2023년 6월 기준으로 이렇게 동작하지만, 나중에 또 어떻게 바뀌지 모르니까 참고만 할 것 !)
$ netfilter-persistent save

 

 

 

 


 

Somthing to read

 

https://iximiuz.com/en/posts/laymans-iptables-101/

이  Web Docs가 그림을 이용하여 다양한 상황을 잘 Illustration하고 있다. 시간 날 때마다 읽어서 기억을 유지하면 좋을 듯 :)

 

Illustrated introduction to Linux iptables - Ivan Velichko

What are iptables chains, rules, policies, and tables? Describe iptables in layman's terms.

iximiuz.com

image from&nbsp;https://iximiuz.com/en/posts/laymans-iptables-101/

반응형

tcpdump 명령만 이용하면, 출력을 보기 좋게 또는 예쁘게 터미널로 출력하기 어렵다.

보기 좋은 형식으로 출력하려면 tshark 명령을 사용하는 것을 추천한다.

 

 

tshark 명령 사용

tshark을 사용하면, Network Packet이 정말 예쁘게 출력된다.  

아래와 같이 wireshark 패키지를 설치한다.  (참고로 tshark은 wireshark 패키지에 포함되어 있다)

##
## 아래 예시처럼 yum install 명령을 이용하여 wireshark 패키지를 설치한다.
##

$ yum install wireshark
...

##
## 설치 완료 후, 아래 명령과 같이 실행
## 참고: -V 옵션은 Packet을 Decode해서 출력하라는 뜻
##
$ tshark -i eth0 -nV port 53

 

위 예제 명령 정도의 옵션만 사용해도 꽤 보기 좋은 모양으로 IP 네트워크 패킷이 출력된다.

 

 

tcpdump 명령의 -A 옵션 사용해서 가독성 높게 출력하기

tshark을 사용할 수 없는 경우라면, 아래 명령처럼 -A 옵션을 주면, TCP 또는 UDP의 Payload가 ASCII 로 출력된다.

(사람 눈으로 읽을 수 있는, 즉 Readable Character만 터미널에 출력함) 

 

-A 옵션만 사용하면, TCP 세션을 수립하기 위한 SYNACKFIN 패킷도 모두 보여지기 때문에 

Filter에  tcp[32:4] = 0x47455420 조건을 추가한다. ("GET "에 대한 Pointcode 값이다) 

 

 

HTTP GET 요청 메시지만 출력
$ tcpdump -i p2p2 -s 1500 -An 'src net 192.168.0.0/24' and dst port 80 and 'tcp[32:4] = 0x47455420'

 

 

HTTP GET 요청과 응답 메시지 모두 출력
$ tcpdump -i em2 -s 1500 -An 'src net 192.168.0.0/24' and 'tcp[32:4] = 0x48545450' or 'tcp[32:4] = 0x47455420'

 

  또는 아래와 같은 방식을 사용할 수 있다.

(이 방식을 추천함)

$ tcpdump -i em2 -An -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

 


참고: 위의 3개 명령 중에서 제일 마지막 명령이 제일 출력 포맷이 예쁘다. 

+ Recent posts