Назад | Перейти на главную страницу

Перенаправление трафика на удаленный сервер с помощью iptables

Я изо всех сил пытаюсь настроить инфраструктуру, в которой трафик репликации MySQL из экземпляра Amazon RDS пересылается по ссылке OpenVPN на второй сервер.

Существует экземпляр Ubuntu EC2, на котором запущен OpenVPN, с туннелем к серверу MySQL в другой инфраструктуре. Если бы я понял iptables правильно, должна быть возможность перенаправить трафик, полученный через порт 3306, на порт 3306 на другом (удаленном) IP-адресе и отменить процесс возврата трафика.

Настройка выглядит так:

|<--------- VPC ---------->|<-- internet -->|<--- Datacenter --->|


 RDS --> Public ip: 10.11.12.13
         EC2 instance
         VPC ip: 1.2.3.4               
                    OpenVPN ==== tunnel ===> MySQL server
                                             public ip: 9.10.11.12
                                             vpn ip: 5.6.7.8  

Оба экземпляра RDS и EC2 находятся в одном VPC, и я могу без проблем подключиться из экземпляра EC2 к серверу MySQL по ссылке OpenVPN, поэтому часть OpenVPN, похоже, работает нормально:

ssh root@5.6.7.8
mysql -uuser -p -h5.6.7.8

Я пробовал настраивать iptables выполнить переадресацию порта, но безуспешно. Мои текущие правила выглядят так:

$ iptables -L

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

Chain INET-PRIV (0 references)
num  target     prot opt source               destination

и

$ iptables -t nat -L -n

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:3306 to:5.6.7.8:3306
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:3306 to:5.6.7.8:3306

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       tcp  --  0.0.0.0/0            5.6.7.8             tcp dpt:3306 to:1.2.3.4

Может ли кто-нибудь подсказать, где я здесь ошибаюсь?

Извините, что вернул этот старый пост живым.

Отличная работа. И у меня есть еще один набор правил, который также работает для моего тестового примера.

Однако я не хочу использовать «средний» компьютер для доступа к серверу SQL, если вы не выполняете ssh localForward ранее. В противном случае любой, кто касается этого «поворота», получит «доступ» к месту назначения.

Итак, как этого добиться ....

Включена ли IP-переадресация в вашем ядре?

cat /proc/sys/net/ipv4/ip_forward

Он должен вернуть 1, если он включен, и 0, если он отключен. Если 0, сделать (как root)

echo 1 > /proc/sys/net/ipv4/ip_forward

Кроме того, почему у вас есть два правила ПЕРЕРАБОТКИ для одного и того же пункта назначения (хотя это не должно быть проблемой)?

Помимо того, что ваши правила верны, он, вероятно, заработает, как только вы включите ip_forward.

Еще один совет: используйте политику accept при пересылке и вводе только в целях тестирования.

Чтобы помочь вам в этом, этот сценарий должен установить некоторые более безопасные политики и включить вашу пересылку. Я сохранил SSH, чтобы не блокировать вас, настроить в соответствии с вашими потребностями (например, добавить правила для вашего VPN и т. Д.).

#!/bin/sh

# Enable IP-Forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward


### DEFAULT FIREWALL SETTINGS

# Flush all tables
iptables -F
iptables -t nat -F
iptables -X

# Set default policy to drop
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# Allow local process communication (optional, required for some services)
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Allow established and related connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow outgoing connections
iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT


### CUSTOM FIREWALL SETTINGS

# SSH (optional)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT

# MySQL Forwarding:
# Allow forwarding to 5.6.7.8 on port 3306
iptables -A FORWARD -p tcp --dport 3306 -d 5.6.7.8 -j ACCEPT

# Set NAT from 1.2.3.4:3306 to 5.6.7.8:3306
iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to-destination 5.6.7.8:3306
iptables -t nat -A POSTROUTING -p tcp -d 5.6.7.8 --dport 3306 -j SNAT --to-source 1.2.3.4

Изменить: О, и отключите IPv6, если вы его не используете.