LinuxForum.Fans
Тема

Сервер Linux как шлюз

Автор: yuriisa 65 сообщений 8591 просмотров
#369876
moshell написал:

нужно что то в роде "вызов скрипта(функции/демона/etc) на основе какого то события"
и cron не нужен

События - они разные бывают. Может inotify поможет?

#369877

было бы круто на уровне ядра.
чтоб было монолитно и не костыляво.
ядро сказало "да" и тут же запустился скрипт, или это из области фантастики?
безопасность и прочая лабуда

#369912
"lone_wolf" написал:
ну скажем делается раз в 5 минут проверка пингом IP2 и если он не доступен то Стирается правило в табле :
text
IP2="192.168.1.1"
if ping -c1 $IP2; then
 # пингуется
 : # пустой оператор нужен для синтаксиса
else
  # не пингуется
  echo "не пингуется, TODO здесь нужно правила переписывать
fi
#369914
"moshell" написал:
не люблю крон, когда уже все будет основано на событиях?

на КАКИХ?

"moshell" написал:
ядро сказало "да" и тут же запустился скрипт, или это из области фантастики?
безопасность и прочая лабуда
чего вы хотите-то?

напомню:

Иногда один из каналов перестает работать

мыши перегрызли витуху, ядро сказало "да"?

#369941

"drBatty" написал:
text
if ping -c1 $IP2; then # пингуется 
 : # пустой оператор нужен для синтаксиса
else # не пингуется
 echo "не пингуется, TODO здесь нужно правила переписывать"
fi

Тогда уж
text
if ! ping -c1 $IP2 1>/dev/null 2>/dev/null; then # не пингуется 
 echo "не пингуется, TODO здесь нужно правила переписывать"
fi
#369950

bormant, я шаблончик сделал, который и сам по себе работает, и видно, как его дальше менять. Ну ваш вариант тоже годен. Как недостаток(ИМХО) -- он молча выполняется.

#370223
lone_wolf написал:
[quote=yuriisa][quote="lone_wolf"]думаю это придется делать через скриптик с проверками

можете "озвучить"?[/quote]
к сожалению я в написании скриптов так же селен как в балете :[
но общяя концепция такова :
ну скажем делается раз в 5 минут проверка пингом IP2 и если он не доступен то Стирается правило в табле :
[console]iptables -t nat -I PREROUTING --dport 1126 -j DNAT --to IP2:1126
iptables -I FORWARD -d IP2 --dport 1126 -j ACCEPT[/console]
и добавляет новое :
[console]iptables -t nat -I PREROUTING --dport 1126 -j DNAT --to IP3:1126
iptables -I FORWARD -d IP3 --dport 1126 -j ACCEPT[/console][/quote]

При попытке прописать правило в таблицу выдает сообщение "iptables v1.4.8: unknown option `--dport'", в хелпе по iptables нет описание команды `--dport', связано ли это с версией ОС или iptables, или ошибка в самом тексте правила?

#370226
"yuriisa" написал:
При попытке прописать  правило в таблицу выдает сообщение "iptables v1.4.8: unknown option `--dport'", в хелпе по iptables нет описание команды `--dport', связано ли это с версией ОС или iptables, или ошибка в самом тексте правила?

в студию
[console]sudo iptables -V[/console]

#370229

root@sk:~# sudo iptables -V
iptables v1.4.8

#370230

признаю допустил косяк надо так :
[console]iptables -t nat -I PREROUTING -p tcp --dport 1126 -j DNAT --to IP2:1126
iptables -I FORWARD -d IP2 -p tcp --dport 1126 -j ACCEPT[/console]
ну так как неизвестно по какому протоколу идут пакеты я для наглядности написал tcp

#370233

Спасибо!
Правила прописал, протестирую работу - отпишу

#370370
lone_wolf написал:
признаю допустил косяк надо так :
[console]iptables -t nat -I PREROUTING -p tcp --dport 1126 -j DNAT --to IP2:1126
iptables -I FORWARD -d IP2 -p tcp --dport 1126 -j ACCEPT[/console]
ну так как неизвестно по какому протоколу идут пакеты я для наглядности написал tcp

настроил по вашему шаблону проброс портов, с ip1:1126 на ip2:1130
[console]iptables -t nat -I PREROUTING -p tcp --dport 1126 -j DNAT --to IP2:1130
iptables -I FORWARD -d IP2 -p tcp --dport 1130 -j ACCEPT[/console]

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

[console]root@sk:~# iptables -L -t nat -v
Chain PREROUTING (policy ACCEPT 3 packets, 156 bytes)
pkts bytes target prot opt in out source destination
3 156 DNAT tcp -- any any anywhere anywhere tcp dpt:1126 to:XXX.XXX.XXX.XXX:1130

Chain POSTROUTING (policy ACCEPT 8 packets, 454 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 5 packets, 298 bytes)
pkts bytes target prot opt in out source destination[/console]

но на порт 1130 ip2 не доходят.. Подскажите, где может в чем может быть проблема?

#370393

эм есче бы увидеть :
[console]iptables -L -n -t filter -v[/console]

#370493
lone_wolf написал:
эм есче бы увидеть :
[console]iptables -L -n -t filter -v[/console]

XXX.XXX.XXX.XXX - статический ip на который настраиваем проброс портов (он же ip2)

[console]root@sk:~# iptables -L -n -t filter -v
Chain INPUT (policy ACCEPT 8619 packets, 1132K bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:1130
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:1126
12306 1515K ISPMGR all -- * * 0.0.0.0/0 0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
12 624 ACCEPT tcp -- * * 0.0.0.0/0 XXX.XXX.XXX.XXX tcp dpt:1130
28 1456 ACCEPT tcp -- * * 0.0.0.0/0 XXX.XXX.XXX.XXX tcp dpt:1126

Chain OUTPUT (policy ACCEPT 9428 packets, 1400K bytes)
pkts bytes target prot opt in out source destination
12363 1849K ISPMGR all -- * * 0.0.0.0/0 0.0.0.0/0

Chain ISPMGR (2 references)
pkts bytes target prot opt in out source destination [/console]

#370496

ну вот тут ясно видно что пракеты на статический ip уходят
[console]Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
12 624 ACCEPT tcp -- * * 0.0.0.0/0 XXX.XXX.XXX.XXX tcp dpt:1130
28 1456 ACCEPT tcp -- * * 0.0.0.0/0 XXX.XXX.XXX.XXX tcp dpt:1126[/console]

#370499
lone_wolf написал:
ну вот тут ясно видно что пракеты на статический ip уходят
[console]Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
12 624 ACCEPT tcp -- * * 0.0.0.0/0 XXX.XXX.XXX.XXX tcp dpt:1130
28 1456 ACCEPT tcp -- * * 0.0.0.0/0 XXX.XXX.XXX.XXX tcp dpt:1126[/console]

Тоесть по этому правилу пакеты которые приходят на статический ip шлюза с линуксом порт 1126 (ip1:1126) перебрасываются на ip2:1130, и наоборот пакеты в ответ пришедшие с ip2:1130 уходят на ip1:1126 ?

#370502

хотя я тут почитал интернет и оказалось что я был прав только на половину...
ну в общем пробуем сделать так :
1 - убираем правило FORWARD
2 - делаем вот так :
[console]iptables -t nat -I PREROUTING -p tcp -d IP1 --dport 1126 -j DNAT --to IP2:1130
iptables -t nat -I POSTROUTING -d IP2 -p tcp --dport 1130 -j SNAT --to-source IP1[/console]

З.ы. не гарантирую что все получится, но по логике вроди должно работать :[

#370504

получилось так:
IP1 - адрес шлюза с линуксом
IP2 - адрес на интернет канале 1
IP3 - адрес на интернет канале 2

переброс пакетов с ip1:1126 на ip2:1130 и обратно c ip2:1130 на ip1:1126

[console]iptables -t nat -A PREROUTING --dst ip1 -p tcp --dport 1126 -j DNAT --to-destination ip2:1130

iptables -I FORWARD 1 -d ip2 -p tcp -m tcp --dport 1130 -j ACCEPT

iptables -t nat -A POSTROUTING --dst ip2 -p tcp --dport 1130 -j SNAT --to-source ip1:1126[/console]

Теперь возник вопрос №2:
Как написать скрипт, чтоб проверял какой из ip адрес доступен (ip2 или ip3) и если ip2 недоступен, то эти правила удалялись и прописывались для переброса с ip1 на ip3.

#370505
lone_wolf написал:
хотя я тут почитал интернет и оказалось что я был прав только на половину...
ну в общем пробуем сделать так :
1 - убираем правило FORWARD
2 - делаем вот так :
[console]iptables -t nat -I PREROUTING -p tcp -d IP1 --dport 1126 -j DNAT --to IP2:1130
iptables -t nat -I POSTROUTING -d IP2 -p tcp --dport 1130 -j SNAT --to-source IP1[/console]

З.ы. не гарантирую что все получится, но по логике вроди должно работать :[

спасибо! сначала написал а потом увидел ваше сообщение :) у вас все правильно, только я пользуясь чужим примером добавил разрешающее правило FORWARD таблицы filter :)

#370514
"yuriisa" написал:
спасибо! сначала написал а потом увидел ваше сообщение   у вас все правильно, только я пользуясь чужим примером добавил разрешающее правило FORWARD таблицы filter

ну я изначально и советовал в цепочку FORWARD таблицы Filter добавить правило прохождения пакета.

Войдите или зарегистрируйтесь, чтобы ответить.