Linux/iptables

[Linux] iptables NAT 구현

GGkeeper 2021. 11. 13. 05:31

실습> 리눅스에서 NAT 구현하기

nat 
POSTROUTING : Source NAT(SNAT) 타겟과 매칭되어 내부 네트워크에서 방화벽을 통해 외부로 나갈 때 사용
PREROUTING  : Destination NAT(DNAT)타겟과 매칭되어 주로 외부에서 방화벽 내부 서버로 향하는 패킷을 포워딩 할 때 사용
- OUTPUT      : nat 테이블을 빠져 나갈때 사용


                                     DNAT
                         108.101 ----------> 102.101
  [PC]----------------------[방화벽]-----------[WEB#1]
    108.1                108.3  102.254      102.101
                          108.101 <----------- 102.101
                                      SNAT
----------------------------- 참고 ----------------------------
iptables -t nat -A PREROUTING -d 목적지 -j DNAT --to 돌려줄IP주소

                     -t nat 
                DNAT((Destnation NAT) : 외부의 공인 IP를 내부의 사설IP로 포워딩 하는 경우 사용
            ---------------------->
   외부망 ------- [ firewall ] ------- 내부망
            <----------------------
                     -t nat 
                SNAT(Source NAT) : 내부의 사설 IP를 외부의 공인 IP로 변환할 때 사용
                MASQUERADE

iptables -t nat -A POSTROUTING -s 출발지 -o ens33 -j MASQUERADE
----------------------------- 참고 ----------------------------

포트 포워딩 형식 : 
iptables -t nat -A PREROUTING -d 목적지 -p tcp --dport 포트번호 -j DNAT --to 포워딩IP:포트

ex)
iptables -t nat -A PREROUTING -d 192.168.108.101 -p tcp --dport 80 -j DNAT --to 192.168.102.101:80

설명 : 
-t nat : 주소변환 테이블인 nat 테이블을 사용한다.
-A PREROUTING : 외부에서 내부로 들어오는 패킷은 nat 테이블의 PREROUTING 체인을 사용한다.
-d : 목적지 IP주소는 192.168.108.101 을 사용한다.
-p tcp : 프로토콜은 tcp 프로토콜을 사용한다.
--dport 80 : 목적지 포트는 80번으로 사용한다.
-j DNAT : 목적지를 주소를 변경한다
--to(--to-destination) 192.168.102.101:80 : 변경할 목적지는 192.168.102.101의 80포트로 설정한다.

실습> 리눅스에서 NAT 사용하기

          +-- ens33
          |
          |   +-- ens33 192.168.108.101
          |   |
          |   |     +-- ens37          +-- ens33
          |   |     |                  |
외부망 +---+[server1]+---- 내부망 --------+[server2]
     |    |   F/W   |                  |   WEB Server
     |    |         |                  |
     |    |         |                  192.168.102.101 VMnet2 (GateWay : 192.168.102.254)
     |    |         192.168.102.254  VMnet2
     |    |
     |    192.168.108.3  VMnet8(NAT) (GateWay : 192.168.108.2)
     |
     192.168.108.2

1. VMnet 추가
VMnet2 를 추가하고 네트워크를 아래처럼 설정한다.
네트워크 : 192.168.102.101/24
DHCP : 활성화

2. server1 설정
NIC카드(랜카드) 추가
NIC(Network Interface Card) : 통신을 하기 위한 장비
[root@server1 ~]# init 0

ens33
IP Address : 192.168.108.3
Subnet Mask : 255.255.255.0
Default Gateway : 192.168.108.2
DNS Server : 163.126.63.1
ens36
IP Address : 192.168.102.254 
Subnet Mask : 255.255.255.0
Default Gateway : x
DNS Server : x


VMnet 설정 후 네트워크를 설정한다.
[root@server1 ~]# nmtui
[root@server1 ~]# systemctl restart network
[root@server1 ~]# ip a
[root@server1 ~]# echo '192.168.108.3 www.sever1.kr server1' >> /etc/hosts  

3. Server2 설정

ens33
IP Address : 192.168.102.101
Subnet Mask : 255.255.255.0
Default Gateway : 192.168.102.254
DNS Server : 168.126.63.1


VMnet 설정 후 네트워크를 설정한다.
[root@server2 ~]# nmtui
[root@server2 ~]# systemctl restart network
[root@server2 ~]# ip a
[root@server2 ~]# hostname
server2.linuxmaster.net
[root@server2 ~]# echo '192.168.102.101 sever2.linuxmaster.net server2' >> /etc/hosts  

4. 방화벽 중지
server1과 server2 둘 다 firewalld를 중지시키고 서비스를 비활성화 한다.
[root@server1 ~]# systemctl stop firewalld
[root@server1 ~]# systemctl disable firewalld

[root@server2 ~]# systemctl stop firewalld
[root@server2 ~]# systemctl disable firewalld


[root@server1 ~]# yum -y install iptables-services
[root@server1 ~]# systemctl enable iptables


5. 통신 확인
Host OS (Windows)에서 192.168.102.101로 통신이 되는지 ping으로 확인한다.
C:\>ping 192.168.102.101

Ping 192.168.102.101 32바이트 데이터 사용:
192.168.2.101의 응답: 바이트=32 시간<1ms TTL=64
192.168.2.101의 응답: 바이트=32 시간<1ms TTL=64
192.168.2.101의 응답: 바이트=32 시간<1ms TTL=64
192.168.2.101의 응답: 바이트=32 시간<1ms TTL=64

192.168.2.101에 대한 Ping 통계:
    패킷: 보냄 = 4, 받음 = 4, 손실 = 0 (0% 손실),
왕복 시간(밀리초):
    최소 = 0ms, 최대 = 0ms, 평균 = 0ms


Host OS에서 192.168.108.3으로 통신이 되는지 ping으로 확인한다.
C:\>ping 192.168.108.3

Ping 192.168.108.3 32바이트 데이터 사용:
192.168.108.3의 응답: 바이트=32 시간<1ms TTL=64
192.168.108.3의 응답: 바이트=32 시간<1ms TTL=64
192.168.108.3의 응답: 바이트=32 시간<1ms TTL=64
192.168.108.3의 응답: 바이트=32 시간<1ms TTL=64

192.168.108.3에 대한 Ping 통계:
    패킷: 보냄 = 4, 받음 = 4, 손실 = 0 (0% 손실),
왕복 시간(밀리초):
    최소 = 0ms, 최대 = 0ms, 평균 = 0ms


6. DNAT/SNAT 설정
DNAT 설정 : 외부에서 내부망에 있는 192.168.102.101 서버로 들어올 수 있는 길을 열어주는 설정이다.
SNAT 설정 : 내부망있는 192.168.102.101 서버에서 외부로 나갈 수 있는 길을 열어주는 설정이다.

ens33 인터페이스에 IP주소 192.168.108.101 을 추가한다.
[root@server1 ~]# nmtui
ens33 : 192.168.108.101/24

[root@server1 ~]# systemctl restart network
[root@server1 ~]# ip a

nat 테이블에 DNAT 룰을 설정한다.
[root@server1 ~]# iptables -t nat -A PREROUTING -d 192.168.108.101 \
-j DNAT --to 192.168.102.101 -m comment --comment '108.101 -> 102.101'

nat 테이블에 SNAT 룰을 설정한다.
[root@server1 ~]# iptables -t nat -A POSTROUTING -s 192.168.102.101 \
-j SNAT --to 192.168.108.101 -m comment --comment '102.101 -> 108.101'

nat 테이블에 설정된 룰을 확인한다.
[root@server1 ~]# iptables -t nat -nL

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       all  --  0.0.0.0/0            192.168.108.101      /* 108.101 -> 102.101 */ to:192.168.102.101

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
SNAT       all  --  192.168.102.101      0.0.0.0/0            /* 102.101 -> 108.101 */ to:192.168.108.101


현재 설정된 룰을 iptables-save 명령어로 /etc/sysconfig/iptables 파일에 저장한다.
/etc/sysconfig/iptables 파일은 방화벽 룰이 저장된 파일로 부팅 시 방화벽이 시작되면 이 파일에 저장된 룰을 설정한다.
[root@server1 ~]# iptables-save > /etc/sysconfig/iptables

7. 포워딩 설정
포워딩이란 자신에게 온 패킷을 다른 네트워크로 전달해주는 역할을 한다.
라우터에서 다른 네트워크로 패킷을 전달해주는 것과 동일하다.

임시적으로 포워딩 설정 : echo 1 > /proc/sys/net/ipv4/ip_forward
영구적으로 포워딩 설정 : /etc/sysctl.conf 수정
[root@server1 ~]# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@server1 ~]# sysctl -p
net.ipv4.ip_forward = 1


8. 웹 서버 
내부망 server2에서 웹서버 패키지를 설치하고 웹 문서를 작성한다.
[root@server2 ~]# yum -y install httpd
[root@server2 ~]# systemctl enable httpd
[root@server2 ~]# systemctl start httpd

[root@server2 ~]# cd /var/www/html
[root@server2 html]# vi index.html


<html>
<head>
 <title> test server </title>
 <meta charset=utf-8>
</head>

<body>
192.168.102.101 server!
</body>

</html>

9. 접속 
브라우저에서 접속하면 아래처럼 192.168.102.101 서버의 웹문서 내용이 출력되어야 한다.
http://192.168.108.101/

192.168.102.101 server!