LINUX.ORG.RU
ФорумAdmin

Как настроить редирект ftp на машину локальной сети


0

0

Есть шлюз под Linux с внешним ip - x.x.x.x
Мне нужно, чтобы при попытке зайти на x.x.x.x заходило на локальную машину с адресом 192.168.0.10 на этой машине установлен ftp сервак.
Как этот редирект будет выгляедеть на шлюзе стоит iptables.
Напишите пример плиз.


Первый путь - пробрасывание только порта: 1) iptables -t nat -A PREROUTING -p tcp -d EXT_R_IP --dport 21 -j DNAT --to-destination 192.168.0.10:21 2) iptables -A FORWARD -i eth0 -d 192.168.0.10 -p tcp --dport 21 -j ACCEPT

Второй вариант - выброс всей машины наружу (если есть свободные адреса): 1) ifconfig eth0:0 NEW_IP netmask NETMASK broadcast BROADCAST 2) route add NEW_IP gw GW netmask 0.0.0.0 metric 1 dev eth0:0 3) iptables -t nat -A PREROUTING -p tcp -d NEW_IP -j DNAT --to-destination 192.168.0.10 4) iptables -A FORWARD -i eth0 -d 192.168.0.10 -j ACCEPT

EXT_R_IP - внешний IP роутера LOCAL_IP - внутренний IP машины, которую хочешь выбросить NEW_IP - новый IP на который хочешь посадить машину, которая имеет локальный LOCAL_IP NETMASK, BROADCAST, GW - внешние netmask, broadcast и gateway

anonymous
()

По-моему про подобный redirect последнее время было много вопросов, попробуйте поиск (ключевое слово DNAT).

spirit ★★★★★
()
Ответ на: комментарий от anonymous

Я пробовал делать редирект на роутере так как ты сказал.
Всё работает я захожу на адрес роутера как на фтп 192.168.0.10 и
попадаю на 194.190.67.118. Но вот когда я пытаюсь аналогичную хрень
сделать на шлюзей, то не пашет ни в какую. Я пытался сделать редирект
фтп на фтп роутера. Не получается хотя я на роутере добавил
route add -host x.x.x.x gw 192.168.0.1 eth0 x.x.x.x - внешний интерфейс.
Пробовал использовать в iptables всё открывать и только две строки
редиректа оставлять - не работает. Я думал, что может ядро собрано без
поддержки редиректа - я его пересобрал и включил все возможности сетевые
и iptables'а, но все равно не пашет. Помогите плиз. Правайдер мой сука
закрыл мне irc канал, так что мне не к кому за помощью обратиться.
Вот в чем проблема есть две подсети:
1. 192.168.0.0 - Первая сеть
в ней есть шлюз для доступа в интернет - eth1 192.168.0.1
eth0 x.x.x.x(внешний ip)
на шлюзе стоит firewall - iptables v1.2.3.
2. 194.190.67.0 - Вторая сеть.
В этой сети на машине с адресом 194.190.67.118 стоит ftp - сервер.
Эти две подсети соединены роутером, его я настраивал
вот как
route add -net 194.190.67.0 netmask 255.255.255.0 gw 194.190.67.10 eth1
route add -net 192.168.0.0 netmask 255.255.255.0 gw 192.168.0.10 eth0
На шлюзе 192.168.0.1 настроено вот так
route add -net 194.190.67.0 netmask 255.255.255.0 gw 192.168.0.10 eth1
На машине с ftp 194.190.67.118 тоже добавлен route add ...
На 194.190.67.118 заходит свободно из сети 192.168.0.0.
Мне нужно настроить, так чтобы когда из интернета заходили на на x.x.x.x (внешний ip), то редиректом запрос перенаправлялся на машину 194.190.67.118. Это у меня никак не получается. Помогите плиз.
Вот ниже приведена настройка iptables на шлюзе. Посмотрите как мне правильно настроить. Это вариант настройки я переделал из документации по iptables.
more /etc/rc.d/init.d/firewall
#!/bin/bash
IPTABLES="/sbin/iptables"
INET_IP="x.x.x.x"
INET_IFACE="eth0"
LAN_IP="192.168.0.1"
LAN_IP_RANGE="192.168.0.0/24"
LAN_IP_RANGE2="194.190.67.0/24"
LAN_BCAST_ADRESS="192.168.0.255"
LAN_BCAST_ADRESS2="194.190.67.255"
LAN_IFACE="eth1"
LO_IFACE="lo"
LO_IP="127.0.0.1"
echo "1">/proc/sys/net/ipv4/ip_forward
$IPTABLES -F
$IPTABLES -t nat -F
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -N bad_tcp_packets
$IPTABLES -N allowed
$IPTABLES -N tcp_packets
$IPTABLES -N icmp_packets
$IPTABLES -N udpincoming_packets
$IPTABLES -A INPUT -p all -i $LAN_IFACE -d $LAN_BCAST_ADRESS -j ACCEPT
$IPTABLES -A INPUT -p all -i $LAN_IFACE -d $LAN_BCAST_ADRESS2 -j ACCEPT
$IPTABLES -A INPUT -p all -i $LO_IFACE -s $LO_IP -j ACCEPT
$IPTABLES -A INPUT -p all -i $LO_IFACE -s $LAN_IP -j ACCEPT
$IPTABLES -A INPUT -p all -i $LO_IFACE -s $INET_IP -j ACCEPT
$IPTABLES -A INPUT -p all -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p all -i $LAN_IFACE -s $LAN_IP_RANGE2 -j ACCEPT
$IPTABLES -A INPUT -p all -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -p tcp -j bad_tcp_packets
$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP
$IPTABLES -A INPUT -p tcp -i $INET_IFACE -j tcp_packets
$IPTABLES -A tcp_packets -p tcp -s 0/0 --dport 113 -j allowed
#----
#$IPTABLES -A tcp_packets -p tcp -s 0/0 --dport 80 -j allowed
#$IPTABLES -A tcp_packets -p tcp -s 0/0 --dport 3128 -j allowed
$IPTABLES -A tcp_packets -p tcp -s 0/0 --dport 22 -j allowed
$IPTABLES -A tcp_packets -p tcp -s 0/0 --dport 20 -j allowed
$IPTABLES -A tcp_packets -p tcp -s 0/0 --dport 21 -j allowed
#----
$IPTABLES -A tcp_packets -p tcp -s 0/0 --dport 6660:6669 -j allowed
$IPTABLES -A allowed -p tcp --syn -j ACCEPT
$IPTABLES -A allowed -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A allowed -p tcp -j DROP
$IPTABLES -A INPUT -p udp -i $INET_IFACE -j udpincoming_packets
$IPTABLES -A udpincoming_packets -p udp -s 0/0 --source-port 53 -j ACCEPT
$IPTABLES -A INPUT -p icmp -i $INET_IFACE -j icmp_packets
$IPTABLES -A icmp_packets -p icmp -s 0/0 --icmp-type 8 -j ACCEPT
$IPTABLES -A icmp_packets -p icmp -s 0/0 --icmp-type 11 -j ACCEPT
$IPTABLES -A FORWARD -p tcp -j bad_tcp_packets
$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -p all -s $LO_IP -j ACCEPT
$IPTABLES -A OUTPUT -p all -s $LAN_IP -j ACCEPT
$IPTABLES -A OUTPUT -p all -s $INET_IP -j ACCEPT
$IPTABLES -t nat -A PREROUTING -i $INET_IFACE -p tcp -d $INET_IP --dport 20 -j DNAT --to-destination 194.190.67.118:20
$IPTABLES -t nat -A PREROUTING -i $INET_IFACE -p tcp -d $INET_IP --dport 21 -j DNAT --to-destination 194.190.67.118:21
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s 192.168.0.201 -j SNAT --to-source $INET_IP
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s 192.168.0.190 -j SNAT --to-source $INET_IP

Youra_P
() автор топика

> Не получается хотя я на роутере добавил "route add..."
Т.е. ping с router-а на x.x.x.x уже идет ?
> На машине с ftp 194.190.67.118 тоже добавлен route add ...
route add default gw 194.190.67.10 dev ethX

Немного проверил ваши правила... По-моему не удивительно, что не работает. Т.к. в PREROUTING делается DNAT на другой комп, то пакет считается проходящим сквозь шлюз (см. соответствующую таблицу прохождения пакетов в iptables tutorial). Первый пакет будет идти с флагом SYN на порт 21 (а после DNAT - уже и на внутренний IP). Далее он проходит цепочку FORWARD, а там:
0) -j bad_tcp_packets: подходит под "! --syn -m state --state NEW" ?
нет, "NEW+SYN" => проходит дальше;
1) "-i $LAN_IFACE -j ACCEPT" - не $LAN_IFACE => проходит дальше;
2) "-m state --state ESTABLISHED,RELATED -j ACCEPT" - state пакета = "NEW" => проходит дальше
3) правила кончились, делаем то, что в Policy, а там стоит -j DROP => пакет убивается.
Или я чего-то недосмотрел ?
Еще и вам скажу: я бы советовал в таких случаях делать "-j MARK --set-mark N", а потом эти пакеты будет легко отличить от других и запросто сделать им везде "-j ACCEPT". Да и в POSTROUTING (или в других местах) можно таким пакетам сделать -j LOG (или без -j), чтоб видеть до каких мест в сетевом фильтре они доходят. Хотя... выбирать вам.

spirit ★★★★★
()
Ответ на: комментарий от spirit

Вот посмотри так у меня тоже не работает.
Напиши самый простой пример, но только чтобы он работал.
Дальше я сам как-нибудь.
#!/bin/bash
IPTABLES="/sbin/iptables"
INET_IP="x.x.x.x"
INET_IFACE="eth0"
LAN_IP="192.168.0.1"
LAN_IP_RANGE="192.168.0.0/24"
LAN_IP_RANGE2="194.190.67.0/24"
LAN_BCAST_ADRESS="192.168.0.255"
LAN_BCAST_ADRESS2="194.190.67.255"
LAN_IFACE="eth1"
LO_IFACE="lo"
LO_IP="127.0.0.1"

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

$IPTABLES -F
$IPTABLES -t nat -F

$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT

$IPTABLES -t nat -A PREROUTING -p tcp -d $INET_IP --dport 21 -j DNAT --to 192.168.0.10:21
$IPTABLES -A FORWARD -i $INET_IFACE -d 192.168.0.10 -p tcp --dport 21 -j ACCEPT

Youra_P
() автор топика

А куда теперь SNAT делся ? :-)

iptables -t mangle -I PREROUTING 1 -i $INET_IFACE -p tcp -m multiport --dports 21,20 -j MARK --set-mark 1
iptables -t nat -I PREROUTING 1 -p tcp -m mark --mark 1 -j DNAT --to-destination 194.190.67.118
iptables -I FORWARD 1 -p tcp -m mark --mark 1 -j ACCEPT
iptables -t nat -I POSTROUTING 1 -p tcp -m mark --mark 1 -j SNAT --to-source 192.168.0.1
У меня кажется работает.

spirit ★★★★★
()

SNAT также можно делать и на обратном пути, т.е. для ответных пакетов идущих от 194.190.67.118 в inet. Так наверное даже правильнее будет.
Т.е.:
iptables -t nat -I PREROUTING 1 -i $INET_IFACE -p tcp -m multiport --dports 21,20 -j DNAT --to-destination 194.190.67.118
iptables -I FORWARD 1 -i $INET_IFACE -p tcp -d 194.190.67.118 -m multiport --dports 21,20 -j ACCEPT
iptables -I FORWARD 2 -o $INET_IFACE -p tcp -s 194.190.67.118 -m multiport --sports 21,20 -j ACCEPT
iptables -t nat -I POSTROUTING 1 -p tcp -s 194.190.67.118 -m multiport --sports 21,20 -j SNAT --to-source x.x.x.x
где x.x.x.x - ваш внешний адрес

P.S. Это тоже проверял, работает.

spirit ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.