iptables启动脚本分析

  1. #!/bin/sh 
  2. # iptables      Start iptables firewall 
  3. # chkconfig: 2345 08 92 
  4. # description:  Starts, stops and saves iptables firewall 
  5. # config: /etc/sysconfig/iptables 
  6. # config: /etc/sysconfig/iptables-config 
  7. ### BEGIN INIT INFO 
  8. # Provides: iptables 
  9. # Required-Start: 
  10. # Required-Stop: 
  11. # Default-Start: 2 3 4 5 
  12. # Default-Stop: 0 1 6 
  13. # Short-Description: start and stop iptables firewall 
  14. # Description: Start, stop and save iptables firewall 
  15. ### END INIT INFO 
  16.  
  17. # Source function library. 
  18. . /etc/init.d/functions 
  19.  
  20. IPTABLES=iptables                                       #变量IPTABLES 
  21. IPTABLES_DATA=/etc/sysconfig/$IPTABLES                  #变量IPTABLES_DATA=/etc/sysconfig/iptables 
  22. IPTABLES_CONFIG=/etc/sysconfig/${IPTABLES}-config       #变量IPTABLES+CONFIG=/etc/sysoncifg/iptables-config 
  23. IPV=${IPTABLES%tables} # ip for ipv4 | ip6 for ipv6     #变量IPV,${IPTABLES%tables},将上一个变量IPTABLES的tables字符串删除 
  24. [ "$IPV" = "ip" ] && _IPV="ipv4" || _IPV="ipv6"         #如IPV=ip就执行_IPV=ipv4否则就执行_IPV=ipv6 
  25. PROC_IPTABLES_NAMES=/proc/net/${IPV}_tables_names       #变量PROC_IPTABLES_NAMES=/proc/net/${IPV}_tables_names 查看 /proc/net/有如下文件 
  26. #ls /proc/net/ip* 
  27. #/proc/net/ip6_flowlabel  /proc/net/ip6_mr_vif   /proc/net/ip_mr_vif          /proc/net/ip_tables_names    /proc/net/ipv6_route /proc/net/ip6_mr_cache   /proc/net/ip_mr_cache  /proc/net/ip_tables_matches  /proc/net/ip_tables_targets 
  28.  
  29. VAR_SUBSYS_IPTABLES=/var/lock/subsys/$IPTABLES          #变量VAR_SUBSYS_IPTABLES设置状态锁文件 
  30.  
  31. # only usable for root 
  32. [ $EUID = 0 ] || exit 4                                 #判断是否是root用户,否则退出状态为4 
  33.  
  34. if [ ! -x /sbin/$IPTABLES ]; then                       #判断/sbin/iptables不存在,就显示下面的警告信息 
  35.     echo -n $"${IPTABLES}: /sbin/$IPTABLES does not exist."; warning; echo 
  36.     exit 5                                              #退出状态为5 
  37. fi 
  38.  
  39. # Old or new modutils 
  40. /sbin/modprobe --version 2>&1 | grep -q module-init-tools \ 
  41.     && NEW_MODUTILS=1 \ 
  42.     || NEW_MODUTILS=0 
  43.  
  44. # Default firewall configuration: 
  45. IPTABLES_MODULES="" 
  46. IPTABLES_MODULES_UNLOAD="yes" 
  47. IPTABLES_SAVE_ON_STOP="no" 
  48. IPTABLES_SAVE_ON_RESTART="no" 
  49. IPTABLES_SAVE_COUNTER="no" 
  50. IPTABLES_STATUS_NUMERIC="yes" 
  51. IPTABLES_STATUS_VERBOSE="no" 
  52. IPTABLES_STATUS_LINENUMBERS="yes" 
  53.  
  54. # Load firewall configuration. 
  55. [ -f "$IPTABLES_CONFIG" ] && . "$IPTABLES_CONFIG"  #判断是否存在/etc/sysoncifg/iptables-config 
  56.  
  57. # Netfilter modules 
  58. NF_MODULES=($(lsmod | awk "/^${IPV}table_/ {print \$1}") ${IPV}_tables) 
  59. # 查看启动iptables加载的模块,当iptables用此脚本停止时,模块是没有加载的 
  60. #----#lsmod|awk "/^iptable_/ {print \$1}" $ip_tables---- 
  61. #---iptable_filter------------------------------------- 
  62. #---iptable_nat---------------------------------------- 
  63.  
  64. NF_MODULES_COMMON=(x_tables nf_nat nf_conntrack) # Used by netfilter v4 and v6 
  65.  
  66. # Get active tables 
  67. NF_TABLES=$(cat "$PROC_IPTABLES_NAMES" 2>/dev/null) 
  68. #查看系统加载的iptables模块 
  69. #--------- #cat /proc/net/ip_tables_names---------     
  70. #---------filter---------------------------------- 
  71. #---------nat------------------------------------- 
  72.  
  73.  
  74. rmmod_r() {  
  75.     # Unload module with all referring modules. 
  76.     # At first all referring modules will be unloaded, then the module itself. 
  77.     local mod=$1  #定义一个局部变量mod=$1 
  78.     local ret=0   #定义一个局部变量ret=0 
  79.     local ref=    #定义一个局部变量ref 
  80.  
  81.     # Get referring modules. 
  82.     # New modutils have another output format. 
  83.     [ $NEW_MODUTILS = 1 ] \ 
  84.         && ref=$(lsmod | awk "/^${mod}/ { print \$4; }" | tr ',' ' ') \ 
  85.         || ref=$(lsmod | grep ^${mod} | cut -d "[" -s -f 2 | cut -d "]" -s -f 1) 
  86. #如果NEW_MODUTILSd的值1,即判断modprobe --version|grep -q module-init-tools成功, 
  87. #lsmod打印第4列,显示出模块的内容,并将显示出的,全部删除 
  88. #如果NEW_MODUTILSd的值0,就执行后面 
  89.  
  90.  
  91. # recursive call for all referring modules 
  92.     for i in $ref; do 
  93.         rmmod_r $i   
  94.         let ret+=$?; 
  95.     done 
  96. #删除已经加载的iptables模块 
  97.  
  98.     # Unload module. 
  99.     # The extra test is for 2.6: The module might have autocleaned, 
  100.     # after all referring modules are unloaded. 
  101.     if grep -q "^${mod}" /proc/modules ; then #查看iptables的模块 
  102.         modprobe -r $mod > /dev/null 2>&1     #modprobe -r删除存在的iptables模块  
  103.         res=$?                                #查看状态 
  104.         [ $res -eq 0 ] || echo -n " $mod"     #执行成功,显示内容 
  105.         let ret+=$res; 
  106.     fi 
  107.  
  108.     return $ret 
  109.     #===========================================# 
  110. cat /proc/modules |grep ip 
  111. iptable_filter 2759 0 - Live 0xffffffffa02e1000 
  112. iptable_nat 6124 1 - Live 0xffffffffa029b000 
  113. nf_nat 22788 1 iptable_nat, Live 0xffffffffa02d1000 
  114. nf_conntrack_ipv4 9440 3 iptable_nat,nf_nat, Live 0xffffffffa0286000 
  115. nf_conntrack 79643 3 iptable_nat,nf_nat,nf_conntrack_ipv4, Live 0xffffffffa02b0000 
  116. nf_defrag_ipv4 1449 1 nf_conntrack_ipv4, Live 0xffffffffa0257000 
  117. ip_tables 17765 2 iptable_filter,iptable_nat, Live 0xffffffffa02a9000 
  118. ipv6 322899 74 - Live 0xffffffffa01ab000 
  119. #====================================================# 
  120.  
  121.      
  122.  
  123. flush_n_delete() { 
  124.     #情况默认策略 
  125.     # Flush firewall rules and delete chains. 
  126.     [ ! -e "$PROC_IPTABLES_NAMES" ] && return 0 
  127. #如果不存在/proc/net/ip_tables_names,则返回为0 
  128.  
  129.     # Check if firewall is configured (has tables) 
  130.     [ -z "$NF_TABLES" ] && return 1 
  131. #如果存在 cat /proc/net/ip_tables_names显示出来的内容,返回为1 
  132.  
  133.     echo -n $"${IPTABLES}: Flushing firewall rules: " 
  134. #显示    
  135.     ret=0 
  136.     # For all tables 
  137.     for i in $NF_TABLES; do 
  138.         # Flush firewall rules. 
  139.         $IPTABLES -t $i -F; 
  140.         let ret+=$?; 
  141.  
  142.         # Delete firewall chains. 
  143.         $IPTABLES -t $i -X; 
  144.         let ret+=$?; 
  145.  
  146.         # Set counter to zero. 
  147.         $IPTABLES -t $i -Z; 
  148.         let ret+=$?; 
  149.     done 
  150. #将所有iptables表执行-F -X -Z的操作 
  151.  
  152.     [ $ret -eq 0 ] && success || failure 
  153.     echo 
  154.     return $ret 
  155.  
  156. set_policy() { 
  157.     # Set policy for configured tables. 
  158.     policy=$1 
  159.  
  160.     # Check if iptable module is loaded 
  161.     [ ! -e "$PROC_IPTABLES_NAMES" ] && return 0 
  162. #如果不存在/proc/net/ip_tables_names,则返回为0 
  163.  
  164.     # Check if firewall is configured (has tables) 
  165.     tables=$(cat "$PROC_IPTABLES_NAMES" 2>/dev/null) 
  166.     #如果存在 cat /proc/net/ip_tables_names显示出来的内容,赋值给tables变量 
  167.     [ -z "$tables" ] && return 1 
  168.     #tables变量是否有值,无值返回1 
  169.  
  170.     echo -n $"${IPTABLES}: Setting chains to policy $policy: " 
  171.     ret=0 
  172.     for i in $tables; do 
  173.         echo -n "$i " 
  174.         case "$i" in 
  175.             raw) 
  176.                 $IPTABLES -t raw -P PREROUTING $policy \ 
  177.                     && $IPTABLES -t raw -P OUTPUT $policy \ 
  178.                     || let ret+=1 
  179.                 ;; 
  180.             filter) 
  181.                 $IPTABLES -t filter -P INPUT $policy \ 
  182.                     && $IPTABLES -t filter -P OUTPUT $policy \ 
  183.                     && $IPTABLES -t filter -P FORWARD $policy \ 
  184.                     || let ret+=1 
  185.                 ;; 
  186.             nat) 
  187.                 $IPTABLES -t nat -P PREROUTING $policy \ 
  188.                     && $IPTABLES -t nat -P POSTROUTING $policy \ 
  189.                     && $IPTABLES -t nat -P OUTPUT $policy \ 
  190.                     || let ret+=1 
  191.                 ;; 
  192.             mangle) 
  193.                 $IPTABLES -t mangle -P PREROUTING $policy \ 
  194.                     && $IPTABLES -t mangle -P POSTROUTING $policy \ 
  195.                     && $IPTABLES -t mangle -P INPUT $policy \ 
  196.                     && $IPTABLES -t mangle -P OUTPUT $policy \ 
  197.                     && $IPTABLES -t mangle -P FORWARD $policy \ 
  198.                     || let ret+=1 
  199.                 ;; 
  200.             *) 
  201.                 let ret+=1 
  202.                 ;; 
  203.         esac 
  204.     done 
  205.  
  206.     [ $ret -eq 0 ] && success || failure 
  207.     echo 
  208.     return $ret 
  209.     #以上命令为执行各表的策略设置 
  210.  
  211. start() { 
  212.     # Do not start if there is no config file. 
  213.     [ ! -f "$IPTABLES_DATA" ] && return 6 
  214. #如果/etc/sysconfig/iptables不存在,返回值为6 
  215.  
  216.     # check if ipv6 module load is deactivated 
  217.     if [ "${_IPV}" = "ipv6" ] \ 
  218.         && grep -qIsE "^install[[:space:]]+${_IPV}[[:space:]]+/bin/(true|false)" /etc/modprobe.conf /etc/modprobe.d/* ; then 
  219.         echo $"${IPTABLES}: ${_IPV} is disabled." 
  220.         return 150 
  221.     fi 
  222. #检查ipv6模块是否加载 
  223.     echo -n $"${IPTABLES}: Applying firewall rules: " 
  224.  
  225.     OPT
  226.     [ "x$IPTABLES_SAVE_COUNTER" = "xyes" ] && OPT="-c" 
  227.  
  228.     $IPTABLES-restore $OPT $IPTABLES_DATA 
  229.     #执行iptables-restore /etc/sysconfig/iptables恢复iptables设置的策略 
  230.     if [ $? -eq 0 ]; then 
  231.         success; echo 
  232.     else 
  233.         failure; echo; return 1 
  234.     fi 
  235.     #判断是否执行成功,并显示状态 
  236.  
  237.     # Load additional modules (helpers) 
  238.     if [ -n "$IPTABLES_MODULES" ]; then 
  239.         echo -n $"${IPTABLES}: Loading additional modules: " 
  240.         ret=0 
  241.         for mod in $IPTABLES_MODULES; do 
  242.             echo -n "$mod " 
  243.             modprobe $mod > /dev/null 2>&1 
  244.             let ret+=$?; 
  245.         done 
  246.     #加载iptables模块 
  247.         [ $ret -eq 0 ] && success || failure 
  248.         echo 
  249.     fi 
  250.      
  251.     touch $VAR_SUBSYS_IPTABLES 
  252.     #建立状态文件锁=/var/lock/subsys/iptables 
  253.     return $ret 
  254.  
  255. stop() { 
  256.     # Do not stop if iptables module is not loaded. 
  257.     [ ! -e "$PROC_IPTABLES_NAMES" ] && return 0 
  258. #不存在/proc/net/ip_tables_names 
  259.     flush_n_delete 
  260.     set_policy ACCEPT 
  261.      
  262.     if [ "x$IPTABLES_MODULES_UNLOAD" = "xyes" ]; then 
  263.         echo -n $"${IPTABLES}: Unloading modules: " 
  264.         ret=0 
  265.         for mod in ${NF_MODULES[*]}; do 
  266.             rmmod_r $mod 
  267.             let ret+=$?; 
  268.         done 
  269.     #卸载iptables模块 
  270.         # try to unload remaining netfilter modules used by ipv4 and ipv6  
  271.         # netfilter 
  272.         for mod in ${NF_MODULES_COMMON[*]}; do 
  273.             rmmod_r $mod >/dev/null 
  274.         done 
  275.         [ $ret -eq 0 ] && success || failure 
  276.         echo 
  277.     fi 
  278.      
  279.     rm -f $VAR_SUBSYS_IPTABLES 
  280.     return $ret 
  281.  
  282. save() { 
  283.     # Check if iptable module is loaded 
  284.     [ ! -e "$PROC_IPTABLES_NAMES" ] && return 0 
  285. #不存在在/proc/net/ip_tables_names,返回0 
  286.     # Check if firewall is configured (has tables) 
  287.     [ -z "$NF_TABLES" ] && return 6 
  288. #是否存在 
  289.     echo -n $"${IPTABLES}: Saving firewall rules to $IPTABLES_DATA: " 
  290.  
  291.     OPT
  292.     [ "x$IPTABLES_SAVE_COUNTER" = "xyes" ] && OPT="-c" 
  293.  
  294.     ret=0 
  295.     TMP_FILE=$(/bin/mktemp -q $IPTABLES_DATA.XXXXXX) \ 
  296.         && chmod 600 "$TMP_FILE" \ 
  297.         && $IPTABLES-save $OPT > $TMP_FILE 2>/dev/null \ 
  298.     #iptables-save -c > 保存到文件 
  299.         && size=$(stat -c '%s' $TMP_FILE) && [ $size -gt 0 ] \ 
  300.         || ret=1#判断文件是否为空 
  301.     if [ $ret -eq 0 ]; then 
  302.         if [ -e $IPTABLES_DATA ]; then 
  303.             cp -f $IPTABLES_DATA $IPTABLES_DATA.save \ #将/etc/sysconfig/iptables备份为iptables.save 
  304.                 && chmod 600 $IPTABLES_DATA.save \   #更改/etc/sysconfig/iptables权限为600 
  305.                 && restorecon $IPTABLES_DATA.save \  #更改/etc/sysconfig/iptables的selinux 
  306.                 || ret=1 
  307.         fi 
  308.         if [ $ret -eq 0 ]; then 
  309.             mv -f $TMP_FILE $IPTABLES_DATA \ 
  310.                 && chmod 600 $IPTABLES_DATA \ 
  311.                 && restorecon $IPTABLES_DATA \ 
  312.                 || ret=1 
  313.         fi 
  314.     fi 
  315.     rm -f $TMP_FILE 
  316.     [ $ret -eq 0 ] && success || failure 
  317.     echo 
  318.     return $ret 
  319.  
  320. status() { 
  321.     if [ ! -f "$VAR_SUBSYS_IPTABLES" -a -z "$NF_TABLES" ]; then 
  322.         echo $"${IPTABLES}: Firewall is not running." 
  323.         return 3 
  324.     fi 
  325.     #查看文件状态锁是否存在 
  326.  
  327.     # Do not print status if lockfile is missing and iptables modules are not  
  328.     # loaded. 
  329.     # Check if iptable modules are loaded 
  330.     if [ ! -e "$PROC_IPTABLES_NAMES" ]; then 
  331.         echo $"${IPTABLES}: Firewall modules are not loaded." 
  332.         return 3 
  333.     fi 
  334.     # Check if firewall is configured (has tables) 
  335.     if [ -z "$NF_TABLES" ]; then 
  336.         echo $"${IPTABLES}: Firewall is not configured. " 
  337.         return 3 
  338.     fi 
  339.  
  340.     NUM
  341.     [ "x$IPTABLES_STATUS_NUMERIC" = "xyes" ] && NUM="-n" 
  342.     VERBOSE=  
  343.     [ "x$IPTABLES_STATUS_VERBOSE" = "xyes" ] && VERBOSE="--verbose" 
  344.     COUNT
  345.     [ "x$IPTABLES_STATUS_LINENUMBERS" = "xyes" ] && COUNT="--line-numbers" 
  346.  
  347.     for table in $NF_TABLES; do 
  348.         echo $"Table: $table" 
  349.         $IPTABLES -t $table --list $NUM $VERBOSE $COUNT && echo 
  350.     done 
  351.  
  352.     return 0 
  353.  
  354. restart() { 
  355.     [ "x$IPTABLES_SAVE_ON_RESTART" = "xyes" ] && save 
  356.     stop 
  357.     start 
  358.  
  359.  
  360. case "$1" in 
  361.     start) 
  362.         [ -f "$VAR_SUBSYS_IPTABLES" ] && exit 0 
  363.         start 
  364.         RETVAL=$? 
  365.         ;; 
  366.     stop) 
  367.         [ "x$IPTABLES_SAVE_ON_STOP" = "xyes" ] && save 
  368.         stop 
  369.         RETVAL=$? 
  370.         ;; 
  371.     restart|force-reload) 
  372.         restart 
  373.         RETVAL=$? 
  374.         ;; 
  375.     reload) 
  376.         # unimplemented 
  377.         RETVAL=3 
  378.         ;; 
  379.     condrestart|try-restart) 
  380.         [ ! -e "$VAR_SUBSYS_IPTABLES" ] && exit 0 
  381.         restart 
  382.         RETVAL=$? 
  383.         ;; 
  384.     status) 
  385.         status 
  386.         RETVAL=$? 
  387.         ;; 
  388.     panic) 
  389.         flush_n_delete 
  390.         set_policy DROP 
  391.         RETVAL=$? 
  392.         ;; 
  393.     save) 
  394.         save 
  395.         RETVAL=$? 
  396.         ;; 
  397.     *) 
  398.         echo $"Usage: ${IPTABLES} {start|stop|restart|condrestart|status|panic|save}" 
  399.         RETVAL=2 
  400.         ;; 
  401. esac 
  402.  
  403. exit $RETVAL 
  404.  
  405. 附录 
  406. lsmod命令 
  407. 第1列:表示模块的名称。 
  408. 第2列:表示模块的大小。 
  409. 第3列:表示依赖模块的个数。 
  410. 第4列:表示依赖模块的内容。 
  411. 注:本文为itnihao原创。