웹 서버가 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.service와 systemd-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 이라는 에러가 발생하는 경우가 있다.
왜 이런 에러가 발생할까?
nameserver 기본 설정이 아래와 같이 127.0.0.53 으로 되어 있기 때문이다.
이 nameserver 값을 1.1.1.1 또는 8.8.8.8 과 같이 설정하면 apt install 명령을 잘 수행될 것이다.
CentOS, RHEL, Ubuntu 등 Linux Desktop에 원격 접속할 때, 일반적으로 VNC를 사용하곤 하는데 Ubuntu 22.04 버전을 사용할 때는 VNC보다는 MS-RD가 좀더 화면도 예쁘고, 화면 반응도 빨라서 MS-RD을 더 많이 사용하게 된다. 그리고 설정 방법도 간단해서 더 손이 자주 간다.
Ubuntu 22.04 Server 에서 Screen Sharing 설정하기
[ Settings ] -> [ Sharing ] -> [ Screening Sharing ] 순서로 설정 메뉴를 찾아간다.
주의: MS-RD만 사용할 것이기 때문에 VNC는 활성화하지 않도록 한다.
MacOS Client 에서 Screen Sharing 설정하기
Microsoft Remote Desktop(MS-RD)를 사용하기 위해서는 아래와 같이 Apple App Store에서
"Microsoft Remote Desktop"을 검색하여, 설치한다.
위 앱을 설치 후, Ubuntu 22.04 서버의 IP Address와 MS-RD에 접근할 ID, Password만 입력하면 설정 끝 !!!
그런 후에 "Connect" 메뉴를 선택하면 접속이 잘 된다.
Ubuntu Client 에서 Screen Sharing 설정하기
Ubuntu Client에는 Remmina 앱이 있어야 Ubuntu Server에 MS-RD로 접근할 수 있다.
내가 설치한 기억이 없는걸보면, OS 설치할 때 Remmina는 이미 설치되어 있던 것 같다.
위 화면과 같이 Remmina를 실행하고, 아래 화면에서 접속 정보(IP Address, ID, Password)를 입력하고 Connect하면 Ubuntu Server의 Desktop에 잘 접근된다.
작업 끝
이하, 작성된 글은 Ubuntu 20.04 이하에서 테스트한 것을 정리한 것이다. 따라서 지금 시점에서는 아래의 내용이 잘 맞지 않을 수 있다.
Ubuntu 18.04와 20.04 버전에서 Remote Dekstop(원격 데스크탑) 기능을 사용하려면 Vino를 설치해야 한다.
(참고: 아주 오래된 Ubuntu, CentOS 버전은 다른 VNC 서버 패키지를 설치해도 문제가 없지만, Ubuntu 18.04와 20.04는 꼭 Vino를 사용하는 것이 좋다)
설정 따라하기
##
## VNC Server 기능을 하는 Vino를 설치하기
##
$ sudo apt install vino -y
...
아래 화면처럼 설정 GUI(Settings)를 실행한다.
아래와 화면이 보일 것이다.
그리고 아래 그림의 풍선 도움말 순서를 따라서 실행한다.
참고로, RealVNC viewer나 Safari VNC Client App이 Vino VNC server의 Encryption 방식을 지원하지 못하기 때문에 아래 명령을 통해서 Vino의 encryption 기능을 비활성화해야 한다. (본인이 사용하는 VNC Client의 Encryption 방식을 잘 모른다면, 일단 아래 명령을 따라서 수행해보는 것이 좋다. 물론 보안이 허술해지는 문제는 있지만 ㅠㅠ)
##
## Vino VNC server의 Encryption 기능 끄기(Deactivate)
##
$ /usr/bin/gsettings set org.gnome.Vino require-encryption false
위 그림에서 (3)번 순서에 해당하는 Screen Sharing 메뉴를 Click하면, 아래와 같은 설정 화면이 뜰 것이다.
위와 같이 Vino Server를 설정했다면, PC(Macbook)에서 Safari 같은 Web browser의 주소 입력창에 Ubuntu 서버의 주소를 입력한다.
Safara Web Browser에서 아래와 같은 VNC Client App 화면을 새로 만들고, VNC Server에 접속해 줄 것이다.
아래와 같이 Ubuntu 접속된 화면이 나오면 Remote Desktop(원격 데스크탑) 연결 성공 :D
주의할 점 & 이슈
Ubuntu 18.04와 20.04 버전에서 Dekstop을 원격에서 사용할 수 있게 하려면, 주의할 점이 있다.
이 주의할 점만 제외하면, 일반적인 Sharing Desktop 설정 절차에 따라 설정하면 문제없이 동작한다.
이슈 1: Ubuntu 에는 Vino Server가 기본적으로 5900 TCP port로 원격제어 서비스를 제공한다. 따라서 TigerVNC Server 같은 다른 프로그램을 추가로 설치하면 오동작하기 때문에 Ubuntu가 기본 제공하는 Vino Server를 이용하여 원격제어 서비스를 사용해야 한다. (즉, TigerVNC 서버 같은 별도의 서버를 Ubuntu Server에 설치하면, 오히려 포트 번호 충돌 때문에 설정이 더 꼬이게 된다. 그냥 순정 Vino 서버를 사용하는 것을 추천함.)
이슈 2: OVS와 Vino를 같이 사용하는 경우에 발생하는 이슈 -> “Screen Sharing” 창의 Networks 항목에 “Wired connection 1”이 없어서, [ON] 버튼을 누를 수 없다.
보통 이 문제는 NetworkManager에 의해서 자동으로 관리되는 NIC Port가 없기 때문에 발생한다. 예를 들어, Open vSwitch에 eth0 port를 할당하기 위해 강제로 eth0 port를 NetworkManager의 관리 대상에서 뺐기 때문에 발생한다.
Open vSwitch를 사용하는 경우가 아니라면, 이 문제가 발생할 일이 거의 없겠지만 만약 꼭 Open vSwitch를 사용하면서 Sharing Desktop 기능도 사용하고 싶다면 아래와 같이 NIC Port를 강제로 하나 더 만든다.
CentOS 8에서 특정 Network port, NIC에 대해 IP address를 설정하려면,
'/etc/sysconfig/network-scripts/ifcfg-*' 설정 파일을 작성해야 한다.
예를 들어, ens3 network interface를 설정하려면 아래와 같이 설정 파일을 작성해야 한다.
# /etc/sysconfig/network-scripts/ifcfg-ens3
. . .
BOOTPROTO="dhcp" # 고정 IP 설정을 위해 none으로 설정
. . .
IPV6INIT="no"
IPV6_AUTOCONF="no"
IPV6_DEFROUTE="no"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
. . .
ONBOOT="yes" # 부팅 / 네트워크 재시작 시 자동 활성화를 위해 yes로 설정
IPADDR=10.10.12.30 # IP 설정
NETMASK=255.255.255.0 # 서브넷 마스크 설정, prefix=24 설정으로 대체할 수도 있습니다.
GATEWAY=10.10.12.1 # 게이트웨이 설정
DNS1=10.10.12.40 # 1차 네임서버 설정, /etc/resolv.conf 설정파일에서 정의하셔도 됩니다.
DNS2=1.1.1.1 # 2차 네임서버 설정