ftp server iptables mark fwmark rp_filter nat route

Челябинская область

Автор:Dmitriy Altuhov

ftp server iptables mark fwmark rp_filter nat route

Пробемы с маршрутизацией на машине с несколькими интерфейсами?
Не ходит трафик через недефолтный (non-default) гейтвей (gateway)?

Итак..задача стояла следущая… сделать корпоративный FTP (FTPS) сервер для обмена большими файлами.
Дано: ADSL-модем Cisco, линуксовый маршрутизатор с 3 сетевушками (eth0 = ADSL 2; eth1 = LAN 3;eth2,ppp0 = 2-ом провайдеру)
По умолчанию (default gateway) стоит 2-ой провайдер (доступ через PPTP) (IP сервый)
на АДСЛ-модеме поднимается PPPOE-сессия до 1-го провайдера и получается статический белый IP.

В идеале конечно перенести подключение PPPOE-сессии на линуксовый маршрутизатор, а ADSL-модем в режим бриджа перевести. Решило бы проблему прописывания NAT-правил на ADSL-модеме…но пока не до этого…
Поднимаем FTP-сервер (с SSL), рекомендую FileZilla Server на одной из машинок в локальной сети (на которой будет папка для обмена файлами).

Теперь осталось «самое простое», на что потратил почти целый день: сделать возможность работать с этим FTP-сервером из интернета (через белый IP, который присваевается ADSL-модему).
Сложность в том, что ADSL-модем не является маршрутом по-умолчанию. Значит нужно «играть» с маршрутизацией.

1) Делаем новую таблицу маршрутизации
echo «201 T1» >> less /etc/iproute2/rt_tables

2) в данную таблицу добавляем маршрут по-умолчанию через ADSL-модем
ip route add default via 192.168.1.2 table T1

3) создаём правило маршрутизации, чтобы промаркированные пакеты шли через данную таблицу
ip rule add fwmark 2 lookup T1

4) настраиваем правила iptables чтобы пакеты FTP-сервера с локальной машины 192.168.0.123 маркировались и пропускались

-t mangle -A PREROUTING -s 192.168.0.123/32 -d ! 192.168.0.123/32 -i eth1 -p tcp -m tcp —sport 21 -j MARK —set-mark 0x2
-t mangle -A PREROUTING -s 192.168.0.123/32 -d ! 192.168.0.123/32 -i eth1 -p tcp -m tcp —sport 10000:10010 -j MARK —set-mark 0x2
-t filter -A FORWARD -s 192.168.0.123/32 -p tcp -m tcp —sport 21 —dport 1024:65535 -j ACCEPT
-t filter -A FORWARD -s 192.168.0.123/32 -p tcp -m tcp —sport 10000:10010 —dport 1024:65535 -j ACCEPT
-t filter -A FORWARD -d 192.168.0.0/24 -j ACCEPT

5) самое главное! выполняем и ставим в автозапуск команду для соотвествующего интерфейса ADSL-модема

echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter

6) очищаем кеш маршрутизатора

ip route flush cache

7) настраиваем ADSL-модем (Cisco) для проброса портов на машинку с фтп-сервером

ip nat inside source static tcp 192.168.0.123 21 interface Dialer1 1234
ip nat inside source static tcp 192.168.0.123 10000 interface Dialer1 10000
ip nat inside source static tcp 192.168.0.123 10001 interface Dialer1 10001
ip nat inside source static tcp 192.168.0.123 10002 interface Dialer1 10002
ip nat inside source static tcp 192.168.0.123 10003 interface Dialer1 10003
ip nat inside source static tcp 192.168.0.123 10004 interface Dialer1 10004
ip nat inside source static tcp 192.168.0.123 10005 interface Dialer1 10005

8) в настройках FileZilla Server необходимо включить пассивный режим, вручную указать ваш внешний IP-адрес, который получает ADSL-модем и настроить диапазон портов для DATA-соединения следующий 10000-10010 и ограничить количество одновременных подключений = 7. Остальные настройки (пользователи, папки, SSL) — сами, под ваши нужды.
Всё должно работать! Ваш FTP-сервер будет виден по белому IP-адресу на порту 1234, получаемому модемом.
Если есть какие-то проблемы — пишите комментарии к этому посту и проверяйте настройки всего и вся, где-то что-то забыли, в данной заметке не полностью описаны настройки сервисов, а только части необходимые для решения конкретной задачи по FTP-серверу

Текст ниже взят со страницы  hexbot.blogspot.com/2009/03/2-connmark.h tml
Допустим на PC у нас работает SMTP сервер, и необходимо чтобы он обрабатывал соединения поступающие на любой из внешних адресов. Для этого понадобятся правила DNAT:
$IPTABLES -t nat -A PREROUTING -i $GLOBAL_ETH_PRIM -d $GLOBAL_IP_PRIM -p tcp —dport 25 -j DNAT —to-destination $PC
$IPTABLES -t nat -A PREROUTING -i $GLOBAL_ETH_SEC -d $GLOBAL_IP_SEC -p tcp —dport 25 -j DNAT —to-destination $PC

И следующий набор правил:
$IPTABLES -t mangle -A PREROUTING -i $LOCAL_ETH -m state —state ESTABLISHED -j CONNMARK —restore-mark
$IPTABLES -t mangle -A FORWARD -i $GLOBAL_ETH_PRIM -m state —state NEW -j CT
$IPTABLES -t mangle -A FORWARD -i $GLOBAL_ETH_SEC -m state —state NEW -j CT

В первой строке мы восстанавливаем маркер, установленный модулем CONNMARK, причем необходимо явно указать, что применяется это к пакетам идущим из внутренней подсети, либо добавить в таблицы маршрутизации пути к локальной подсети, иначе некорректно будут отрабатыватся правила DNAT. Все новые пакеты отправляются на маркировку в пользовательскую цепочку CT вот она:
$IPTABLES -t mangle -N CT

$IPTABLES -t mangle -A CT -i $GLOBAL_ETH_PRIM -p tcp —dport 25 -j CONNMARK —set-mark 1
$IPTABLES -t mangle -A CT -i $GLOBAL_ETH_SEC -p tcp —dport 25 -j CONNMARK —set-mark 2

Пакеты маркируются в соответствии с интерфейсом получения. В принципе маркировать пакеты, приходящие на интерфейс по умолчанию не обязательно. Вот и все, если не считать правил, разрешающих прохождение пакета.

Comments Are Closed!!!