반응형
참고하면 좋은 Web Docs:

https://www.lesstif.com/software-architect/openssl-command-tip-7635159.html#OpenSSL%EC%9E%90%EC%A3%BC%EC%93%B0%EB%8A%94%EB%AA%85%EB%A0%B9%EC%96%B4(command)%EB%B0%8F%EC%82%AC%EC%9A%A9%EB%B2%95,tip%EC%A0%95%EB%A6%AC-%EC%9D%B8%EC%A6%9D%EC%84%9C%EC%A0%95%EB%B3%B4%EB%B3%B4%EA%B8%B0

 

 

 

openssl command cheat sheet

## Certificate Expiry 확인
$  openssl x509 -in my.crt -noout -enddate | cut -c10-40

## File 내용 확인
$ openssl rsa  -noout -text -in myprivate.key    # private key file
$ openssl req  -noout -text -in myreq.csr        # singing request file
$ openssl x509 -noout -text -in mycert.crt       # certificate file

## cerficate과 private key가 쌍이 맞는지 확인
$ openssl rsa  -in myprivate.key -modulus -noout | openssl md5
$ openssl x509 -in mycert.crt    -modulus -noout | openssl md5
$ openssl req  -in myreq.csr     -modulus -noout | openssl md5

Private Key를 생성하고,  Signing 요청하는 것은 아래 내용을 참고할 것!

 

Certficate 파일과 Private Key 파일의 Format 변환(DER/PEM)은 아래 내용을 참고할 것!

 

'Ubuntu' 카테고리의 다른 글

Root 계정의 SSH 로그인 허용  (0) 2021.12.28
Install BIND for name server(DNS) on Ubuntu 22.04  (0) 2021.11.05
.bashrc 또는 .bash_profile 설정  (0) 2021.07.22
.vimrc 작성  (0) 2021.07.22
iptables and netfilter  (1) 2021.07.10
반응형

Macbook을 새로 구입하고, .bash_profile을 작성할 때 참고하려고 작성했다.

 

#
# Greeting message
#   31 Red
#   32 Green
#   33 Yellow
#   34 Blue
#   35 Magenta
#   36 Cyan
#   Reference: https://en.wikipedia.org/wiki/ANSI_escape_code
#


# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

# For Ubuntu, CentOS
#OS_DESCRIPTION=$(lsb_release -d)
# For Mac OS
OS_DESCRIPTION=$(uname -srn)

echo "                                                "
echo "  Bourne Again Shell  Environment  for  Andrew "
echo "  $OS_DESCRIPTION "
echo "                                                "

#
# For core dumped file
#
ulimit -c unlimited

#
# Locale
#
## LC_CTYPE=ko_KR.utf8
export LC_ALL="en_US.UTF-8"
export LANGUAGE="en_US.UTF-8"

# export VIM=/usr/share/vim/vim74
export PATH=$PATH:/sbin:/usr/sbin:/usr/local/go/bin:./
export PATH=$PATH:/usr/local/Cellar/iftop/1.0pre4/sbin
export PATH=$PATH:$HOME/go/bin
export PATH=$PATH:$HOME/bin

ssh2() {
    ssh  -oStrictHostKeyChecking=no  -p 33322  $@
}

sftp2() {
    sftp  -oStrictHostKeyChecking=no  -P 33322  $@
}

mandump() {
    man $1 | col -bx > man_page_$1.txt
}

## For docker monitoring
docker_ip() {
    sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
}

mywhile() {
	while true; do date;  $2;  echo "";  echo "";  sleep $1;  done
}

conn_vpn() {
	sudo  openconnect --protocol=gp $1
}

## For Mac OS
get_cpu_mac() {
    # istats all
    istats cpu
}

## For Raspberry PI
get_cpu_pi() {
    my_cpu_temp=$(vcgencmd measure_temp)
    echo " *** Execute vcgencmd *** "
    echo "  + CPU Temperature : $my_cpu_temp "

    echo ""
    echo " *** Get information from /sys/class/thermal/thermal_zone0/temp *** "
    cpu=$(</sys/class/thermal/thermal_zone0/temp)
    echo "  + CPU Temperature : $((cpu/1000)) c "
}

## Kubernetes
kube_andrew() {
  export KUBECONFIG=~/Documents/kube_config/andrew
  kubectl config get-contexts
}

kube_peter() {
  export KUBECONFIG=~/Documents/kube_config/peter
  kubectl config get-contexts
}

## For Mac OS
export PS1="\h:\w > "


export BASH_COMPLETION_COMPAT_DIR="/usr/local/etc/bash_completion.d"
[[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . "/usr/local/etc/profile.d/bash_completion.sh"
source <(kubectl completion bash)
alias k=kubectl
complete -F __start_kubectl k

alias ls='ls -FG'

## For Mac OS
# defaults write .GlobalPreferences com.apple.mouse.scaling -23000
# efaults write -g com.apple.mouse.scaling 5

 

 

'Ubuntu' 카테고리의 다른 글

Install BIND for name server(DNS) on Ubuntu 22.04  (0) 2021.11.05
openssl command example  (0) 2021.11.04
.vimrc 작성  (0) 2021.07.22
iptables and netfilter  (1) 2021.07.10
tcpdump로 HTTP Packet Decode 하기 및 tshark 사용법  (0) 2021.07.10
반응형

VIM 편집기를 사용할 때, .vimrc 파일을 잘 작성하면 IDE만큼 편하게 쓸 수 있다.

각 항목을 잘 이해하고 .vimrc 파일을 설정하면 좋겠지만, 귀찮으면 그냥 아래 내용을 copy & paste하면 된다. :D

 

"
" Filename: .vimrc
"

syntax on

color koehler
set expandtab   " tab character를 whitespace로 자동 변환

set tags=./tags,/root/tags

set fileencodings=utf8,euc-kr
set smartcase   " 대문자가 검색어 문자열에 포함될 때에는 noignorecase
set ignorecase  " 검색시 대소문자 무시
set hlsearch    " 검색시 하이라이트(색상 강조)
set incsearch   " 검색 키워드 입력시 한 글자 입력할 때마다 점진 검색

set ruler       " 현재 커서 위치 (row, col) 좌표 출력
set noerrorbells    " 에러 알림음 끄기

set bs=indent,eol,start " backspace 키 사용 가능
set background=dark  " 검정배경을 사용할 때, (이 색상에 맞춰 문법 하이라이트 색상이 달라짐.)

set wmnu            " tab 자동완성시 가능한 목록을 보여줌
set shiftwidth=4    " shift를 4칸으로 ( >, >>, <, << 등의 명령어)
set tabstop=4       " tab을 4칸으로
"set tabstop=4 softtabstop=4 shiftwidth=4

set noimd       " no imdisable 한글 입력기 관련

set ai              " autoindent 자동 들여쓰기
set smartindent     " 자동 들여쓰기 "
set cindent         " C언어 자동 들여쓰기
set laststatus=2    " 상태바를 언제나 표시할 것
set sm              " 매치되는 괄호 표시 (= showmatch)
set history=1000    " vi 편집기록 기억갯수 .viminfo에 기록



" 마지막으로 수정된 곳에 커서를 위치함
au BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "norm g`\"" |
\ endif


au BufNewFile,BufReadPost *.c,*.h set cindent
au BufNewFile,BufReadPost *.cpp,*.cc source $VIM/syntax/cpp.vim
au BufNewFile,BufReadPost *.cpp,*.cc set cindent
au BufNewFile,BufReadPost *.go source $HOME/Git/shell_config/go.vim
au BufNewFile,BufReadPost *.tex source $VIM/syntax/tex.vim
au BufNewFile,BufReadPost *.tex set autoindent
au BufNewFile,BufReadPost *.java source $VIM/syntax/java.vim
au BufNewFile,BufReadPost *.java set cindent
au BufNewFile,BufReadPost *.html,*.htm source $VIM/syntax/html.vim
au BufNewFile,BufReadPost *.html,*.htm set smartindent


" Move tab for multiple files open
nnoremap <TAB> <C-W>w
nnoremap <S-TAB> <C-W>W

" vim-commentary
map gc <Plug>Commentary
nmap gcc <Plug>CommentaryLine

imap ,for for (idx = 0; idx < ; idx++) {<ENTER>}
imap ,if if () {<ENTER>}<ESC>kf(a
imap ,wh while () {<ENTER>}<ESC>kf(a
imap ,pr printf("%s %s(%d) \n", __func__, __FILE__, __LINE__);

ab _a@  #if 0 /* I would not use the following code */ <CR>#else<CR>#endif


" ctrl-j 로 라인을 분리.
nnoremap <NL> i<CR><ESC>

" copy , paste , select 기능 보완 -------------------------------
noremap <Space>y    "+y
nnoremap <Space>p   "+p
nnoremap <Space>a   gg<S-v>G

" navigation 기능 보완 ---------------------------------
nnoremap <Space>h ^
nnoremap <Space>l $
noremap <Space>j 8j
noremap <Space>k 8k


ab _el      MYLOG_ERR("%s:: \n", __func__);
ab _sl      MYLOG_SVC("%s::success\n", __func__);
ab _dl      MYLOG_DBG("%s:: \n", __func__);
반응형

 

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&nbsp; (from&nbsp; 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&nbsp; https://jimmysong.io/en/blog/sidecar-injection-iptables-and-traffic-routing/

 

 

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

 

 

Packet Flow in Netfilter and General Networking&nbsp; (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개 명령 중에서 제일 마지막 명령이 제일 출력 포맷이 예쁘다. 

반응형

Ubuntu, CentOS 같은 Linux에서 sudoer를 설정하는 방법은 2가지가 있다.

 

방법 A

"/etc/sudoers.d/sejong" 파일에 아래와 같이 설정 1줄을 추가한다. 

##
## Filename: /etc/sudoers.d/sejong
##

sejong ALL=(ALL) NOPASSWD:ALL

 

 

방법 B

/etc/sudoers 파일의 마지막 줄에 아래 예제와 같이 계정 정보를 추가한다.

(sudoers 파일의 중간에 계정 정보를 추가하면 정상 동작하지 않는 경우를 발견하였다. 왜 문제가 발생하는지 원인은 모르겠고, 가능하면 마지막 줄에 넣어주는게 좋을 듯~)

$ echo "sejong ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

 

 

결과 확인

아래와 같이 sudo -s 명령을 수행해서 암호(password)를 입력하기 않고 바로 root user로 변경되는지 확인한다.

$ id
uid=997(sejong) gid=997(sejong) groups=997(sejong)

$ sudo -s

# id
uid=0(root) gid=0(root) groups=0(root)
반응형

 


 

NAT에 대한 개념 설명은 아래의 Joinc 사이트를 참고

 

 

NAT

DNAT를 이용한 Load balancing

www.joinc.co.kr:443

 

 

일반적으로 DNAT는;

 웹 서버가 Private Network 내부에 존재하면, Public network과 Private network의 경계에 있는 DNAT 장치가 외부의 모든 요청 패킷을 수신하여 Dest Address를 Private network의 IP Address 및 TCP/UCP Port로 변경하여 전달하는 용도로 자주 이용된다. 

  

아래 명령 예제는  

  • Host machine이 eth1
  • Host machine과 Virtual machine의 Bridge interface를 virbr0    (참고: VM 내부의 IP는 192.168.122.203) 

라고 가정하고 설정한 것이다. 

$ echo 1 > /proc/sys/net/ipv4/ip_forward 

##
## 주의: 
##   아래 -F 옵션은 FORWARD 체인의 내용을 깨끗하게 지우는 명령(Flush)이기 때문에 조심해서 사용해야 한다.
##
$ iptables -F FORWARD 

##
## FORWARD 체인에 eth1 ethernet port로 나가는 트래픽을 허용하는 Rule을 추가.
##
$ iptables -A FORWARD -o eth1 -j ACCEPT 

##
## FORWARD 체인에 virbr0 ethernet port로 나가는 트래픽을 허용하는 Rule을 추가.
##
$ iptables -A FORWARD -o virbr0 -j ACCEPT 

##
## VM의 SSH 서비스로 DNAT 처리 (Port forward: 50022 --> 22)
##
$ iptables  -t nat  -A PREROUTING  -i eth1 -p TCP  --dport 50022  -j DNAT  --to 192.168.122.203:22

##
## VM의 Web 서비스로 DNAT 처리 (Port forward: 50080 --> 80)
##
$ iptables  -t nat  -A PREROUTING  -i eth1 -p TCP  --dport 50080  -j DNAT  --to 192.168.122.203:80

 

위 명령 예시에서 마지막 명령줄에 대한 설명:

Gateway의 eth1으로 들어오는 패킷중에 80번 포트번호로 접속하는 패킷은 192.198.122.203(HTTP)의 80번 포트로 보낸다.

파라미터 단위로 의미를 파악해보면, 아래와 같다.

  iptables -t nat(NAT기능을 사용하겠다) 
              -A PREROUTING(PREROUTING 체인에 Rule을 추가)
              -i eth0(eth0 인터페이스로 들어오는 패킷들에 적용한다) 
              -p TCP(TCP 프로토콜이면) 
              --dport 80(접속하려는 포트번호가 80번이면) 
              -j DNAT --to 192.168.122.203:80 
             (목적지 주소를 192.168.122.203으로 변경, 포트 번호는 80번으로 변경한다)

 

 


 

반응형

 


 


참고: 
  테스트한 날: 2023년 1월 6일
  테스트에 사용했던 OS:  Ubuntu 22.04

 

 

Ubuntu OS를 Booting할 때마다 기존  /etc/resolv.conf 파일은  resolvconf.servicesystemd-resolved.service에 의해서 overwrite 된다.

따라서 nameserver를 내가 원하는 값으로 변경하고 싶으면, 아래와 같이 추가로 설정 작업을 해야 한다.

 

##
## root 계정 권한 갖기
##

$  sudo -s


##
## Ubuntu를 설치할 때 최소 설치 또는 기본 설정으로 설치했다면
## 아래와 같이 resolvconf.service가 없어서 에러가 출력될 것이다.
## 따라서 resolvconf.service 부터 설치해야 한다.
##

$  systemctl status resolvconf.service

Unit resolvconf.service could not be found.

$

## 
## NOTE:
##   apt 명령으로 resolvconf를 설치하기 전에 임시로 /etc/resolv.conf 파일에
##   nameserver 항목에 1.1.1.1 값을 설정한다.
##
$  cat  /etc/resolv.conf
... 중간 생략 ...

nameserver  1.1.1.1         ## <-- 이 부분을 수정할 것!!!
options edns0 trust-ad

$  apt install resolvconf

$  systemctl status resolvconf

● resolvconf.service - Nameserver information manager
     Loaded: loaded (/lib/systemd/system/resolvconf.service; enabled; vendor preset: enabled)
     Active: active (exited) since Thu 2021-12-30 16:07:28 KST; 3min 14s ago

... 중간 생략 ...

$  cat  /etc/resolvconf/resolv.conf.d/head

nameserver 1.1.1.1
nameserver 8.8.8.8


##
## 위에서 설정한 값을 system에 반영하기 위해 아래와 같이 명령을 수행한다.
##

$  resolvconf --enable-updates

$  resolvconf -u

$  cat /etc/resolv.conf

nameserver 1.1.1.1
nameserver 8.8.8.8

$

##
## 위 과정이 에러 없이 수행되었다면, OS를 Reboot해서
## /etc/resolv.conf 설정 내용을 원하는 대로 반영되는지 확인해볼 것 !!!
##

$  reboot

## Rebooting ...
## ...
## ...

$  cat /etc/resolv.conf

nameserver 1.1.1.1
nameserver 8.8.8.8

$

 

 


참고:  위 설정은  Ubuntu 18.04 와 Ubuntu 20.04 에서만 테스트했음.  다른 버전의 Ubuntu는 위 설명이 효과가 있는지 아직 모름.
(2021년 12월 30일에 테스트한 결과)

 

 

 

참고:  위와 같이 nameserver를 왜 변경해야 하는 상황이 있을까?

 

apt update 또는 apt install  명령을 수행하다보면, 아래 화면과 같이  Temporary failure resolving archive.ubuntu.com 이라는 에러가 발생하는 경우가 있다.

atp 명령 수행시 Temporary failure resolving archive.ubuntu.com 에러 발생

 

왜 이런 에러가 발생할까?

nameserver 기본 설정이 아래와 같이 127.0.0.53 으로 되어 있기 때문이다.

nameserver 값을 1.1.1.1 또는 8.8.8.8 과 같이 설정하면 apt install 명령을 잘 수행될 것이다.

 

resolv.conf 기본 설정 정보


 


 

+ Recent posts