본문 바로가기
Linux

iptables portforwarding (DNAT)

by Nirah 2023. 3. 14.

 

 

iptables를 설치

sudo yum install iptables
yum install iptables-services -y
sudo systemctl restart iptables

 

  1. 목적지 서버에서 포트 포워딩을 허용
    • 목적지 서버에서는 해당 포트로 들어오는 요청을 받을 수 있도록 포트를 열어야한다. 이를 위해 방화벽 규칙을 추가해야한다. 예를 들어, 목적지 서버에서 8080 포트를 열고 허용하려면 다음 명령어를 실행한다.
    • 이제 다른 서버에서 8080 포트로 요청을 보낼 때 목적지 서버가 해당 요청을 수신할 수 있다.
sudo iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT

 

2. 송신지 서버에서 포트 포워딩 규칙 추가

  • 송신지 서버에서는 iptables를 사용하여 외부에서 포트로 요청을 보내면 목적지 서버로 해당 요청을 전달하도록 포트 포워딩 규칙을 추가해야한다. 이를 위해 다음 명령어를 사용할 수 있다.
    • [LOCAL_PORT]: 송신지 서버에서 포트 포워딩을 적용할 로컬 포트
    • [DESTINATION_IP]: 목적지 서버의 IP 주소
    • [DESTINATION_PORT]: 목적지 서버에서 수신 대기중인 포트 번호
sudo iptables -t nat -A PREROUTING -p tcp --dport [LOCAL_PORT] -j DNAT --to-destination [DESTINATION_IP]:[DESTINATION_PORT]

 

예를 들어, 송신지 서버의 80 포트로 들어오는 요청을 목적지 서버의 8080 포트로 전달하려면 다음 명령어를 실행한다.

 

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination [DESTINATION_IP]:8080

 

 

그냥 동일 서버에 포트만 다르게 바꾸는 경우, 외부에서 80 포트로 들어오는 요청을 내부에서 8080 포트로 전달

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

 

DNAT

외부에서 20.20.20.20으로 들어온 패킷을 10.10.10.10으로 도착지를 바꿔주었다.

-iptables서버가 도착지를 바꿔줬다.

-포트포워딩에 사용된다.

# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 10.10.10.10

 

 

 

 

 

iptables를 다시 시작하면 규칙이 적용

sudo systemctl restart iptables
systemctl enable iptables

또는

sudo service iptables restart

 

이후 위 명령어처럼 저장이 필요할 때 service iptables save를 입력 해주시면 됩니다.

 service iptables save
 iptables-save

 

 

 

 

iptables 완전 초기화 하기

[root@localhost ~]# iptables -Z
[root@localhost ~]# iptables -X
[root@localhost ~]# iptables -F

 

 

 

[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

 

 

 

 

 

특정 포트만 접근 허용/차단 하기

 

[root@localhost ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

위와 같이 입력할 경우 tcp 22번 포트만 허용할 수 있습니다.

반대로 차단을 원하시면 ACCEPT를 DROP으로 바꿔주시면 됩니다.

그와 비슷하게 다음과 같이 입력하면 UDP 53번 포트만 허용합니다.

iptables -A INPUT -p udp --dport 53 -j ACCEPT

그 외에도 여러 포트를 한번에 허용하고 싶은 경우 22 가 아닌 22:25 와 같이 22~25 까지 허용할 수 있습니다.

iptables -A INPUT -p tcp --dport 22:25 -j ACCEPT

의미 : TCP 포트 22번 부터 25번까지 모두 허용

그 외에도 앞에 -s 옵션을 통해 출발지 주소를 적어주면 "특정 IP 주소에서 올때" 라는 조건도 걸 수 있습니다.

 

[root@localhost ~]# iptables -A INPUT -s 192.168.0.100 -p tcp --dport 22 -j ACCEPT
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  192.168.0.100        0.0.0.0/0            tcp dpt:22

 

 

 

 

특정 IP 주소 및 대역대 허용하기

[root@localhost ~]# iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  192.168.0.0/24       0.0.0.0/0

 

 

 

iptables 포트 포워딩 규칙을 보는 방법

PREROUTING 체인에서 DNAT 규칙이 사용되어 포트 포워딩이 구현되기 때문에 두가지 방법을 쓴다.

 

PREROUTING 체인을 확인

sudo iptables -t nat -L PREROUTING

DNAT 규칙을 확인

sudo iptables -t nat -L PREROUTING -n -v

 

 

 

iptables에서 모든 포트를 허용하려면 다음과 같은 규칙을 추가해야 합니다.

  1. INPUT, OUTPUT, FORWARD 체인에 대해 모든 트래픽을 허용하는 규칙을 추가합니다. 이를 위해 다음 명령어를 사용합니다.
  2.  
sudo iptables -A INPUT -j ACCEPT
sudo iptables -A OUTPUT -j ACCEPT
sudo iptables -A FORWARD -j ACCEPT

 

 

모든 NAT 규칙을 허용하는 규칙을 추가합니다. 이를 위해 다음 명령어를 사용합니다

sudo iptables -t nat -A POSTROUTING -j ACCEPT
sudo iptables -t nat -A PREROUTING -j ACCEPT

 

 

 

 

 

 

 

 

=============================================================

Forward MySQL port to another IP with IPTABLES

iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to 192.168.0.100:3306
iptables -A FORWARD -p tcp -d 192.168.0.100 --dport 3306 -j ACCEPT
iptables -t nat -A POSTROUTING  -j MASQUERADE

 

iptables-save