在Linux中,iptables为我们提供了批量备份与恢复规则的命令,防火墙脚本实际上是一个shell脚本程序,便于使用shell变量、程序控制逻辑,在需要重用、移植使用时会非常方便,只需修改下变量值就可使用
iptables的备份及还原
防火墙规则的批量备份、还原用到两个命令,即iptables-save和iptables-restore,分别用来保存和恢复
1. iptables-save命令
用来批量导出防火墙规则,直接执行命令时,将显示当前启用的所有规则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[root@localhost ~]
# iptables-save
# Generated by iptables-save v1.4.7 on Sun Jan 7 06:07:58 2018 //注释
*filter
//
所在的表
:INPUT ACCEPT [0:0]
//
链名,默认策略
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [41:5449]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
//
规则,省略了iptables
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
//
提交前面的规则设置
# Completed on Sun Jan 7 06:07:58 2018
[root@localhost ~]
# iptables-save > /opt/iptables.txt //备份所有表的规则
[root@localhost ~]
# iptables-save > /etc/sysconfig/iptables //每次开机后,根据保存的规则内容进行重建
|
2. iptables-restore命令
用来批量导入Linux防火墙规则,如果已经使用iptables-save命令导出的备份文件,则恢复的过程一瞬间就能完成
1
|
[root@localhost ~]
# iptables-restore /opt/iptables.txt //从备份文件中恢复规则
|
使用防火墙脚本
1. 定义基本变量
可以在防火墙规则较多时,定义以下变量,一旦网络环境发生变化,只需改下变量值就可使用
1
2
3
4
5
6
7
8
9
10
11
|
[root@localhost ~]
# vim /opt/iptables.sh //创建脚本文件
#!/bin/bash
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.6"
//
网站服务器的内部地址
IPT=
"/sbin/iptables"
//iptables
命令路径
MOD=
"/sbin/modprobe"
//modprobe
命令路径
CTL=
"/sbin/sysctl"
//sysctl
命令路径
|
2. 加载内核模块
如果需要启用的规则数量较多,为了提高规则设置的效率,保持防火墙的稳定性,建议将用到的各种模块提前加载到内核中
1
2
3
4
5
6
7
8
9
10
11
|
$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
//
支持FTP匹配
$MOD ip_conntrack_ftp
//
支持FTP连接跟踪
|
3. 调整/proc参数
在文件夹/proc/sys下存放着与系统相关的一些可控参数,可以直接用来改变内核的行为,通常作为Linux内核调优的实时入口,下面列出几个常用的/proc参数
1
2
3
4
5
6
7
8
9
|
$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. 设置具体的iptables规则
iptables的nat表主要用在Linux网关服务器,一般的主机型防火墙很少用到nat表
iptables的filter表主要用来过滤各种数据包,无论是Linux网关还是一般的Linux服务器都可能用的。主机型的防火墙主要使用INPUT、OUTPUT链,而对于网络型防火墙主要使用FORWARD链
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
$IPT -t filter -X
//
删除各表中自定义的链
$IPT -t nat -X
$IPT -t filter -F
//
清空各表中已有的规则
$IPT -t nat -F
$IPT -P INPUT DROP
//
设置规则链的默认策略
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
$IPT -t nat -A POSTROUTING -s $LAN_NET -o $INET_IF -j SNAT --to-
source
$INET_IP
//SNAT
策略,局域网共享上网
$IPT -t nat -A PREROUTING -i $INET_IF -d $INET_IP -p tcp --dport 80 -j DNAT --to-destination $LAN_WWW_IP
//DNAT
策略,发布内部Web服务器
$IPT -A FORWARD -s $LAN_NET -o $INET_IF -p tcp --dport 80 -j ACCEPT
//
允许内网与Internet中DNS、FTP、Web服务通信
$IPT -A FORWARD -s $LAN_NET -o $INET_IF -p tcp --dport 20:21 -j ACCEPT
$IPT -A FORWARD -s $LAN_NET -o $INET_IF -p udp --dport 53 -j ACCEPT
|
5. 执行脚本
在实际应用中,不要生硬的照搬他人脚本内容,应根据情况进行针对型的设计,并做好整天规划,避免产生通信故障
1
2
3
4
5
|
[root@localhost ~]
# chmod +x /opt/iptables.sh //添加执行权限
[root@localhost ~]
# /opt/iptables.sh //执行脚本文件
[root@localhost ~]
# vim /etc/rc.local //设置为开机自动执行
/opt/iptables
.sh
|
对于大多数应用服务器,防火墙只针对本机进行防护,因此filter表中的INPUT、OUTPUT链用到的最多,特别是前者
案例:某公司的Web服务器采用RHEL6操作系统,为了加强网络访问的安全性,要求管理员熟悉iptables防火墙规则的编写,以便制定有效、可行的主机防护策略
需求描述:
(1)调整TCP相关参数,提高抵抗DoS攻击的能力
(2)只允许访问本机的Web服务,禁止其他任何形式的入站访问数据
(3)允许响应本机访问请求的数据包
实验步骤:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
[root@localhost ~]
# vim /opt/iptables_web.sh
#!/bin/bash
# 1. 定义基本变量
IPT=
"/sbin/iptables"
CTL=
"/sbin/sysctl"
# 2. 调整/proc参数
$CTL -w net.ipv4.tcp_syncookies=1
$CTL -w net.ipv4.tcp_syn_retries=3
$CTL -w net.ipv4.tcp_synack_retries=3
$CTL -w net.ipv4.tcp_fin_timeout=60
$CTL -w net.ipv4.tcp_max_syn_backlog=3200
# 3. 删除自定义的链、清空已有规则
$IPT -t filter -X
$IPT -t nat -X
$IPT -t mangle -X
$IPT -t raw -X
$IPT -t filter -F
$IPT -t nat -F
$IPT -t mangle -F
$IPT -t raw -F
# 4. 定义默认策略
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
# 5. 设置filter表中的规则
$IPT -A INPUT -s $LAN_NET -o $INET_IF -p tcp --dport 80 -j ACCEPT
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
|