在前面的文章中我们已经学习了如何编写一些简单的防火墙规则了,但是这些规则只是临时生效的,当防火墙关闭或者服务器关机,重启之后所有的规则将会清空。因此我需要将编写好的防火墙规则保存下来,以便在防火墙关闭或重新启动系统后,防火墙规则还可以使用,而不需要再次编写。
iptables规则的导出、导人
防火墙规则的批量备份,还原需要用到两个命令iptables-save、iptables-restore,分别用来保存和恢复。
1、备份iptables规则
iptables-save命令用来批量导出iptables防火墙规则,直接执行iptables-save时,将显示出当前启用的所有规则,按照raw、mangle、nat、filter表的顺序依次列出;若只希望显示出某一个表,应添加“-t表名”作为命令选项,然后结合重定向输入“>”将输出内容重定向到某个文件中。
列如:备份所有表的规则,操作如下:
[root@localhost /]#iptables-save > /opt/iprules_all.txt
或者
[root@localhost /]#service iptables save
后者默认将所有规则保存到“/etc/sysconfig/iptables”文件中。
2、恢复iptables规则
iptables-retore命令用来批量导入Linux防火墙规则,如果已经有使用iptable-save命令导出的备份文件,则恢复规则的过程也就是一瞬间的事。与iptables-save命令相对的,iptables-restore命令应结合重定向输入来指定备份文件的位置。
列如:将上所备份的规则恢复到iptables中,操作如下:
[root@localhost /]#iptables-restore < /opt/iprules_all.txt
或者
[root@localhost /]#service iptables start
后者默认将“/etc/sysconfig/iptables”文件中的内容加载到iptables中,也就是说,如果备份使用的是“service iptables save”那么恢复的时候就应该使用“service iptables start”。
使用iptables服务
开启或关闭iptables服务使用以下命令
[root@localhost /]#service iptables start //开启iptables服务
[root@localhost /]#service iptables stop //关闭iptables服务
前者开启iptables服务,默认加载“/etc/sysconfig/iptables”中的规则,后者关闭iptables服务,默认将会清空所有的iptables规则。
编写防火墙脚本
在生产环境中,我很少会一条一条的去编写iptables规则,最普遍的做法就是,将其写到shell脚本,进行一次性处理。常见的防火墙脚本中,通常包括变量定义、模块加载、/proc调整、规则设置等多个部分,某些简单的防火墙脚本可能只包括规则设置部分。下面我们通过一个“网络型”防火墙脚本实例来了解如何编写防火墙脚本。
[root@loaclhost /]#vim /opt/myipfw.sh
#!/bin/bash
# 1.定义基本变量
INET_IF="eth0" //外网接口
INET_IP="218.29.30.31" //外网接口地址
LAN_IF="eth1" //内网接口
LAN_IP="192.168.1.1" //内网接口地址
LAN_NET="192.168.1.0/24" //内网网段
LAN_WWW_IP="192.168.1.7" //网站服务器的内部地址
IPT="/sbin/iptables" //iptables命令的路径
MOD="/sbin/modprobe" //modprode命令的路径
CTL="/sbin/sysctl" //sysctl命令的路径
# 2.加载内核模块
$MOD ip_tables //iptables基本模块
$MOD ip_conntrack //连接跟踪模块
$MOD ipt_REJECT //拒绝操作模块
$MOD ipt_LOG //日志记录模块
$MOD ipt_iprange //支持IP范围匹配
$MOD xt_tcpudp //支持tcp、udp协议
$MOD xt_state //支持状态匹配
$MOD xt_multiport //支持多端口匹配
$MOD xt_mac //支持MAC地址匹配
$MOD ip_nat_ftp //支持TFP地址转换
$MOD ip_conntrack_ftp //支持TFP连接跟踪
# 3.调整/porc参数
$CTL -w net.ipv4.ip_forward=1 //打开路由转发功能
$CTL -w net.ipv4.ip_default_ttl=128 //修改ICMP响应超时
$CTL -w net.ipv4.icmp_echo_ignore_all=1 //拒绝响应ICMP请求
$CTL -w net.ipv4.icmp_echo_ignore_broadcasts //拒绝响应ICMP广播
$CTL -w net.ipv4.tcp_syncookies=1 //启用SYN Cookie机制
$CTL -w net.ipv4.tcp_syn_retries=3 //最大SYN请求重试次数
$CTL -w net.ipv4.tcp_synack_retries=3 //最大ACK确认重试次数
$CTL -w net.ipv4.tcp_fin_timeout=60 //TCP连接等待超时
$CTL -w net.ipv4.tcp_max_syn_backlog=3200 //SYN请求的队列长度
# 4.设置具体的防火墙规则
# 4.1删除自定义链、清空已有规则
$IPT -t filter -X //清空各表中定义的链
$IPT -t nat -X
$IPT -t mangel -X
$IPT -t raw -X
$IPT -t filter -F //清空各表中已有的规则
$IPT -t nat -F
$IPT -t mangel -F
$IPT -t raw -F
# 4.2定义默认规则
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCETP
# 4.3设置nat表中的各种策略
$IPT -t nat -A POSTROUTING -s $LAN_NAT -o $INET_IF -j SNAT --to-source $INET_IP
$IPT -t nat -A PREROUTING -i $INET_IF -d $INET_IP -p tcp --dport 80 -j DNAT --to-destination $LAN_WWW_IP
# 4.4设置filter表中的各种规则
$IPT -A INPUT -m state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -s $LAN_NET -o $INET_IF -p udp --dport 53 -j ACCEPT
$IPT -A FORWARD -s $LAN_NET -o $INET_IF -p tcp -m multiport --dport 20,21,25,80,110,143,443 -j ACCEPT
$IPT -A FORWARD -d $LAN_NET -i $INET_IF -m state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -d $LAN_WWW_IP -p tcp --dport 80 -j ACCEPT
$IPT -A FORWARD -d $LAN_WWW_IP -p tcp --sport 80 -j ACCEPT
上述防火墙脚本实例中,仅列出其中最基础的一些规则。更多具体的规则设置取决于实际的应用需求,还有待大家在生产环境中慢慢去体会,逐渐融会贯通。