
企业配置iptables生产应用
1.企业配置iptables问题
- vpn服务(拨号到VPN服务器上,然后以VPN的内网地址去访问内部的机器)
- 前端对外提供服务的机器SSH端口都做禁止外部IP访问限制,可以开启后端或者不对外提供服务的机器,保留SSH服务(更改root和SSH端口)。然后,平时先通过VPN连接跳板机,通过跳板机去连接其它机器。
- 流量特别大的外网机器不要开防火墙,会影响性能,购买硬件防火墙
2.iptables企业环境配置步骤
- 环境配置主机防火墙的两种模式:(逛公园及看电影两种模式)
-
逛公园模式:
- 默认随便可以进出,对非法的分子进行拒绝
- 企业应用:企业配置上网网关路由
-
看电影模式:
- 默认没票进不去,花钱买票才能看电影
- 企业应用:服务器主机防火墙
-
很显然第二种模式更严格,更安全;逛公园及看电影两种模式本质就是防火墙的默认规则是允许还是拒绝。
企业白名单
1)清理当前所有规则和计数器
iptables -F
--flush -F [chain] Delete all rules in chain or all chains
删除一个链或所有链中的规则信息(不含默认规则)
提示:iptables -F 和 iptables --flush命令相同作用,既可以使用短格式也可以使用长格式
iptables -Z
--zero -Z [chain [rulenum]] Zero counters in chain or all chains
一个链或所有链的计数器清零
iptables -X
--delete-chain -X [chain] Delete a user-defined chain
删除用户自定义的链
# 实例演示:
[root@x86cloud ~]# iptables -F
[root@x86cloud ~]# iptables -X
[root@x86cloud ~]# iptables -Z
[root@x86cloud ~]# iptables -nvL
Chain INPUT (policy ACCEPT 56 packets, 3904 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 35 packets, 3168 bytes)
pkts bytes target prot opt in out source destination
2)配置允许SSH登陆端口进入
# 允许SSH服务端口开放连接(以下三种方式选择其一即可)
iptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -p tcp -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
提示:此步是为了防止执行下面的步骤,把自己关在外面,除非你在本地主机处理,这步可以不做
3)设置允许本机lo通讯规则
# 允许本机回环lo接口数据流量流出与流入
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
4)设置默认的防火墙禁止和允许规则
# 设置默认DROP掉FORWARD,INPUT链,允许OUTPUT链
--policy -P chain target Change policy on chain to target
改变链上的最终默认规则策略
# 实例演示:
[root@x86cloud ~]# iptables -P INPUT DROP
[root@x86cloud ~]# iptables -P FORWARD DROP
[root@x86cloud ~]# iptables -P OUTPUT ACCEPT
提示:此步完成后,所有的进入服务器的请求都将被阻挡。排除允许ssh可以连接登录策略
设置了看电影的模式
[root@x86cloud ~]# iptables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
249 18124 ACCEPT tcp -- * * 10.0.0.0/24 0.0.0.0/0 tcp dpt:22
2 176 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 11 packets, 1064 bytes)
pkts bytes target prot opt in out source destination
2 176 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
5)开启信任的IP网段
# 允许IDC LAN/WAN和办公网IP的访问,及对外合作机构访问
iptables -A INPUT -s 124.43.62.96/27 -p all -j ACCEPT <- 办公室固定IP段
iptables -A INPUT -s 192.168.1.0/24 -p all -j ACCEPT <- IDC机房的内网网段
iptables -A INPUT -s 10.0.0.0/24 -p all -j ACCEPT <- 其它机房的内网网段
iptables -A INPUT -s 203.83.24.0/24 -p all -j ACCEPT <- IDC机房的外网网段
iptables -A INPUT -s 201.82.34.0/24 -p all -j ACCEPT <- 其它IDC机房的外网网段
提示:本步骤表示允许IDC LAN和办公网IP的无条件连接访问,因为是我们自己人,所以要信任通过
但是对于外部用户还无法访问服务器的任何服务。
6)允许业务服务端口对外访问(允许http服务无条件通过)
# 允许普通的外部服务80
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
7)允许icmp类型协议通过
# 开启内外网利用icmp协议访问的策略
iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
# 如果对内开,对外不开就用下面的方式
iptables -A INPUT -p icmp -s 172.16.1.0/24 -m icmp --icmp-type any -j ACCEPT
8)允许关联的状态包通过(web服务不要使用FTP服务)
# 允许关联的状态包
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
比喻:看电影出去wc或者接电话,回来也得允许进去
扩展:state参数信息说明
连接状态信息参数详细说明:
| 参数 | 详细说明 |
|---|---|
| state[!] --state state | This module, when combined with connection tracking, allows access to the connection tracking state for this packet.这个模块,当结合连接追踪时,允许访问数据包的连接追踪状态Where state is a comma separated list of the connection states to match.这里的连接状态匹配列表采用逗号进行分割状态,可能的状态信息如下 |
| INVALID | meaning that the packet could not be identified for some reason which includes running out of memory and ICMP errors which don't correspond to any known connection由于一些问题无法识别的数据包,其中包含内存不足和ICMP协议错误,而这样的会话连接并不对应已知的连接状态。即:无法识别的无效或非法连接状态 |
| ESTABLISHED | meaning that the packet is associated with a connection which has seen packets in both directions意思是数据包和一个连接有关联,这个连接上可以在两个方向上都能看见这个数据包即:连接会话已建立状态 |
| NEW | meaning that the packet has started a new connection, or otherwise associated with a connection which has not seen packets in both directions意思是数据包开启了一个新的连接,否则也可以说一个连接上两个方向都没有看见过这个数据包:新建立会话连接状态 |
| RELATED | meaning that the packet is starting a new connection, but is associated with an existing connection, such as an FTP data transfer, or an ICMP error.意思是数据包开启了一个新的连接,但是与一个已经存在的连接相关联,比如 FTP数据传输,或ICMP错误,即:在已建立会话连接上,继续建立连接 |
结论:通过其它服务器扫描配置防火墙策略服务器:
namp 10.0.0.19 -p 1-65535 <- 时间会长些
3.iptables永久保存配置信息
在上面的命令行配置中所有的命令结果仅仅存放于内存中,重启服务就会丢失。因此,我们有必要保存成配置文件。
方法一:永久保存iptables配置方法
[root@x86cloud ~]# /etc/init.d/iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
方法二:永远保存iptables配置方法
[root@x86cloud ~]# iptables-save >/etc/sysconfig/iptables
# 提示:/etc/sysconfig/iptables为iptables的默认配置文件路径
# 第一次保存可以覆盖,以后保存只能追加
4.iptables生产环境维护方法
生产中,一般第一次添加规则命令行或者脚本加入然后一次性保存成文件,然后以后就可以改配置文件管理。
[root@x86cloud ~]# cat /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
生产中维护防火墙的方法:
日常调整规则信息
# 确认已有规则信息,并进行编辑修改
vim /etc/sysconfig/iptables <- 编辑防火墙配置文件
-A INPUT -p tcp -m tcp --dport 873 -j ACCEPT <- 编辑添加需要的规则
# 重新加载配置信息,使之生效
[root@x86cloud ~]# /etc/init.d/iptables reload
iptables: Trying to reload firewall rules: [确定]
提示:规则策略需要进行测试,测试没有问题再放入配置文件中,命令行测试过再放入可以不用重启服务
自动控制异常流量
10.0.0.116这个机器总是攻击网站服务器或者在BBS里发垃圾帖子
# 手工封IP方法
iptables -I INPUT -s 10.0.0.116 -j DROP <- 方法较粗暴,范围大
iptables -I INPUT -p tcp -s 10.0.0.116 --dport 80 -j DROP <- 方法较精细,范围小
# 自动封IP方法(分析web或应用日志,或网络连接状态封掉垃圾IP)
#!/bin/sh
/bin/netstat -an | grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}'|sort |uniq -c|sort -rn|\head -10|grep -v -E '192.168|127.0|10.0'|awk '{if ($2!=null && $1>4) {print $2}}' >/home/shell/dropip
for i in $(cat /home/shell/dropip)
do
/sbin/iptables -I INPUT -s $i -j DROP
#-m limit --limit 20/min --limit-burst 6
echo “$i kill at `date`” >>/var/log/ddos
done
5.iptabels生产环境脚本说明
【技巧】
- 具备外网IP的服务器上,但是不对外提供服务最好要做源地址限制
- 具备外网IP的服务器上,但是要对外提供服务不要做源地址限制,例如要开发80端口
【问题1】企业硬件防火墙和iptables防火墙是否要同时用
答:可以同时使用
- 企业硬件防火墙一般放在网关位置,相当于大厦的保安
- 但是,楼里的每个屋子还是需要有人或者锁门的(iptables)
【问题2】 IDC机房部署了硬件防火墙,我们的服务器可以不开防火墙吗
答:绝对不可以!大厦有保安,你的办公室就不锁门吗
5.写一个脚本解决DOS攻击生产案例
提示:根据web日志或者网络连接数,监控当某个IP并发连接数或者短时间内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔3分钟。防火墙命令为:
iptables -I INPUT -s 10.0.1.10 -j DROP
问题处理思路:
-
- 取到IP和IP访问次数
-
- 统计IP访问次数是否大于100
-
- 执行防火墙命令
根据思路编写脚本:
#!/bin/sh
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
function ipt(){
awk ‘{print $1}’ /server/scripts/access.log|sort|uniq -c|sort -nr -k1 >/tmp/tmp.log
exec < /tmp/tmp.log
while read line
do
IP=`echo $line|awk ‘{print $2}’`
if [ `echo $line|awk ‘{print $1}’` -ge 100 -a `iptables -L -n|grep “$IP”|wc -l` -lt 1`];then
iptables -I INPUT -s $IP -j DROP
RETVAL=$?
if [ $RETVAL -eq 0 ];then
action “iptables -I INPUT -s $IP -j DROP” /bin/true
echo “$IP” >> /tmp/ip_$(date +%F).log
else
action “iptables -I INPUT -s $IP -j DROP” /bin/false
fi
fi
done
}
function del(){
exec < /tmp/ip_$(date +%F -d ‘-1day’ ).log
while read line
do
if [ `iptables -L -n|grep “$line”|wc -l` -ge 1 ];then
iptables -D INPUT -s $line -j DROP
fi
done
main(){
flag=0
while true
do
sleep 180
((flag++))
ipt
[ $flag -ge 480 ] && del && flag=0 #表示480*180秒,一天后删除封的IP地址信息
done
}
main