将工作站 IP 添加/删除到 /etc/sysconfig/iptables,然后运行 ​​service iptables reload

将工作站 IP 添加/删除到 /etc/sysconfig/iptables,然后运行 ​​service iptables reload

我需要一个脚本来添加用户工作站 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  
         ...

相关内容