всем привет! знатоки bash'а подскажите конструкцию для следующей ситуации...
есть текстовый файл содержащий строки типа
192.168.0.10 85.15.24.68 1592
т.е. адрес источника, адрес назначения, порт назначения.
в скрипте я хочу сделать цикл, чтоб содержимое строки подставлялось в разные места команды, что то типа
while read line
do
iptables -t nat -A POSTROUTING -s $'1-й параметр в строке' -d $'2-й параметр' --dport $'3-й парметр' -j SNAT --to-source 78.105.12.1
done < $TEXTFILE
типа в сетке есть клиентбанки, и их нужно натить на определнные адреса и порты, в реальный адрес. и чтобы не писать много строчек для каждого клиентбанка, охота это сделать через цикл, чтобы потом, когда будут появляться новые клиентбанки, можно было просто редактировать текстовик.
Или может есть какое то более элегантное решение?
вобщем я сделал так, но может можно как то укоротить? или соптимизировать?
#!/bin/bash
TEXTFILE="/root/temp/addresses"
while read line
do
iptables -t nat -A POSTROUTING -s `echo -e "$line" |awk '{print $1}'` -d `echo -e "$line" |awk '{print $2}'` -p tcp --dport `echo -e "$line" |awk '{print $3}'` -j SNAT --to-source 212.220.129.40
done < $TEXTFILE
>while read line
> do
> iptables -t nat -A POSTROUTING -s $'1-й
>параметр в строке' -d $'2-й параметр' --dport $'3-й парметр' -j SNAT
>--to-source 78.105.12.1
> done < $TEXTFILEЧто касается bash-а -
tablicca() {
cat <<EOT
10.0.0.10 pop3.mail.ru 110
10.0.0.12 mail.ya.ru 25 #ну, и т.д.
EOT
}while read src dst dpt cmt; do
iptables -t nat -A POSTROUTING -s $src -d $dst --dport $dpt \
-j SNAT --to-source 78.105.12.1
done <( tablicca )Можно вместо вызова функции собственно cat <<EOT вставить. С функцией можно воспользоваться таблицей ещё раз, если понадобится.
>Что касается bash-а -
>
>tablicca() {Вот ещё пример: как я у себя форварды портов клиентам на firehol (он сам - на баше) делал.
#Forward pords
fwd_mail() {
for pp in 110 25; do #pop3+smtp
##### vv---тут ошибка: dst адрес не проверяется, но не суть
dnat to "$3:$pp" inface "$2" src "$1" proto tcp dport "$((pp+${4:-0}))"
done
snat to "$PUBLIC_MYIP" outface eth2 src "$1" dst "$3"
}
do_mail_clients() {
#"Таблица" клиентов port-forwarding-а: pop3+smtp => внеш.сервер
fwd_mail "10.1.2.5 10.1.2.7 10.1.2.34" eth1 "$MAIL_SVR1"
fwd_mail "192.168.13.115" eth0 "$MAIL_SVR1"
#
MCLIENTS="192.168.13.52 192.168.13.96"
fwd_mail "$MCLIENTS" eth0 "$MAIL_SVR2"
fwd_mail "$MCLIENTS" eth0 "$MAIL_SVR3" 5000
fwd_mail "$MCLIENTS" eth0 "$MAIL_SVR4" 6000
}
do_mail_clients #####(1)### ROUTER:
router nat
#
fwd_mail() {
server "smtp pop3" accept dst "$3" inface "$2" src "$1"
}
do_mail_clients #####(2)Вызов (1) генерирует несколько вызовов функций dnat и snat firehol. Они д.б. до первой "секции" router. Вызов (2) уже внутри секции router вызывает команды server с набором параметров... Изменение "генерируемых" команд - через переопределение "промежуточной функции. Цикл while read писать было скушно и утомительно, поэтому :) строки таблицы в виде вызовов своей функции (м.б. навеяно структурой самого firehol).
что такое 'cmt' в while read src dst dpt cmt; do
и потом таблица где составляется, в теле скрипта?
по этому примеру получилось лучше это то что мне было нужно, модифицировал под себя
while read src dst dport; do
iptables -t nat -A POSTROUTING -s $src -d $dst -p tcp --dport $dport -j SNAT --to-source 212.220.129.40
done < $TEXTFILEданные хранятся в текстовике потому что надо чтобы, некоторые люди, когда меня нет на месте длительное время, могли добавлять туда других клиентов не вникая в сущность Iptables
Большое спасибо за помощь!