3 min read

iptables 도메인 기반 포트포워딩 설정하는 법 | iptables port forward on domain name instead of ip?


Local PC -> Bastion(EC2) -> RDS


Private Network에 존재하는 서비스에 접근 하기 위해 Bastion이나 Proxy를 사용하곤합니다.

Bastion을 사용하기 귀찮을땐 포트포워딩을 통해 단순 터널링만 한다면 iptables의 forward 기능을 사용하면됩니다.

하지만 AWS RDS Endpoint는 아래 예시처럼 도메인 네임으로 받습니다.


하지만 iptables패키지는 Domains name을 지원하지 않습니다.

그래서 dig를 이용한 꼼수를 씁니다.

dig google.com +short

해당 명령어는 google.com을 ip주소로 표시하는 역할을 합니다.

RDS는 Endpoint는 위 명령어 그대로 사용하면 되지만 ClusterEndpoint는 사정이 다릅니다.

아래는 ClusterEndpoint대상 dig 명령어 출력 결과입니다.

ubuntu@ip-1.1.1.1:/home/ubuntu# dig aok-sn-aurora.cluster-osndwubc0ao.ap-northeast-2.rds.amazonaws.com +short
aok-sn-aurora-instance-1.osndwubc0ao.ap-northeast-2.rds.amazonaws.com.
1.1.2.141
ubuntu@ip-1.1.1.1:/home/ubuntu# 

도메인 네임과 ip 두개 출력한 모습을 볼수있습니다.
저희가 찾는건 ip주소(1.1.2.141)이니 간단하게 tail로 추려낼수있습니다.

iptables -t nat -A PREROUTING -p TCP --dport 33306 -j DNAT --to-destination `aok-sn-aurora.cluster-osndwubc0ao.ap-northeast-2.rds.amazonaws.com +short | tail -1`:3306

이렇게 한다면 등록이야 되겠지만 도메인의 ip가 변경될 수도 있다는점도 고려하셔야합니다.

아래는 쉘스크립트입니다.

기존 포워딩 정책이 없다면 저렇게 설정하면됩니다.
기존 정책이있으면 FORWARD 번호에 맞춰 바꾸어야하는데 ip를 특정하는데 awk를 쓰던가해서 상황에 맞게 적용해야합니다.

#!/bin/bash

# 변수등록
ip=`dig rds.amazonaws.com +short | tail -1`

# 기존 포워딩 정책 삭제
iptables -D FORWARD 1

# 포워딩 등록
iptables -t nat -A PREROUTING -p TCP --dport 33306 -j DNAT --to-destination $ip:3306

작성되었으면 실행권한을 부여합니다.

ubuntu@ip-1.1.1.1:/home/ubuntu# sudo chmod +x /path/to/shell.sh

주기에 맞춰 crontab에 등록합니다.

ubuntu@ip-1.1.1.1:/home/ubuntu# sudo crontab -e
# 루트 권한으로 하루 한번 0시0분에 실행
0 0 * * * root bash /path/to/shell.sh

확인

ubuntu@ip-1.1.1.1:/home/ubuntu# sudo iptables -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             1.1.2.141           tcp dpt:mysql

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

안된다면 이걸 해보세요

1. iptables 가 활성화 되어있는지 확인하세요

systemctl status iptables
# 꺼져있으면 켜세요
systemctl start iptables && systemctl enable iptables

2. iptables forward 설정이 되어있는지 확인합니다.

vim /etc/sysctl.conf
- net.ipv4.ip_forward 항목에 주석을 해제하고 1로 변경합니다.
```
net.ipv4.ip_forward=1
```
- 적용
```
sysctl -p /etc/sysctl.conf
```