В ответ на
пост с предложением выносить свои скрипты на суд гуру. Представляю вашему вниманию скрипт для быстрого проброса порта с внешнего интерфейса во внутреннюю сеть. Справку по использованию можно найти в самом скрипте.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
#!/bin/bash
#MAILTO: d n @ c s t e c h . r u
#При вызове передаём скрипту директиву, внешний порт, адрес и внутренний порт. #Типа так: getport addport 4242 192.168.0.100 80 #Пробросит внешний порт 4242 внутрь на 192.168.0.100:80
#TODO: #Научить скрипт выдирать INET_IP из интерфейса eth0
MAIN_SCRIPT_PATH="/etc/firewall-rules.sh" #Используется только в подсказке.
LOG_FILE="/var/portman/log" TMP_LOG_FILE="/tmp/portmontmp" DATE="/bin/date" IPTABLES="/sbin/iptables" SED="/bin/sed" CAT="/bin/cat"
INET_IP="123.4.567.890"
addport () { if < `whoami` != "root" > then echo "" echo "Ничего не выйдет! Ты не root." echo "" exit 1 fi
echo "Добавляем проброс с $INET_IP:$1 на $2:$3? (y - yes)" read Keypress
case "$Keypress" in "y") $IPTABLES -A tcp_packets -p TCP -s 0/0 --dport $1 -j allowed if < $? -ne 0 > then echo "" echo "Случилась беда! $IPTABLES не принял наши правила." echo "" exit 1 fi $IPTABLES -t nat -A PREROUTING -p tcp --dport $1 -d $INET_IP -j DNAT --to-destination $2:$3 if < $? -ne 0 > then echo "" echo "Случилась беда! $IPTABLES не принял наши правила." echo "" exit 1 fi
NOW_DATE=`$DATE` echo "$NOW_DATE Для $INET_IP:$1 добавлен проброс на $2:$3" >> $LOG_FILE
echo "iptables -A tcp_packets -p TCP -s 0/0 --dport $1 -j allowed" echo "iptables -t nat -A PREROUTING -p tcp --dport $1 -d $INET_IP -j DNAT --to-destination $2:$3" ;; *) echo "" echo "Отменено" exit 0 esac }
rmport () { if < `whoami` != "root" > then echo "" echo "Ничего не выйдет! Ты не root." echo "" exit 1 fi
echo "Удаляем проброс с $INET_IP:$1 на $2:$3? (y - yes)" read Keypress
case "$Keypress" in "y") $IPTABLES -D tcp_packets -p TCP -s 0/0 --dport $1 -j allowed if < $? -ne 0 > then echo "" echo "Случилась беда! $IPTABLES не принял наши правила." echo "" exit 1 fi $IPTABLES -t nat -D PREROUTING -p tcp --dport $1 -d $INET_IP -j DNAT --to-destination $2:$3 if < $? -ne 0 > then echo "" echo "Случилась беда! $IPTABLES не принял наши правила." echo "" exit 1 fi
$CAT $LOG_FILE > $TMP_LOG_FILE $SED "/$INET_IT.*$1.*$2.*$3/d" $TMP_LOG_FILE > $LOG_FILE
echo "iptables -D tcp_packets -p TCP -s 0/0 --dport $1 -j allowed" echo "iptables -t nat -D PREROUTING -p tcp --dport $1 -d $INET_IP -j DNAT --to-destination $2:$3" ;; *) echo "" echo "Отменено" exit 0 esac }
usage () { echo "" echo "Скрипт для быстрого добавления\удаления проброса с внешнего интерфейса." echo "В некотором роде является оболочкой для iptables." echo "Основной скрипт правил брандмауера лежит в $MAIN_SCRIPT_PATH" echo "" echo "Для добавления проброса используется команда вида:" echo "" echo "portman addport 4242 192.168.0.50 80" echo "Перенаправит запросы с 4242 порта внешнего интерфеса на 80 порт хоста 192.168.0.50" echo "" echo "portman rmport 4242 192.168.0.50 80" echo "Удалит вышеописанное перенаправление." echo "" echo "Скрипт должен запускаться с правами рута." echo "Скрипт яростно нуждается в наличии файла $LOG_FILE и правах записи в него." echo "В этом файле скрипт пытается вести актуальную базу добавленных портов." echo "При удалении проброса, скрипт самостоятельно удаляет и соответствующую строчку в файле." echo "ВАРНИНГ!!! После перезагрузки, в логе могут остатся мусорные записи для несуществующих правил." echo "Это не опасно, но неприятно при ручном контроле." echo "" exit 1 }
case "$1" in "addport") addport $2 $3 $4 ;;
"rmport") rmport $2 $3 $4 ;;
*) usage ;;
esac
exit 0
|
$CAT $LOG_FILE > $TMP_LOG_FILE
$SED "/$INET_IT.*$1.*$2.*$3/d" $TMP_LOG_FILE > $LOG_FILE
на:
$SED -i.bak -e "/$INET_IT.*$1.*$2.*$3/d" $LOG_FILE
Тогда сед будет прямо инлайн файл править, предыдущаю версия файла будет сохранена с расширением .bak.