1 Iptables简介
- Iptables 更确切的说是一个应用程序,工作在linux的用户层,对 Linux 内核防火墙中的表进行管理。因为Linux 系统具有强大的网络协议栈功能,可以连接因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 所以需要一种内置能力来针对网络信息进行过滤,linux内核2.4.x 版本之后就具备了IP信息包过滤这种能力。如果利用Iptables 进行适合配置它只允许合法的网络流量进出系统,而禁止其它任何网络流量。为了确定网络流量是否合法,系统管理员可以利用Iptables 来预定义的一组规则。这些规则告诉linux内核某个流量是否合法以及对于来自某个源、至某个目的地或具有某种协议类型的网络流量要做些什么。
2 内核配置
- 一般来说2.4.x 版本之后的内核中默认是把防火墙相关主要的内核选项自动编译进内核的,如果没有那需要自己手动进行配置,有些是必须配置的,有些是可选的(根据实际应用需要看是否需要这方面的过滤,因为这些过滤是在内核中做的,如果不是必须的话建议不要选上,免的影响系统开销,内核默认也没有把所有防火墙选项都选上)。
$ bitbake -c menuconfig linux-quic
- 具体配置位置
→ Networking support → Networking options → Network packet filtering framework (Netfilter)
-
必选的配置(如果要让防火墙工作必须有的配置)
image.png
Network packet filtering framework (Netfilter)
选上(默认已选上),允许计算机作为网关或防火墙。
image.png
Netfilter Xtables support (required for ip_tables)
选上(默认已选上),有了它,你才能使用过滤、伪装、NAT。它 为内核加入了iptables标识框架。没有它,iptables毫无作用。
- 其他选项都是可选的,具体介绍可以直接看menuconfig里面的help介绍,或者去下面的网站查看:
https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html#KERNELSETUP
这个网站日期有点远了,仅提供一个参考。
3 在设备上配置Iptables服务
Iptables的最新源码可以去www.netfilter.org 官网下载。不过设备上也有安装iptables的工具,经过测试是可以使用的,由于时间关系没有下载最新的iptables源码进行编译测试。
# which iptables
/usr/sbin/iptables
1)把启动脚本和服务脚本放到/etc/init.d目录
$adb push iptables-start.sh /etc/init.d/.
$adb push iptables.sh /etc/init.d/.
2)配置启动脚本
查看运行等级
# runlevel
N 5
说明启动时会从 rc5.d目录下按顺序去启动脚本
在rc5.d目录建立启动链接
#cd cd /etc/rc5.d
#ln -s ../init.d/iptables-start.sh S99start_iptables
备注:下面是我写好的iptables的启动脚本和服务脚本
- iptables-start.sh
#!/bin/sh
# copyright (c) 2017-2027, xiamen yaxon. All rights reserved.
# iptables Start iptables firewall
#
# runlevel 5 in S99
# description: starts
/etc/init.d/iptables.sh start
- iptables.sh
#!/bin/sh
# copyright (c) 2017-2027, xiamen yaxon. All rights reserved.
# iptables {start|stop|restart|save}
#
# description: starts, stops and restart
IPTABLES_DIR='/etc/sysconfig'
IPTABLES_RULE='/etc/sysconfig/iptables'
IPTABLES_ERROR_CODE=3
start() {
#如果/etc/sysconfig/iptables不存在,返回值出错码
[ ! -f "$IPTABLES_RULE" ] && return $IPTABLES_ERROR_CODE
echo "get firewall rules"
#清除之前的规则
iptables -F
iptables -X
iptables -Z
#恢复之前配置的防火墙规则
iptables-restore < ${IPTABLES_RULE}
if [ $? -eq 0 ]; then
echo "restore firewall rules success"
else
echo "restore firewall rules failure"; return $IPTABLES_ERROR_CODE
fi
}
save() {
if [ ! -d "$IPTABLES_DIR" ]; then
mkdir -p $IPTABLES_DIR
fi
iptables-save > ${IPTABLES_RULE}
if [ $? -eq 0 ]; then
echo "save firewall rules success"
else
echo "save firewall rules failure"; return $IPTABLES_ERROR_CODE
fi
}
stop() {
#暂时不处理
echo "stop firewall success"
}
restart() {
stop;
start;
}
case "$1" in
start)
start
RETVAL=$?
;;
save)
save
RETVAL=$?
;;
stop)
stop
RETVAL=$?
;;
restart)
restart
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|save}"
RETVAL=$?
;;
esac
exit $RETVAL
3)iptables的规则配置
可以使用iptables工具进行配置,具体配置规则可以参考https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html#INCLUDE.RCFIREWALL
可以根据实际需要进行选择配置,这里不再介绍。
4)iptables.sh脚本的使用
启动,iptables的规则不会自动保存,需要每次系统运行时重新加载这些规则,下面的命令可以重新去加载之前配置的规则
#/etc/init.d/iptables.sh start
重启,如果想放弃正在配置的规则可以用下面的命令
#/etc/init.d/iptables.sh restart
存储,在使用iptables进行配置完规则,可以用下面的指令存储规则,因为系统不会自动保存配置规则,重启之后配置的规则会丢掉,所以配置完需要存储一下规则才会保存下来
#/etc/init.d/iptables.sh save
参考文献
[1] https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html#INCLUDE.RCFIREWALL
[2] http://www.netfilter.org/projects/conntrack-tools/index.html
[3] http://www.faqs.org/docs/iptables/
[4] 鸟哥的linux私房菜-服务器(第三版/第九章)
网友评论