CS/Linux

[Linux] NAT를 설정하는 방법

kyoulho 2024. 10. 5. 14:52

설정 요약

  1. IP 포워딩 활성화: 시스템이 내부 네트워크(eth0)와 외부 네트워크(eth1) 간에 패킷을 전달할 수 있도록 설정한다.
  2. 마스커레이딩(Masquerading) 활성화: public 존(eth1 인터페이스)에서 마스커레이딩을 설정하여 내부 네트워크의 IP 주소를 외부 인터페이스의 공인 IP로 변환한다.
  3. 네트워크 존 구성: 내부 인터페이스(eth0)를 internal 존으로 할당하고, 필요한 서비스(SSH, HTTP)를 허용한다.


네트워크 인터페이스 확인

내부 네트워크와 외부 네트워크에 연결된 인터페이스를 식별해야 한다. 다음 명령어로 현재 시스템의 네트워크 인터페이스를 확인할 수 있다:

ip addr

# 예시 출력:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
    inet 192.168.1.1/24 brd 192.168.1.255 scope global eth0
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
    inet 203.0.113.2/24 brd 203.0.113.255 scope global eth1
  • eth0: 내부 네트워크 (예: 192.168.1.0/24)
  • eth1: 외부 네트워크 (공인 IP: 203.0.113.2)


IP 포워딩 활성화

NAT가 작동하려면 시스템이 인터페이스 간에 IP 패킷을 포워딩할 수 있도록 설정해야 한다.

# sysctl.conf 파일을 편집한다.
sudo vi /etc/sysctl.conf

# 다음 줄을 추가하거나 수정한다.
net.ipv4.ip_forward = 1

# 변경 사항을 적용한다:
sudo sysctl -p

# 설정 확인:
sysctl net.ipv4.ip_forward

# 예상 출력:
net.ipv4.ip_forward = 1

 

firewalld를 이용한 NAT 설정

firewalld는 Rocky Linux의 기본 방화벽 관리 도구로, 동적으로 방화벽 규칙을 관리할 수 있는 유연한 인터페이스를 제공한다.

1. firewalld 설치 및 활성화

대부분의 Rocky Linux 설치에는 firewalld가 기본적으로 포함되어 있다.

sudo systemctl enable firewalld
sudo systemctl start firewalld

2. 마스커레이딩(Masquerading) 설정

마스커레이딩은 내부 네트워크의 IP 주소를 외부 인터페이스의 공인 IP로 변환하여 여러 장치가 단일 공인 IP로 인터넷에 접근할 수 있게 한다.

sudo firewall-cmd --zone=public --add-masquerade --permanent

3. 네트워크 존 구성

트래픽을 보다 효과적으로 관리하기 위해 네트워크 인터페이스를 적절한 존에 할당하자.
예를 들어, 내부 네트워크를 위한 internal 존을 생성하고 내부 인터페이스를 해당 존에 할당한다.

# 내부 네트워크를 위한 새로운 존 생성:
sudo firewall-cmd --permanent --new-zone=internal

# 내부 인터페이스를 internal 존에 할당:
sudo firewall-cmd --zone=internal --add-interface=eth0 --permanent
  • eth0 대신 실제 내부 네트워크 인터페이스 이름을 사용하자.

4. 필요한 서비스 허용

내부 네트워크에서 특정 서비스(예: SSH, HTTP)를 허용하려면 해당 서비스를 internal 존에 추가해야 한다.

#SSH와 HTTP 서비스 허용
sudo firewall-cmd --zone=internal --add-service=ssh --permanent
sudo firewall-cmd --zone=internal --add-service=http --permanent
  • 필요에 따라 HTTPS, DNS 등 다른 서비스도 동일한 방식으로 추가할 수 있다.

5. 방화벽 설정 적용 및 확인

구성이 완료되면 firewalld를 재로드 하여 변경 사항을 적용한다.

# 변경 사항 적용
sudo firewall-cmd --reload

# 마스커레이딩 상태 확인:
sudo firewall-cmd --zone=public --query-masquerade

# 예상 출력:
yes

# 내부 존 구성 확인:
sudo firewall-cmd --zone=internal --list-all

# 출력 예시:
internal (active)
  target: default
  services: ssh http
  interfaces: eth0

6. 내부 클라이언트 네트워크 설정

내부 네트워크의 모든 클라이언트가 NAT 서버의 내부 IP 주소를 기본 게이트웨이로 설정해야 한다. 또한 도메인 이름을 올바르게 해석할 수 있도록 적절한 DNS 서버 주소를 설정해야 한다. NAT 서버를 DNS 서버로 설정한다면 DNS 서버 설정을 해야 한다.

 

고급 설정 및 최적화

기본 NAT 설정 외에도 네트워크 요구 사항에 따라 추가적인 구성을 할 수 있다.

1. 포트 포워딩

포트 포워딩을 통해 외부 사용자가 내부 네트워크의 특정 서비스에 접근할 수 있도록 설정할 수 있다.

예시: 외부의 TCP 포트 8080을 내부 서버 192.168.1.100의 포트 80으로 포워딩

sudo firewall-cmd --zone=public --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.1.100 --permanent
sudo firewall-cmd --reload

# 확인:
sudo firewall-cmd --zone=public --query-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.1.100
# 예상 출력: yes

2. 방화벽 활동 로그 기록

방화벽을 통한 트래픽을 모니터링하여 문제를 진단하고 보안을 강화할 수 있다. firewalld 자체는 직접적인 로그 기능을 제공하지 않지만, firewalld와 연동된 로깅을 설정할 수 있다. 이 방법은 iptables를 직접 사용하지 않지만, firewalld가 내부적으로 iptables를 활용하므로 일부 연동된다.

예시: firewalld와 함께 auditd를 사용하여 특정 트래픽 로그 기록

# auditd 설치 및 활성화:
sudo dnf install audit -y
sudo systemctl enable auditd
sudo systemctl start auditd

# 방화벽 트래픽 로깅 규칙 추가:
sudo auditctl -a exit,always -F arch=b64 -S all -F key=firewalld

# 로그 확인:
sudo ausearch -k firewalld

3. 기본 거부 정책 설정

기본 존을 drop으로 설정하여 모든 비허용 트래픽을 차단한다.

sudo firewall-cmd --set-default-zone=drop

4. 필요한 서비스만 허용

각 존에서 필요한 서비스만 허용하도록 설정한다.

sudo firewall-cmd --zone=internal --add-service=ssh --permanent
sudo firewall-cmd --zone=internal --add-service=http --permanent
sudo firewall-cmd --zone=public --add-masquerade --permanent
sudo firewall-cmd --reload

5. IP별 접근 제한

특정 IP 주소나 서브넷에 대한 접근을 제한하여 보안을 강화할 수 있다.
예시: 특정 IP에서만 SSH 접근 허용

sudo firewall-cmd --zone=internal --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" accept' --permanent
sudo firewall-cmd --reload


DNS 서버 설정(선택)

내부 클라이언트들이 NAT 서버를 DNS 서버로 설정하면, NAT 서버에서 추가적인 DNS 서비스 구성이 필요다. dnsmasq와 같은 DNS 서버 소프트웨어를 설치하고 구성하며, 방화벽 규칙을 통해 DNS 트래픽을 허용해야 한다.

1. dnsmasq 설치

sudo dnf install dnsmasq -y

설치가 완료되면 dnsmasq 서비스가 자동으로 시작되지 않을 수 있으므로, 수동으로 시작하고 활성화해야 합니다.

2. dnsmasq 서비스 활성화 및 시작

sudo systemctl enable dnsmasq
sudo systemctl start dnsmasq

3. dnsmasq 설정 파일 편집

sudo vi /etc/dnsmasq.conf

# 아래는 주요 설정 항목과 그 설명이다.

# 인터페이스 설정
# dnsmasq가 내부 네트워크 인터페이스에서만 DNS 요청을 수신하도록 설정한다.
# eth0 대신 실제 내부 네트워크 인터페이스 이름과 NAT 서버의 내부 IP 주소로 변경
interface\=eth0
listen-address\=192.168.1.1


# DNS 포워더 설정
# 외부 DNS 서버로 DNS 요청을 포워딩하도록 설정한다. 예를 들어, Google의 DNS 서버를 사용할 수 있다.
server\=8.8.8.8
server\=8.8.4.4

# 캐싱 활성화
cache-size\=1000

# DHCP 기능 (선택 사항
# dnsmasq는 DHCP 서버 기능도 제공하므로, 필요에 따라 DHCP 설정을 추가할 수 있다.
dhcp-range\=192.168.1.50,192.168.1.150,12h

4. 설정 파일 저장 및 dnsmasq 재시작

설정을 완료한 후 파일을 저장하고 dnsmasq 서비스를 재시작하여 변경 사항을 적용한다.

sudo systemctl restart dnsmasq

5. 방화벽 규칙 설정

내부 클라이언트들이 DNS 서버에 접근할 수 있도록 방화벽 규칙을 설정해야 한다. firewalld를 사용하고 있으므로, dnsmasq가 사용하는 포트를 허용하도록 규칙을 추가한다.

# DNS 서비스 허용
# DNS는 기본적으로 TCP와 UDP의 53번 포트를 사용한다.
sudo firewall-cmd --zone=internal --add-port=53/tcp --permanent

sudo firewall-cmd --zone=internal --add-port=53/udp --permanent

# 규칙을 적용하기 위해 firewalld를 재로드한다.
sudo firewall-cmd --reload

# 규칙 확인
sudo firewall-cmd --zone=internal --list-ports

# 출력 예시:
53/tcp 53/udp

6. 클라이언트의 DNS 설정

각 내부 클라이언트의 네트워크 설정에서 DNS 서버 주소를 NAT 서버의 내부 IP 주소로 설정한다. 이는 DHCP 서버를 통해 자동으로 설정되거나, 수동으로 설정할 수 있다. dnsmasq가 DHCP 서버 기능을 제공하고 있다면, 클라이언트들은 DHCP를 통해 자동으로 DNS 서버 주소를 받을 수 있다.

728x90

'CS > Linux' 카테고리의 다른 글

[Linux] 마운트 개념 `df -h` 으로 이해하기  (0) 2024.12.11
[Linux] Firewalld vs Iptables  (0) 2024.10.05
[Linux] IP 주소를 얻는 내부 흐름  (0) 2024.10.04
[Linux] Xrdp 서버  (1) 2024.10.03
[Linux] GUI 방화벽 설정  (1) 2024.10.03