1 iptables防火墙简介
iptables是linux自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙工具,它的功能特别强大,使用非常灵活,可以对流入和流出服务器的数据包进行很精细的控制。iptables主要工作在OSI七层的二、三、四层。
netfilter/iptables(两者一样),iptables是表的容器,包含的各个表,iptables的表又是链的容器,链是规则的容器,规则是一条条过滤的语句。
iptables的表:(filter表,nat表,mangle表,raw表,最常用的是前面两个)
iptables的链:INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING,所有的链名字要大写。
链:(chains),规则(Police)
filter表的作用:主要和主机自身有关,负责主机防火墙功能过滤的,过滤流入流出主机的数据包。是iptables默认的表,应用与主机防火墙。该表下定义了3个链(INPUT,FORWARD,OUTPUT,即进入主机的数据包,负责转发流经主机的数据包,处理从主机发出去的数据包),注意:对于filter表的控制,是我们实现本机防火墙功能的重要手段,特别是对INPUT链的控制。
nat表的作用:负责网络地址转换,来源与目的IP地址和port的转换。应用:和主机本身无关,一般用于局域网共享上网或者特殊的端口转换服务相关。用于做企业路由或网关,共享上网(POSTROUTING),也可做内部IP地址一对一映射,硬件防火墙映射IP到内部服务器,ftp服务(PREROUTING),该表中定义了3个链:(OUTPUT,PREROUTING,POSTROUTING,即:和主机发出去的数据包有关,改变主机发出数据包的目的地址;在数据包达到防火墙时进行路由判断之前执行的规则,改变数据包的目的地址,目的端口等;在数据包离开防火墙时,进行路由判断之后执行的规则,作用改变数据包的源地址,源端口等)。
2 iptables的工作流程
是采用数据包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则进行匹配来决定是否可以进入主机。
上图小结:
1)防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
2)如果匹配上规则,即明确表面是阻止还是通过,数据包就不在向下匹配新规则了。
3)如果所有规则中没有明确表明是阻止还是通过,也就是没有匹配规则,向下进行匹配,知道匹配默认规则得到明确的阻止还是通过。
4)防火墙默认规则是对应链所有的规则执行完才会执行的。
注意:iptables防火墙规则的执行顺序默认从前到后(从上到下)依次执行,遇到匹配的规则就不在继续向下检查,只有遇到不匹配的规则才会继续向下进行匹配,匹配上了拒绝规则也是匹配。
3 iptables常用的命令总结
[root@localhost 桌面]# iptables -V //查看版本号
iptables v1.4.7
[root@localhost 桌面]# iptables -h //查看帮助信息
[root@localhost 桌面]# iptables -nL //查看当前状态filter表的防火墙规则
[root@localhost 桌面]# iptables -t nat -nL //查看当前状态nat表的防火墙规则
[root@localhost 桌面]# iptables (-t filter)-F //清除filter表中所有的规则
[root@localhost 桌面]# iptables -t nat -F //清除nat表中所有的规则
[root@localhost 桌面]# iptables -N chain //创建自定义链,很少用
[root@localhost 桌面]# iptables -X //删除自定义的链,很少用
[root@localhost 桌面]# iptables -Z //把曾经的链的计数器清零
[root@localhost 桌面]# /etc/init.d/iptables save //保持防火墙规则
[root@localhost 桌面]# /etc/init.d/iptables restart //重启iptables
[root@localhost 桌面]# ss -anptu |grep ssh //找出当前机器的ssh端口
tcp LISTEN 0 128 :::22 :::* users:(("sshd",1969,4))
tcp LISTEN 0 128 *:22 *:* users:(("sshd",1969,3))
4 iptables常用语法 iptables -t [表] -选项 链 规则 -j 处理方式
表:filter,nat(主要),manngle,raw
选项:A增加(在末尾添加),D删除,I增加(在开头添加)
链条:INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
规则:-p 协议等
处理方式:DROP,ACCEPT,REJECT(丢弃、接受、拒绝)
5 设置防火墙iptables的默认规则(-P)
[root@localhost 桌面]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@localhost 桌面]# iptables -P OUTPUT ACCEPT
[root@localhost 桌面]# iptables -P FORWARD DROP
[root@localhost 桌面]# iptables -P INPUT DROP
[root@localhost 桌面]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
6 企业案例:问题:/var/log/message出现kernel:nf_conntrack:table full,dropping packet.这是怎么回事?
导致结果:上述结果会让业务访问很慢。 如何解决?
解决:在/etc/sysctl.conf优化时可以加上如下内容:
vim /etc/sysctl.conf
net.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_max = 25000000 //把池子调大
net.ntfilter.nf_conntrack_tcp_timeout_established = 180 //建立连接了,超时时间调小,下面同理
net.ntfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.ntfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.ntfilter.nf_conntrack_tcp_timeout_fin_wait = 120
7如果无法启动防火墙的解决方法
[root@localhost 桌面]# /etc/init.d/iptables restart
如果无法启动防火墙,则:setup——firewall configuration——enable
8查看和添加防火墙内核模块
[root@localhost 桌面]# lsmod |egrep "nat|filter" //查看防火墙内核模块
ip6table_filter 2889 1
ip6_tables 18732 1 ip6table_filter
iptable_filter 2793 1
ip_tables 17831 1 iptable_filter
加载如下模块到linux内核:(这是在命令行执行,也可写入/etc/rc.local中)
[root@localhost 桌面]# modprobe ip_tables
[root@localhost 桌面]# modprobe iptable_filter
[root@localhost 桌面]# modprobe iptable_nat
[root@localhost 桌面]# modprobe ip_conntrack
[root@localhost 桌面]# modprobe ip_conntrack_ftp
[root@localhost 桌面]# modprobe ip_nat_ftp
[root@localhost 桌面]# modprobe ipt_state
[root@localhost 桌面]# lsmod |egrep "nat|filter" //加载模块后再查看内核模块会增多
9 iptables的安全优化
生产情况看情况,一般内网关闭,外网打开。大并发情况不能开iptables,影响性能。大并发情况可以用硬件防火墙。
尽可能不给服务器配置外网IP,可以通过代理转发。
并发不是特别大的情况再外网的IP的环境,开启防火墙。
10 其他常见的匹配规则
匹配单一端口:封源端口或目的端口 //一般很少封源端口
[root@localhost 桌面]# iptables -A INPUT -p tcp --sport 80 -j DROP
[root@localhost 桌面]# iptables -A INPUT -p tcp --dport 80 -j DROP
[root@localhost 桌面]# iptables -A INPUT -p udp --dport 80 -j DROP
匹配指定端口之外的端口:(写法:冒号隔开可以或者-m multiport指定不连续多个端口):
[root@localhost 桌面]# iptables -A INPUT -p tcp ! --dport 80 -j DROP
[root@localhost 桌面]# iptables -A INPUT -p tcp ! --dport 22 -j DROP
[root@localhost 桌面]# iptables -A INPUT -p tcp ! --dport 22 -s 192.168.4.205 -j DROP
[root@localhost 桌面]# iptables -A INPUT -p tcp ! --dport 22 -s 192.168.4.0/24 -j DROP
匹配端口范围:
[root@localhost 桌面]# iptables -A INPUT -p tcp ! --sport 22:80 -j DROP
[root@localhost 桌面]# iptables -A INPUT -p tcp ! --dport 22:80 -j DROP
[root@localhost 桌面]# iptables -t filter -A INPUT -p tcp ! --dport 22:80 -j DROP
[root@localhost 桌面]# iptables -A INPUT -p tcp ! --dport 18:80 -j DROP
[root@localhost 桌面]# iptables -A INPUT -p tcp --dport 18:80 -j DROP
[root@localhost 桌面]# iptables -A INPUT -p tcp -m multiport --dport 21,22,80,3306 -j DROP
[root@localhost 桌面]# iptables -A INPUT -p tcp --dport 3306:8809 -j ACCEPT
匹配ICMP类型 any和8都可以:
[root@localhost 桌面]# iptables -A INPUT -p icmp --icmp-type any -j ACCEPT
[root@localhost 桌面]# iptables -A INPUT -p icmp --icmp-type any -j DROP
[root@localhost 桌面]# iptables -A INPUT -s 192.168.4.0/24 -p icmp --icmp-type any -j DROP
匹配指定的网络接口:
[root@localhost 桌面]# iptables -A INPUT -i eth0
[root@localhost 桌面]# iptables -A FORWARD -i eth0
[root@localhost 桌面]# iptables -A OUTPUT -o eth0
[root@localhost 桌面]# iptables -A FORWARD -o eth0
匹配网络状态:FTP服务是特殊的,需要匹配状态连接:
-m state
NEW:已经或将启动新的连接
ESTABLISHED:已建立的连接
RELATED:正在启用的新连接
INVALID:非法或无法识别的
[root@localhost 桌面]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@localhost 桌面]# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@localhost 桌面]# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j DROP
[root@localhost 桌面]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j DROP
11 -m limit用法 //指定时间内的请求速率
如:本机地址:192.168.4.5,允许192.168.4.0网段的的主机ping本机,但限制每分钟请求不能超过20个,每次并发不能超过6个,如下:(8可以换成any)
[root@localhost 桌面]# iptables -A INPUT -s 192.168.4.0/24 -d 192.168.4.5 -p icmp --icmp-type 8 -m limit --limit 20/min --limit-burst 6 -j ACCEPT
12 企业生产中如何维护iptables防火墙
一般第一次配置规则后,保存规则后,会把规则自动写入配置文件/etc/sysconfig/iptables中,
以后,如果想增加或删除规则,可以直接修改配置文件:vim /etc/sysconfig/iptables,将规则写入或修改即可。
将规则修改或写入后,/etc/init.d/iptables reload 重新加载即可。
13 对攻击服务器的黑客的IP进行封堵案例思路
自动封:先用awk,sort排序等取出攻击服务器的黑客IP, …… > /home/shell/gongjiip,然后写脚本:
/bin/netstat –anptu |grep ESTABLISHED|awk …… > /home/shell/gongjiip
for i in $(cat /home/shell/gongjiip)
do
/sbin/iptables -I INPUT -s $i -j DROP
echo “$i kill at `date`” >>/var/log/ddos
done
手动封:查看到那个攻击服务器的黑客的IP,然后手动配置规则封。
[root@localhost 桌面]# iptables -I INPUT -s 192.168.4.205 -j DROP
[root@localhost 桌面]# iptables -I INPUT -p tcp -s 192.168.4.206 --dport 80 -j DROP
对snmp服务封堵:[root@localhost 桌面]# iptables -A INPUT -s 192.168.4.0/24 -p UDP --dport 161 -j DROP
对rsync服务封堵:[root@localhost 桌面]# iptables -A INPUT -s 192.168.4.0/24 -p tcp --dport 873 -j DROP
14 企业的硬件防火墙和iptables防火墙是否要同时用?
可以同时用,iptables防火墙过滤,有时也是很粗糙的,所以有时也需要硬件防火墙做更细致的过滤。
IDC机房部署了硬件防火墙,我们的服务器可以不开防火墙吗?
绝对不可以。