PDA

Bekijk de volledige versie : Изменять virtual-server, не перезагружая роутер?



Tronix
09-10-2006, 14:22
Доброго времени суток.

У меня обычно 21 порт проброшен на десктопный компьютер (т.е. в настройках включено Virtual Server). Но когда десктоп выключается, я выключаю Virtual Server, и соответственно в качестве FTP выступает уже не десктоп, а сам роутер. Единственный минус - приходится каждый раз перезагружать роутер.

Вопрос: нельзя-ли какими-либо манипуляциями с iptables делать тоже-самое, не перезагружаясь? Если вам не сложно, напишите пожалуйста полностью эти команды. Сам пытался разобраться, но тщетно (

И еще, я вообщем-то этот вопрос уже задавал, но конкретного ответа так и не последовало: Возможно-ли как-то отслеживать, есть-ли линк на LAN порте или его нету? В идеале с помощью скрипта, который выполнялся бы по crontab'у скажем каждые 5 минут.

В идеале хочется автоматизировать процесс: тоесть если есть линк на первом LAN порте, то FTP у нас на десктопе. Если линк пропал - то FTP переводим на роутер...

Заранее огромное спасибо за ответы.

P.S. wl500gP + Oleg's pre7 firmware.

Duke
09-10-2006, 15:16
Вариант один.
в post-firewall в конец добавляем

iptables -t nat -I PREROUTING -p tcp --dport 21 -j DNAT --to-destination $VServerIP
iptables -I INPUT -p tcp --dport 21 -j ACCEPT


выключаем комп, делаем

iptables -t nat -D PREROUTING 1

включаем комп - снова делаем.

iptables -t nat -I PREROUTING -p tcp --dport 21 -j DNAT --to-destination $VServerIP

Алгоритм таков - при включенном компе входящий на 21-й порт траффик натится на комп, при выключенном - начинает работать второе правило и роутер сам принимает пакеты.

Вариант 2.
Пробросить сдрогог опорта на ФТП компа, врезультате оба ФТП могут работать одновременно


iptables -t nat -I PREROUTING -p tcp --dport 2121 -j DNAT --to-destination $VServerIP:21
iptables -I INPUT -p tcp --dport 21 -j ACCEPT

Здесь по 21-му порту доступен ФТП роутера, по 2121 - компа.

Lesnix
09-10-2006, 21:58
чтобы автоматически выполнять команды по ssh-протоколу, есть замечательная тулза в комплекте с putty.
называется pslink, вроде.
:) ставь в шедулер ) при включении-выключении

Tronix
10-10-2006, 07:23
Duke: спасибо большое, сегодня вечером попробую. Вариант с двумя портами для меня не подходит, необходимо чтобы фтп был на стандартном порту. По результатам отпишусь.

Lesnix: спасибо за подсказку, посмотрю в этом направлении.

2All: Вот еще подумалось: ведь можно отслеживать включен десктоп или выключен по простому пингу с роутера на десктоп. Только не знаю, выдает ли команда ping какой-либо errorlevel, и можно ли его обработать в скрипте... Полез читать доки.

Lesnix
10-10-2006, 12:22
можно простой баш-скрипт написать :) типа


#!/bin/sh
reply_count=`ping -c 2 <ип компа> | grep "bytes from" | wc -l`
if [ $reply_count -gt 0 ]; then
<здесь необходимые тебе команды>
fi


Хотя я бы на твоем месте все-таки сделал всё это со стороны компа...

Tronix
10-10-2006, 12:26
можно простой баш-скрипт написать :) типа


#!/bin/sh
reply_count=`ping -c 2 <ип компа> | grep "bytes from" | wc -l`
if [ $reply_count -gt 0 ]; then
<здесь необходимые тебе команды>
fi


Оооо, спасибо, то, что нужно. Вечером попробую.

gaaronk
10-10-2006, 13:25
можно проще

if ! ping -c 2 $host1 > /dev/null 2>&1 ; then
<здесь необходимые тебе команды>
fi

Lesnix
10-10-2006, 14:58
...пошел учить матчасть :)

Tronix
10-10-2006, 17:39
Большое спасибо всем ответившим. В результате получилось примерно такое:

#!/bin/sh

PIDFILE=/opt/var/run/ping.pid

if ping -c 2 192.168.1.2 > /dev/null 2>&1 ; then
if ! [ -f $PIDFILE ]; then
echo "Desktop online" > $PIDFILE
iptables -t nat -I PREROUTING -p tcp --dport 21 -j DNAT --to-destination 192.168.1.2
fi
else
if [ -f $PIDFILE ]; then
rm -f $PIDFILE
iptables -t nat -D PREROUTING 1
fi
fi


Засунул это в /opt/etc/cron.5mins . Пока вроде полет нормальный. Посмотрим. Прошу модераторов тему пока не закрывать, есть еще некоторые вопросы с iptables, но попробую пока сам разобраться. Еще раз огромное спасибо всем.

Oleg
10-10-2006, 17:45
Я бы для удаления правила использовал

iptables -t nat -D PREROUTING -p tcp --dport 21 -j DNAT --to-destination 192.168.1.2

Tronix
10-10-2006, 18:30
Я бы для удаления правила использовал

iptables -t nat -D PREROUTING -p tcp --dport 21 -j DNAT --to-destination 192.168.1.2

Спасибо, пофикшено.

Tronix
10-10-2006, 19:34
Все бы хорошо, но когда с десктопной машины пытаюсь зайти на любой фтп, попадаю на свой собственный. Подскажите, пожалуйста, что не так?
/tmp/filter_rules

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:MACS - [0:0]
:SECURITY - [0:0]
:logaccept - [0:0]
:logdrop - [0:0]
-A SECURITY -p tcp --syn -m limit --limit 1/s -j RETURN
-A SECURITY -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j RETURN
-A SECURITY -p udp -m limit --limit 5/s -j RETURN
-A SECURITY -p icmp -m limit --limit 5/s -j RETURN
-A SECURITY -j DROP
-A INPUT -m state --state INVALID -j DROP
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -m state --state NEW -j ACCEPT
-A INPUT -i br0 -m state --state NEW -j ACCEPT
-A INPUT -i vlan1 -m state --state NEW -j SECURITY
-A INPUT -p udp --sport 67 --dport 68 -j ACCEPT
-A INPUT -j DROP
-A FORWARD -i br0 -o br0 -j ACCEPT
-A FORWARD -m state --state INVALID -j DROP
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -i vlan1 -m state --state NEW -j SECURITY
-A FORWARD -m conntrack --ctstate DNAT -j ACCEPT
-A logaccept -m state --state NEW -j LOG --log-prefix "ACCEPT " --log-tcp-sequence --log-tcp-options --log-ip-options
-A logaccept -j ACCEPT
-A logdrop -m state --state NEW -j LOG --log-prefix "DROP " --log-tcp-sequence --log-tcp-options --log-ip-options
-A logdrop -j DROP
COMMIT


/tmp/nat_rules

*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:VSERVER - [0:0]
-A PREROUTING -d 10.37.160.254 -j VSERVER
-A VSERVER -p tcp -m tcp --dport 8080 -j DNAT --to-destination 192.168.1.2:8080
-A VSERVER -p tcp -m tcp --dport 24939 -j DNAT --to-destination 192.168.1.2:24939
-A VSERVER -p udp -m udp --dport 24939 -j DNAT --to-destination 192.168.1.2:24939
-A PREROUTING -p udp -d 10.37.160.254 --sport 6112 -j NETMAP --to 192.168.1.0/24
-A POSTROUTING -p udp -s 192.168.1.0/24 --dport 6112 -j NETMAP --to 10.37.160.254
-A POSTROUTING -o vlan1 ! -s 10.37.160.254 -j MASQUERADE
-A POSTROUTING -o br0 -s 192.168.1.0/24 -d 192.168.1.0/24 -j MASQUERADE
COMMIT


post-firewall:

#!/bin/sh
iptables -D INPUT -j DROP
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i $1 -p tcp --dport 80 -j DNAT --to-destination $4:8080
iptables -A INPUT -j DROP

iptables -t nat -I PREROUTING -p tcp --dport 21 -j DNAT --to-destination 192.168.1.2
iptables -I INPUT -p tcp --dport 21 -j ACCEPT


Если нужна еще какая-то информация, я ее предоставлю. Совсем я запутался в iptables ( Чувствую что что-то перемудрил... Буду благодарен за ответ, заранее спасибо.

Duke
10-10-2006, 21:14
Добавь "-d 10.37.160.254" в скриптах в строки с PREROUTING (на сколько я понимаю именно на этот адрес ломятся на ФТП снаружи?)

Tronix
13-10-2006, 17:33
Duke: да, спасибо большое. Теперь все работает как надо (тьфу-тьфу-тьфу). Если бы еще thttpd запускался всегда, а не в зависимости от фазы луны; и php не вываливался бы с Segmentation fault, было бы вообще супер :)

Если кому-то надо, то в окончательном варианте скрипт выглядит так:

#!/bin/sh

PIDFILE=/opt/var/run/ping.pid

if ping -c 2 192.168.1.2 > /dev/null 2>&1 ; then
if ! [ -f $PIDFILE ]; then
echo "Desktop online" > $PIDFILE
iptables -t nat -I PREROUTING -p tcp --dport 21 -j DNAT --to-destination 192.168.1.2 -d 10.37.160.254
fi
else
if [ -f $PIDFILE ]; then
rm -f $PIDFILE
iptables -t nat -D PREROUTING -p tcp --dport 21 -j DNAT --to-destination 192.168.1.2 -d 10.37.160.254
fi
fi
Здесь 192.168.1.2 - адрес десктопа, 10.37.160.254 - адрес роутера во внешнем мире (WAN).

В /tmp/local/sbin/post-firewall всего одно правило:

iptables -I INPUT -p tcp --dport 21 -j ACCEPT

Спасибо всем за помощь в разрешении проблеммы.

Duke
13-10-2006, 20:07
вместо
-d 10.37.160.254 можно прописать
-d "$(nvram get wan_ipaddr)"
Надеюсь ненадо объяснять почему с такими настройками ФТП будет доступен только из локалки но не через нет?