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

Iptables и SNAT

Я новичок в iptables с NAT. Моя сетевая настройка показана ниже

                  linuxbox2 (192.x.y.a)
                          |
(194.160.1.1)             |
linuxbox1(eth1)-------- Switch ----- ftpserver
(192.x.y.b)        

BOX1 и BOX2 имеют теги VLAN через коммутатор. BOX1 находится в теге VLAN с FTP-сервером. Таким образом, BOX2 для подключения к FTP-серверу должен маршрутизироваться через BOX1, который должен выполнять POSTROUTING (SNAT) и отправлять FTP-пакеты на FTP-сервер.

Интерфейс eth1 настроен с двумя IP-адресами, одним публичным и одним частным.

Весь трафик из BOX2 направляется в BOX1. Я добавил следующие правила в мои настройки iptables, присутствующие в BOX1

$IPTABLES -t mangle -A PREROUTING -p tcp --dport 21 -s 192.x.y.a -j ACCEPT
$IPTABLES -t mangle -A FORWARD -p tcp --dport 21 -s 192.x.y.a -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -t nat -A POSTROUTING -s 192.x.y.a -p tcp --dport 21 -j SNAT --to-source 194.160.1.1

Редактирование вопроса с новыми обновлениями

Если я пингую с BOX2 на BOX1, он работает нормально. Если я попытаюсь выполнить ftp на Ftpserver, то будет вызвана таблица NAT в скрипте iptables, присутствующем в BOX1, и ftp не будет успешным.

Если я выполняю tcpdump на eth1, я действительно вижу ftp-пакеты, поступающие из BOX2 в BOX1, но не отправляю пакетов из BOX1 на ftpserver.

IP 192.x.y.a.45388 > 10.p.q.r.21(ftpserver): S 1380128644:1380128644(0) 
win 5840 <mss 1460,sackOK,timestamp 16897

0, nop, wscale 2> IP 192.x.y.a.45388> 10.p.q.r.21: S 1380128644: 1380128644 (0) win 5840 IP 192.x.y.a.45388> 10.p.q.r.21: S 1380128644: 1380128644 (0) win 5840

Фактически 3 пакета отправляются из BOX2 в BOX1. Счетчики для различных цепочек, таких как предварительная маршрутизация, пересылка, показывают счет как 3, в то время как цепочка POSTROUTING в таблице NAT показывает счетчик 1. Но TCPDUMP не показывает ни одного пакета, уходящего на FTPSERVER.

Теперь, после некоторой настройки и добавления поддержки LOG в iptables, я обнаружил, что после получения NAT-пакетов пакеты направляются в ETH0 из BOX1. Итак, я исправил маршрутизацию, и теперь пакеты уходят через ETH1 на FTP-сервер и получают пакеты обратно с FTP-сервера на ETH1.

Но здесь начинается новая проблема. Моя настройка iptables говорит: - Принимаются только пакеты, имеющие соответствующее правило в IPTABLES [может быть противоречивым для использования другими], иначе ОТКАЗАНО.

Я сомневаюсь, что IP-адрес назначения пакета является публичным IP-адресом ETH1, который присутствует в BOX1. Будет ли пакет приниматься на маршрутизацию на узле принятия решения о маршрутизации, чтобы он прошел вперед?

Я вижу, что маршрутизация не выполняется, и пакет считается локальным пакетом, который УДАЛЯЕТСЯ, поскольку для него нет подходящего правила ...

Я слышал, что механизм отслеживания соединений хранит данные о пакетах, прошедших NAT ... так когда же исходный адрес пакета конвертируется обратно в исходный адрес назначения?

Проверьте изображение потока пакетов netfilter для большей ясности. http://l7-filter.sourceforge.net/PacketFlow.png

ПРИМЕЧАНИЕ. Все мои правила IPTABLE должны быть основаны на IP-адресе, а не на интерфейсе, поскольку есть вероятность изменения имен интерфейсов, но IP-адресов.

Удалите три приведенных выше правила и попробуйте добавить следующее:

$IPTABLES -t NAT -A POSTROUTING -s 192.x.y.a -j SNAT 192.x.y.b
$IPTABLES -A FORWARD -s 192.x.y.a -J ACCEPT

И введите следующую команду:

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

У вас также должно быть правило, подобное следующему в вашем брандмауэре:

$IPTABLES -t FILTER -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Это позаботится обо всех установленных / связанных соединениях, вместо того, чтобы создавать правила для каждого из них.