iptables启动脚本分析
#!/bin/sh
#
# iptables Start iptables firewall
#
# chkconfig: 2345 08 92
# description: Starts, stops and saves iptables firewall
#
# config: /etc/sysconfig/iptables
# config: /etc/sysconfig/iptables-config
#
### BEGIN INIT INFO
# Provides: iptables
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop iptables firewall
# Description: Start, stop and save iptables firewall
### END INIT INFO # Source function library.
. /etc/init.d/functions IPTABLES=iptables #变量IPTABLES
IPTABLES_DATA=/etc/sysconfig/$IPTABLES #变量IPTABLES_DATA=/etc/sysconfig/iptables
IPTABLES_CONFIG=/etc/sysconfig/${IPTABLES}-config #变量IPTABLES+CONFIG=/etc/sysoncifg/iptables-config
IPV=${IPTABLES%tables} # ip for ipv4 | ip6 for ipv6 #变量IPV,${IPTABLES%tables},将上一个变量IPTABLES的tables字符串删除
[ "$IPV" = "ip" ] && _IPV="ipv4" || _IPV="ipv6" #如IPV=ip就运行_IPV=ipv4否则就运行_IPV=ipv6
PROC_IPTABLES_NAMES=/proc/net/${IPV}_tables_names #变量PROC_IPTABLES_NAMES=/proc/net/${IPV}_tables_names 查看 /proc/net/有例如以下文件
#ls /proc/net/ip*
#/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 VAR_SUBSYS_IPTABLES=/var/lock/subsys/$IPTABLES #变量VAR_SUBSYS_IPTABLES设置状态锁文件 # only usable for root
[ $EUID = 0 ] || exit 4 #推断是否是root用户,否则退出状态为4 if [ ! -x /sbin/$IPTABLES ]; then #推断/sbin/iptables不存在。就显示以下的警告信息
echo -n $"${IPTABLES}: /sbin/$IPTABLES does not exist."; warning; echo
exit 5 #退出状态为5
fi # Old or new modutils
/sbin/modprobe --version 2>&1 | grep -q module-init-tools
&& NEW_MODUTILS=1
|| NEW_MODUTILS=0 # Default firewall configuration:
IPTABLES_MODULES=""
IPTABLES_MODULES_UNLOAD="yes"
IPTABLES_SAVE_ON_STOP="no"
IPTABLES_SAVE_ON_RESTART="no"
IPTABLES_SAVE_COUNTER="no"
IPTABLES_STATUS_NUMERIC="yes"
IPTABLES_STATUS_VERBOSE="no"
IPTABLES_STATUS_LINENUMBERS="yes" # Load firewall configuration.
[ -f "$IPTABLES_CONFIG" ] && . "$IPTABLES_CONFIG" #推断是否存在/etc/sysoncifg/iptables-config # Netfilter modules
NF_MODULES=($(lsmod | awk "/^${IPV}table_/ {print $1}") ${IPV}_tables)
# 查看启动iptables载入的模块,当iptables用此脚本停止时。模块是没有载入的
#----#lsmod|awk "/^iptable_/ {print $1}" $ip_tables----
#---iptable_filter-------------------------------------
#---iptable_nat---------------------------------------- NF_MODULES_COMMON=(x_tables nf_nat nf_conntrack) # Used by netfilter v4 and v6 # Get active tables
NF_TABLES=$(cat "$PROC_IPTABLES_NAMES" 2>/dev/null)
#查看系统载入的iptables模块
#--------- #cat /proc/net/ip_tables_names---------
#---------filter----------------------------------
#---------nat------------------------------------- rmmod_r() {
# Unload module with all referring modules.
# At first all referring modules will be unloaded, then the module itself.
local mod=$1 #定义一个局部变量mod=$1
local ret=0 #定义一个局部变量ret=0
local ref= #定义一个局部变量ref # Get referring modules.
# New modutils have another output format.
[ $NEW_MODUTILS = 1 ]
&& ref=$(lsmod | awk "/^${mod}/ { print $4; }" | tr ',' ' ')
|| ref=$(lsmod | grep ^${mod} | cut -d "[" -s -f 2 | cut -d "]" -s -f 1)
#假设NEW_MODUTILSd的值1。即推断modprobe --version|grep -q module-init-tools成功,
#lsmod打印第4列,显示出模块的内容,并将显示出的。所有删除
#假设NEW_MODUTILSd的值0,就运行后面 # recursive call for all referring modules
for i in $ref; do
rmmod_r $i
let ret+=$? ;
done
#删除已经载入的iptables模块 # Unload module.
# The extra test is for 2.6: The module might have autocleaned,
# after all referring modules are unloaded.
if grep -q "^${mod}" /proc/modules ; then #查看iptables的模块
modprobe -r $mod > /dev/null 2>&1 #modprobe -r删除存在的iptables模块
res=$? #查看状态
[ $res -eq 0 ] || echo -n " $mod" #运行成功。显示内容
let ret+=$res;
fi return $ret
#===========================================#
cat /proc/modules |grep ip
iptable_filter 2759 0 - Live 0xffffffffa02e1000
iptable_nat 6124 1 - Live 0xffffffffa029b000
nf_nat 22788 1 iptable_nat, Live 0xffffffffa02d1000
nf_conntrack_ipv4 9440 3 iptable_nat,nf_nat, Live 0xffffffffa0286000
nf_conntrack 79643 3 iptable_nat,nf_nat,nf_conntrack_ipv4, Live 0xffffffffa02b0000
nf_defrag_ipv4 1449 1 nf_conntrack_ipv4, Live 0xffffffffa0257000
ip_tables 17765 2 iptable_filter,iptable_nat, Live 0xffffffffa02a9000
ipv6 322899 74 - Live 0xffffffffa01ab000
#====================================================# } flush_n_delete() {
#情况默认策略
# Flush firewall rules and delete chains.
[ ! -e "$PROC_IPTABLES_NAMES" ] && return 0
#假设不存在/proc/net/ip_tables_names。则返回为0 # Check if firewall is configured (has tables)
[ -z "$NF_TABLES" ] && return 1
#假设存在 cat /proc/net/ip_tables_names显示出来的内容,返回为1 echo -n $"${IPTABLES}: Flushing firewall rules: "
#显示
ret=0
# For all tables
for i in $NF_TABLES; do
# Flush firewall rules.
$IPTABLES -t $i -F;
let ret+=$? ; # Delete firewall chains.
$IPTABLES -t $i -X;
let ret+=$? ; # Set counter to zero.
$IPTABLES -t $i -Z;
let ret+=$?;
done
#将所有iptables表运行-F -X -Z的操作 [ $ret -eq 0 ] && success || failure
echo
return $ret
} set_policy() {
# Set policy for configured tables.
policy=$1 # Check if iptable module is loaded
[ ! -e "$PROC_IPTABLES_NAMES" ] && return 0
#假设不存在/proc/net/ip_tables_names,则返回为0 # Check if firewall is configured (has tables)
tables=$(cat "$PROC_IPTABLES_NAMES" 2>/dev/null)
#假设存在 cat /proc/net/ip_tables_names显示出来的内容,赋值给tables变量
[ -z "$tables" ] && return 1
#tables变量是否有值。无值返回1 echo -n $"${IPTABLES}: Setting chains to policy $policy: "
ret=0
for i in $tables; do
echo -n "$i "
case "$i" in
raw)
$IPTABLES -t raw -P PREROUTING $policy
&& $IPTABLES -t raw -P OUTPUT $policy
|| let ret+=1
;;
filter)
$IPTABLES -t filter -P INPUT $policy
&& $IPTABLES -t filter -P OUTPUT $policy
&& $IPTABLES -t filter -P FORWARD $policy
|| let ret+=1
;;
nat)
$IPTABLES -t nat -P PREROUTING $policy
&& $IPTABLES -t nat -P POSTROUTING $policy
&& $IPTABLES -t nat -P OUTPUT $policy
|| let ret+=1
;;
mangle)
$IPTABLES -t mangle -P PREROUTING $policy
&& $IPTABLES -t mangle -P POSTROUTING $policy
&& $IPTABLES -t mangle -P INPUT $policy
&& $IPTABLES -t mangle -P OUTPUT $policy
&& $IPTABLES -t mangle -P FORWARD $policy
|| let ret+=1
;;
*)
let ret+=1
;;
esac
done [ $ret -eq 0 ] && success || failure
echo
return $ret
#以上命令为运行各表的策略设置
} start() {
# Do not start if there is no config file.
[ ! -f "$IPTABLES_DATA" ] && return 6
#假设/etc/sysconfig/iptables不存在。返回值为6 # check if ipv6 module load is deactivated
if [ "${_IPV}" = "ipv6" ]
&& grep -qIsE "^install[[:space:]]+${_IPV}[[:space:]]+/bin/(true|false)" /etc/modprobe.conf /etc/modprobe.d/* ; then
echo $"${IPTABLES}: ${_IPV} is disabled."
return 150
fi
#检查ipv6模块是否载入
echo -n $"${IPTABLES}: Applying firewall rules: " OPT=
[ "x$IPTABLES_SAVE_COUNTER" = "xyes" ] && OPT="-c" $IPTABLES-restore $OPT $IPTABLES_DATA
#运行iptables-restore /etc/sysconfig/iptables恢复iptables设置的策略
if [ $? -eq 0 ]; then
success; echo
else
failure; echo; return 1
fi
#推断是否运行成功,并显示状态 # Load additional modules (helpers)
if [ -n "$IPTABLES_MODULES" ]; then
echo -n $"${IPTABLES}: Loading additional modules: "
ret=0
for mod in $IPTABLES_MODULES; do
echo -n "$mod "
modprobe $mod > /dev/null 2>&1
let ret+=$? ;
done
#载入iptables模块
[ $ret -eq 0 ] && success || failure
echo
fi touch $VAR_SUBSYS_IPTABLES
#建立状态文件锁=/var/lock/subsys/iptables
return $ret
} stop() {
# Do not stop if iptables module is not loaded.
[ ! -e "$PROC_IPTABLES_NAMES" ] && return 0
#不存在/proc/net/ip_tables_names
flush_n_delete
set_policy ACCEPT if [ "x$IPTABLES_MODULES_UNLOAD" = "xyes" ]; then
echo -n $"${IPTABLES}: Unloading modules: "
ret=0
for mod in ${NF_MODULES[*]}; do
rmmod_r $mod
let ret+=$?;
done
#卸载iptables模块
# try to unload remaining netfilter modules used by ipv4 and ipv6
# netfilter
for mod in ${NF_MODULES_COMMON[*]}; do
rmmod_r $mod >/dev/null
done
[ $ret -eq 0 ] && success || failure
echo
fi rm -f $VAR_SUBSYS_IPTABLES
return $ret
} save() {
# Check if iptable module is loaded
[ ! -e "$PROC_IPTABLES_NAMES" ] && return 0
#不存在在/proc/net/ip_tables_names,返回0
# Check if firewall is configured (has tables)
[ -z "$NF_TABLES" ] && return 6
#是否存在
echo -n $"${IPTABLES}: Saving firewall rules to $IPTABLES_DATA: " OPT=
[ "x$IPTABLES_SAVE_COUNTER" = "xyes" ] && OPT="-c" ret=0
TMP_FILE=$(/bin/mktemp -q $IPTABLES_DATA.XXXXXX)
&& chmod 600 "$TMP_FILE"
&& $IPTABLES-save $OPT > $TMP_FILE 2>/dev/null
#iptables-save -c > 保存到文件
&& size=$(stat -c '%s' $TMP_FILE) && [ $size -gt 0 ]
|| ret=1#推断文件是否为空
if [ $ret -eq 0 ]; then
if [ -e $IPTABLES_DATA ]; then
cp -f $IPTABLES_DATA $IPTABLES_DATA.save #将/etc/sysconfig/iptables备份为iptables.save
&& chmod 600 $IPTABLES_DATA.save #更改/etc/sysconfig/iptables权限为600
&& restorecon $IPTABLES_DATA.save #更改/etc/sysconfig/iptables的selinux
|| ret=1
fi
if [ $ret -eq 0 ]; then
mv -f $TMP_FILE $IPTABLES_DATA
&& chmod 600 $IPTABLES_DATA
&& restorecon $IPTABLES_DATA
|| ret=1
fi
fi
rm -f $TMP_FILE
[ $ret -eq 0 ] && success || failure
echo
return $ret
} status() {
if [ ! -f "$VAR_SUBSYS_IPTABLES" -a -z "$NF_TABLES" ]; then
echo $"${IPTABLES}: Firewall is not running."
return 3
fi
#查看文件状态锁是否存在 # Do not print status if lockfile is missing and iptables modules are not
# loaded.
# Check if iptable modules are loaded
if [ ! -e "$PROC_IPTABLES_NAMES" ]; then
echo $"${IPTABLES}: Firewall modules are not loaded."
return 3
fi
#
# Check if firewall is configured (has tables)
if [ -z "$NF_TABLES" ]; then
echo $"${IPTABLES}: Firewall is not configured. "
return 3
fi NUM=
[ "x$IPTABLES_STATUS_NUMERIC" = "xyes" ] && NUM="-n"
VERBOSE=
[ "x$IPTABLES_STATUS_VERBOSE" = "xyes" ] && VERBOSE="--verbose"
COUNT=
[ "x$IPTABLES_STATUS_LINENUMBERS" = "xyes" ] && COUNT="--line-numbers" for table in $NF_TABLES; do
echo $"Table: $table"
$IPTABLES -t $table --list $NUM $VERBOSE $COUNT && echo
done return 0
} restart() {
[ "x$IPTABLES_SAVE_ON_RESTART" = "xyes" ] && save
stop
start
} case "$1" in
start)
[ -f "$VAR_SUBSYS_IPTABLES" ] && exit 0
start
RETVAL=$? ;;
stop)
[ "x$IPTABLES_SAVE_ON_STOP" = "xyes" ] && save
stop
RETVAL=$?
;;
restart|force-reload)
restart
RETVAL=$? ;;
reload)
# unimplemented
RETVAL=3
;;
condrestart|try-restart)
[ ! -e "$VAR_SUBSYS_IPTABLES" ] && exit 0
restart
RETVAL=$?
;;
status)
status
RETVAL=$? ;;
panic)
flush_n_delete
set_policy DROP
RETVAL=$? ;;
save)
save
RETVAL=$?
;;
*)
echo $"Usage: ${IPTABLES} {start|stop|restart|condrestart|status|panic|save}"
RETVAL=2
;;
esac exit $RETVAL 附录
lsmod命令
第1列:表示模块的名称。
第2列:表示模块的大小。
第3列:表示依赖模块的个数。
第4列:表示依赖模块的内容。
转载请注明文章转自:良玉的博客 [http://blog.uouo123.com]
iptables启动脚本分析的更多相关文章
- 实用防火墙(Iptables)脚本分析
实用防火墙(Iptables)脚本分析 --Redhat,CentOS,Ubuntu等常见Linux发行版中都会预装Iptables防火墙,大多数初学者设置起来由于对这款软件比较陌生,设置起来比较困难 ...
- HBase配置&启动脚本分析
本文档基于hbase-0.96.1.1-cdh5.0.2,对HBase配置&启动脚本进行分析 date:2016/8/4 author:wangxl HBase配置&启动脚本分析 剔除 ...
- Spark配置&启动脚本分析
本文档基于Spark2.0,对spark启动脚本进行分析. date:2016/8/3 author:wangxl Spark配置&启动脚本分析 我们主要关注3类文件,配置文件,启动脚本文件以 ...
- Hadoop启动脚本分析
Hadoop启动脚本分析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 能看到这篇博客的你估计对Hadoop已经有一个系统的了解了,最起码各种搭建方式你应该是会的,不会也没有关系, ...
- 4. hadoop启动脚本分析
4. hadoop启动脚本分析 1. hadoop的端口 ``` 50070 //namenode http port 50075 //datanode http port 50090 //2name ...
- busybox rootfs 启动脚本分析(二)
上次分析了busybox的启动脚本,这次分析一下init.d中一些脚本的内容. 参考链接 http://www.cnblogs.com/helloworldtoyou/p/6169678.html h ...
- busybox rootfs 启动脚本分析(一)
imx6文件系统启动脚本分析.开机运行/sbin/init,读取/etc/inittab文件,进行初始化. 参考链接 http://blog.163.com/wghbeyond@126/blog/st ...
- hadoop启动脚本分析及常见命令
进程------------------ [hdfs]start-dfs.sh NameNode NN DataNode DN SecondaryNamenode 2NN [yarn]start-ya ...
- linux系统 initrd.img中init启动脚本分析
概述:这篇文章主体内容来源于网上转载.前面几篇文章倾向于制作initrd.img,这篇文章更倾向于initrd.img的运行过程:加载framebuff驱动 ide驱动和文件系统驱动,最后进入到真正的 ...
随机推荐
- sed 中如何替换换行符
使用如下解决方案: sed ':a;N;$!ba;s/\n/ /g' 这将在一个循环里读取整个文件,然后将换行符替换成一个空格. 说明: 通过 :a创建一个标记 通过N追加当前行和下一行到模式区域 如 ...
- linux MySQL Cluster MySQL集群
原文:http://lizhenliang.blog.51cto.com/7876557/1290451 官方下载地址 http://dev.mysql.com/downloads/cluster/ ...
- JS 随机数字抽签
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...
- 转:阿里 Weex 思路与实战(web相关)
Weex——关于移动端动态性的思考.实现和未来 2016-04-05 勾股.伊耆 移动开发前线 本文由手机淘宝技术团队赵锦江(勾股).黄金涌(伊耆)等专家创作.手淘作为电商应用,对客户端/前端的动态性 ...
- 倍福TwinCAT(贝福Beckhoff)基础教程 松下驱动器试运行提示过速度保护怎么办
在试运行的时候,取消勾选自动设定,然后可以自己设置过速度等级设置和过载等级设置 更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com/acetaoh ...
- vscode - 选中多行操作
选中Alt+鼠标左键即可,按ESC退出 ,具体演示效果如下
- 可移动磁盘显示0kb打不开怎么办
移动硬盘.U盘打不开怎么办 为了方便共享,大多数人都购买了移动硬盘.那么如果有一天,发现移动硬盘打不开了,怎么办?下面为大家介绍移动硬盘打不开的解决方法. 未格式化故障 第一步:双击盘符出现未格式 ...
- react-native 创建 ios 项目
创建React-Native项目 打开终端输入react-native init ProjectName,这里的ProjectName可以改成你想创建的项目名称.然后有两种方法启动项目 1.从终端开启 ...
- vue 访问子组件示例 或者子元素
1.子组件 <base-input ref="usernameInput"></base-input> this.$refs.usernameInput 2 ...
- java如何实现多个线程并发运行
随着计算机技术的发展,编程模型也越来越复杂多样化.但多线程编程模型是目前计算机系统架构的最终模型.随着CPU主频的不断攀升,X86架构的硬件已经成为瓶,在这种架构的CPU主频最高为4G.事实上目前3. ...