我需要一个脚本来添加用户工作站 IP /etc/sysconfig/iptables
,然后运行service iptables reload
.我需要相同类型的脚本来从 iptables 中删除此规则。
我在另一个论坛上找到了下面的代码。
这在某种程度上是我需要做的。这包括添加和消除选项,但adduser
它需要反映 iptable 规则,例如
iptables -I INPUT 1 -p tcp -s xxx.xxx.xx.xxx --dport 22 -m comment --**comment "testing for user1" -j ACCEPT
.
ip地址本身需要作为参数传递,所以我可以执行
./script 155.154.15.00
我使用的是 RHEL 6.4 版本。
如有任何反馈,我们将不胜感激。
#!/bin/bash
clear
echo "########## MENU ############\n"
options=("add_user" "delete_user" "exit")
select opt in "${options[@]}"
do
case $opt in
"add_user")
clear
while [ 1 ]
do
clear
echo "1. Add user manually"
echo "2. Add user via TXT file"
read -p "Enter your choice" ch
case $ch in
1)
read -p "Enter user name : " useradd
read -p "Enter user password:" passwd
echo -e "Successfully added the user"
;;
2)
if [ $(id -u) -eq 0 ]; then
for row in `more $1`
do
username=${row%:*}
password=${row#*:}
egrep "^$username" /etc/passwd >/dev/null
if [ $? -eq 0 ]; then
echo "$username exists!"
exit 1
else
pass=$(perl -e 'print crypt($ARGV[0], "password")' $password)
useradd -m -p $pass $username
[ $? -eq 0 ] && echo "User has been added to system!" || echo "Failed to add a user!"
fi
done
else
echo "Only root may add a user to the system"
exit 2
fi
esac
done
;;
"delete_user")
read -p "Enter a User name to delete "UNAME
passwd
userdel $UNAME
echo "User $UNAME has been deleted"
;;
"exit")
break
;;
esac
done
答案1
我对此的处理方式略有不同。我保留了一个静态 iptables 配置,它可以跳转到特殊(最初为空)链。
然后我通过 cron 作业异步更新这些特殊链。您可以循环遍历仅具有 IP 地址/主机名的辅助数据源,并每 N 分钟刷新并更新链(或者更好,不要刷新并删除过时的规则...)
通过缩小自动化编辑的范围,可以稍微隔离系统的 iptables。
注意:您可以通过以下两种方式之一编辑活动规则:
-D, --删除链规则规范 -D, --删除链规则号 从所选链中删除一条或多条规则。该命令有两个版本:规则可以指定为数字 链中的 ber(从第一条规则的 1 开始)或要匹配的规则。
如果您使用规则编号,则转储规则并根据其编号选择规则编号。笔记!这有一个固有的竞争条件!如果您指定规则规范,则只需指定该规则具有的所有相同参数,该规则就会被选择删除。
答案2
没有完全类似的工具可以从iptables
规则集中添加或删除单个规则。
就我个人而言,我会使用iptables-save
将当前规则集发送到临时文件,然后您可以使用类似awk
或 之类的工具对其进行修改grep
(例如,用于grep -v "$WORKSTATION_IP"
删除已经存在的任何潜在重复项,然后cat "$NEWRULE" >> $TMPFILE
附加新规则),然后用于iptables-restore
推送更新的规则集。
我不确定service iptables restart
恢复后是否需要。我希望不会,但手册页并不明确,所以我会进行实验。
您可以编写模拟您想要的功能的函数。也许是这样的:
function add_iptables_rule {
cat <(iptables-save) <(echo "$@") | iptables-restore
}
function del_iptables_rule {
iptables-save | grep -v "$@" | iptables-restore
}
然而,自动化这一过程是相当危险的。要非常小心地进行彻底的测试。我会从这样开始,iptables-save > /etc/iptables.backup
这样你就可以随时回到一开始。
我喜欢通过使用单独的规则链来增强这种方法的想法,正如 @rrauenza 在单独的答案中所建议的那样,以限制自动化的范围。更少出错。
参考
http://linux.die.net/man/8/iptables-save
http://linux.die.net/man/8/iptables-restore
答案3
这里的容器以简化的方式...您需要填写您想要的代码
#!/bin/bash
#
# ----------------------------------------------------------------------- #
# Here below it prints the help function #
# Each time in printf #
# (-) "\n" is a newline #
# (-) "\t" is tab (some spaces) #
# $0 is the the name that you give to the script #
# $1 is the 1st parameter passed to script or function. In this case: #
# (+) Out of any function $1 is the 1st parameter given to the script #
# (+) Inside a function $1 is the 1st given to the function #
# #
# ------------------------- # ------------------------------------------- #
# #
Print_Help(){ # Here it starts the function Print_Help() #
printf "\n$1\n\n" # Here you are inside a function and $1 is #
printf "SYNOPSIS \n" # the 1st parameter given to the function #
#------------------------# #
printf "\t $0 [OPTION] [IP]\n\n" # ------------------ #
printf "\t $0 -a 127.0.0.1 # to add \n" # <- hash(#) chars #
printf "\t $0 -r 127.0.0.1 # to remove\n\n" # <- out of the #
} # ^ # "double quote" #
# --- | ---------------- # ----------------- #
# +-- those hash(#) chars are inside the #
# "double quote" and they will be #
# printed as normal letters. #
# ------------------------------------------- #
Add_Function(){
echo $IP # Put here the code to add rule
# iptables -I INPUT 1 -p tcp -s $IP --dport 22 -m comment --**comment "testing for user1" -j ACCEPT.
service iptables reload # you need to run as root (or with sudo)
exit 0
}
Remove_Function(){
echo $IP # Put here the code to remove rule
service iptables reload # you need to run as root (or with sudo)
exit 0
}
if [[ $# != 2 ]] ;then #if the number of parameter is not 2
# Here we call the help function with
#+ "a single parameter in double quote" in this case:
#+ "Error wrong number of parameters for $0"
Print_Help "Error wrong number of parameters for $0"
exit 1
fi
IP=$2
if [[ "$1" == "-a" ]] ; then Add_Function ; fi
if [[ "$1" == "-r" ]] ; then Remove_Function ; fi
# Here below we call again the help function with
# "another single parameter in double quote" in this case
# "Error Unknown option $1 for $0 "
# In the "main" $1 is the 1st parameter that you pass to the script
Print_Help "Error Unknown option $1 for $0 "
exit 2
这只是一个熟悉 shell 脚本和选择的示例。您可以使用sudo /bin/bash script.sh -a nnn.mmm.ooo.ppp
、 或等命令行来运行它-r
,其中 nnn.mmm.ooo.ppp 是您要使用的 IP。如果您更改权限(例如chmod u+x script.sh
),您可以使用sudo ./script.sh -a nnn.mmm.ooo.ppp
.
您必须用您需要的代码填充该函数。
您可以添加与其他选项相关的其他功能。在这种情况下,使用可能更干净case ... esac
构造可能会更干净,就像 Cristopher 提出的代码中那样,其中包含一些在完成测试阶段后您会发现有用的功能。从检查脚本是否由 root 执行、是否在交互式 shell 中执行来决定将消息重定向到何处、当前日期的定义...首先检查您需要的内容并添加所有选修的一步步。
更新
从中man bash
你可以得到很多有趣的提示。
来自评论部分:
评论
在非交互式 shell 或启用了 shopt 内置命令的 Interactive_comments 选项的交互式 shell 中(请参阅下面的 SHELL BUILTIN COMMANDS),以 # 开头的单词会导致该单词以及该行上的所有剩余字符被忽略。 未启用 Interactive_comments 选项的交互式 shell 不允许评论。 Interactive_comments 选项默认开启在交互式 shell 中。
来自引用部分:
...
$'string' 形式的单词会被特殊处理。该单词扩展为字符串,并按照 ANSI C 标准指定的方式替换反斜杠转义字符。反斜杠转义序列(如果存在)按如下方式解码:... **\n new line** **\t horizontal tab** \v vertical tab \\ backslash \' single quote \" double quote ...