iptables 를 이용한 NAT gateway 서버 설정

네트워크 주소 변환(영어: network address translation, 줄여서 NAT)은 컴퓨터 네트워킹에서 쓰이는 용어로서, IP 패킷의 TCP/UDP 포트 숫자와 소스 및 목적지의 IP 주소 등을 재기록하면서 라우터를 통해 네트워크 트래픽을 주고 받는 기술을 말한다. 패킷에 변화가 생기기 때문에 IP나 TCP/UDP의 체크섬(checksum)도 다시 계산되어 재기록해야 한다. NAT를 이용하는 이유는 대개 사설 네트워크에 속한 여러 개의 호스트가 하나의 공인 IP 주소를 사용하여 인터넷에 접속하기 위함이다. 많은 네트워크 관리자들이 NAT를 편리한 기법이라고 보고 널리 사용하고 있다. NAT가 호스트 간의 통신에 있어서 복잡성을 증가시킬 수 있으므로 네트워크 성능에 영향을 줄 수 있는 것은 당연하다. 1위키백과에서 발췌

NAT gateway라고 써서 이게 뭐야? 라고 생각할 수 있는데 특별한 것은 아니고 우리나라 사람들 각 가정에 1개 씩은 있는 공유기를 생각하면 된다.

포스트 이름에서 알 수 있듯이 iptables 가 설치되어있어야 한다.

다음 그림과 같은 경우를 예로 적용해보자.

갤러리-추가예정

설정
Gateway 역할을 할 서버를 설정하는 것이므로 ‘LINUX server’에 접속해서 작업을 수행하면 된다.

우선 packet forwarding을 사용할 수 있도록 설정을 변경한다.

haedong@haedong:~:]$ sudo vi /etc/sysctl.conf
# 아래 변수를 찾아서 값을 1로 변경하거나 파일의 끝에 아래 끝 라인을 추가한다.
# net.ipv4.ip_forward = 0
net.ipv4.ip_forward = 1

즉시 적용(재부팅 시 초기화 되는 값) 시. 특별히 메시지가 출력되지는 않는다.

haedong@haedong:~:]$ sudo echo "1" > /proc/sys/net/ipv4/ip_forward

Rule 추가.

# forward chain 초기화
haedong@haedong:~:]$ sudo iptables -F FORWARD

# forward 기본정책 drop으로 설정
haedong@haedong:~:]$ sudo iptables -P FORWARD DROP

# iptables -A FORWARD -o 내부_인터페이스 -j ACCEPT
haedong@haedong:~:]$ sudo iptables -AFORWARD -o eth1 -j ACCEPT

# iptables -A FORWARD -o 내부_인터페이스 -j ACCEPT
haedong@haedong:~:]$ sudo iptables -A FORWARD -o eth1 -j ACCEPT

# 외부 연결을 위한 Msquerade 지정. 즉, 내부 장비들이 외부로 나갈 때 사용하는 공인 인터페이스
# iptables -t nat -A POSTROUTING -o 외부_인터페이스 -j MASQUERADE
haedong@haedong:~:]$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

확인

NAT 대역의 PC나 서버 (그림의 L2 스위치 아래의 장비들)에서 10.11.12.13으로 연결을 시도해보거나 외부 대역(google 등의 사이트)에 접속을 시도해서 연결되면 정상 설정이 된 것이다.

정책 저장

root@haedong:~:]# iptables-save > /etc/rules
root@haedong:~:]# cat /etc/roules
# Generated by iptables-save v1.4.21 on Sun Aug 15 11:11:11 2021
*nat
:PREROUTING ACCEPT [2427731:347878517]
:INPUT ACCEPT [311986:31601222]
:OUTPUT ACCEPT [397981:25498698]
:POSTROUTING ACCEPT [10937:657389]
-A POSTROUTING -o eth1 -j MASQUERADE
COMMIT
# Completed on Sun Aug 15 11:11:11 2021
# Generated by iptables-save v1.4.21 on Sun Aug 18 11:11:11 2021
*filter
:INPUT ACCEPT [16876214:11177798996]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [8626880:21607026946]
-A FORWARD -o eth0 -j ACCEPT
-A FORWARD -o eth1 -j ACCEPT
COMMIT
# Completed on Sun Aug 15 11:11:11 2021

정책 재적용

root@haedong:~:]# /sbin/iptables-restore < /etc/rules

Linux(CentOS7) 가상 네트워크 인터페이스 추가

NAT 구성 등을 위한 가상 인터페이스를 추가하는 방법을 설명알아보자.

인터페이스 정보 확인

[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.192.252  netmask 255.255.255.0  broadcast 192.168.192.255
        inet6 fe80::6d05:37d3:fb10:5b25  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:67:a4:a6  txqueuelen 1000  (Ethernet)
        RX packets 411  bytes 36267 (35.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 329  bytes 31013 (30.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 96  bytes 8376 (8.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 96  bytes 8376 (8.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

가상 인터페이스 생성
물리 인터페이스를 공유할 인터페이스 생성
ens33의 물리 NIC를 사용할 경우 ens33:0으로 생성한다.

[root@localhost ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33:0              
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33:0
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
# 인터페이스 명과 장치명이 겹치지 않도록 수정한다.
NAME=ens33:0
DEVICE=ens33:0
ONBOOT=yes

# 사용하고 싶은 IP로 변경한다.
IPADDR=192.168.192.253
PERFIX=24
GATEWAY=192.168.192.254

확인

[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.192.252  netmask 255.255.255.0  broadcast 192.168.192.255
        inet6 fe80::6d05:37d3:fb10:5b25  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:67:a4:a6  txqueuelen 1000  (Ethernet)
        RX packets 1046  bytes 93843 (91.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 703  bytes 78865 (77.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.192.253  netmask 255.255.255.0  broadcast 192.168.192.255
        ether 00:0c:29:67:a4:a6  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 104  bytes 9080 (8.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 104  bytes 9080 (8.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

인터페이스 정보를 확인하고 연결이 되는지 확인한다.

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\Users\haedong> ssh haedong@192.168.192.253
The authenticity of host '192.168.192.253 (192.168.192.253)' can't be established.
ECDSA key fingerprint is SHA256:en-----------------------0s3gUedMt8.
Are you sure you want to continue connecting (yes/no/[fingerprint])?