学习了IPTABLES的基本规则后,我们就可以对Linux主机上的数据包进行规则过滤,体验防火墙的功能了。
一、
当然,首先还是要安装iptables,当我们安装完成后,可以通过
rpm -ql iptables 查看安装的位置
这里要注意:iptables不是服务,是内核中规则,那为什么还会有服务脚本呢??
其实,iptables服务脚本的主要目的在于管理(生效、清除、重新载入)保存的规则,我们定义的规则是直接放在内存中的内核空间中,若是不保存一旦关机后,再开机此前所定义的所有规则就会全部消失。
service iptables save 就可以将之前定义的规则保存在/etc/sysconfig/iptables
iptables-save > /特定目录 将规则保存在特定的文件中,
iptables-restore < /特定目录下的规则文件 使保存在特定文件中的规则生效
service iptables start和service iptables stop的作用就是装载/移除iptables/netfilter相关的内核模块:(新版本的内核可能不同)
iptables_nat,
iptables_filter,
iptables_mangle,
iptables_raw,
ip_nat,
ip_conntrack(当启用NAT功能后,每一个地址转换的报文都需要追踪)
二、
接下来通过例子对规则进行进一步的说明:
【不同的服务用端口号区别】这里本机的IP地址为172.16.100.7
1、例如:放行来自于172.16.0.0/16网段的访问172.16.100.7 服务为sshd(端口为22)的tcp协议【只要有允许或者拒绝就是在filter表上】
先处理INPUT链:放行进入的报文 ipables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p tcp --dport 22 -j ACCEPT 再处理OUTPUT:放行出去的报文 ipables -t filter -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT [处理默认策略] iptables -P INPUT DROP(默认策略关闭) iptables -P OUTPUT DROP iptables -P FORWARD DROP
2、放行访问本机web服务的报文
本机IP地址为172.16.100.7
【进】 放行所有的HTTP服务 插入在第一条,因为web服务应用量大 iptables -I INPUT (-s 0.0.0.0) -d 172.16.100.7 -p tcp --dport 80 -j ACCEPT [原地址为任意即0.0.0.0可以省略] 【出】 iptables -I OUTPUT -s 172.16.100.7 -p tcp --sport 80 -j ACCEPT
3、放行自己ping自己
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo -j ACCEPT iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -o lo -j ACCEPT
4、放行自己ping别人
iptables -A OUTPUT -s 172.16.100.7 -p icmp --icmp-type 8 -j ACCEPT iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 0 -j ACCEPT
5、放行别人ping自己
iptables -A INPUT -s 172.16.100.7 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -s 172.16.100.7 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
注意以上三个例子对不同的发送和接收端进行了说明。
6、开放80端口,80端口进来的连接可以是新请求也可以是已经建立的连接,出去的连接一定是对别人请求的响应。若别人没请求,自己出去则不放行。
iptables -A INPUT -d 172.16.100.7 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -d 172.16.100.7 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
以上规则用到了连接追踪的功能:
这种功能就叫做IP_CONNTRACK(是一个内核模块,实时记录主机客户端和服务器端彼此正在建立的连接关系,并且能够追踪到每一个连接和其他的连接之间的关系和状态)
根据IP报文进行追踪,不管是TCP协议还是UDP协议还是ICMP协议
在linux的/proc/net/ip_conntrack文件中,保存有当前系统上每一个客户端与当前主机所建立的连接关系。高版本的linux下为nf_conntrack 文件
cat /proc/net/ip_conntrack或者iptstate 命令可以查看
nf_conntrack最多能保存多少个条目
可以在/etc/sysctl.conf中添加net.ipv4.netfilter.ip_conntrack_max = 655360 来定义
【注意iptables -t nat -L此查看命令可以自动加载和iptables有关的内核模块】
7、放行本机的ftp报文
(确保在/etc/sysconfig/iptables-config下启用IPTABLES_MODULES=”ip_nat_ftp ip_conntrack_ftp”)
iptables -A INPUT -d 172.16.100.7 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -R OUTPUT 1 -s 172.16.100.1 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
8、离散的多端口匹配
iptables -A INPUT -d 172.16.100.7 -p tcp -m tcp --dports 22 -m state NEW -j ACCEPT iptables -A INPUT -d 172.16.100.7 -p tcp -m tcp --dports 21 -m state NEW -j ACCEPT iptables -A INPUT -d 172.16.100.7 -p tcp -m tcp --dports 80 -m state NEW -j ACCEPT 以上的三条规则可以用下面一条规则代替: iptables -I INPUT 2 -d 172.16.100.7 -p tcp -m multiport --destination-ports 21,22,80 -m state NEW -j ACCEPT
9、根据IP范围控制报文
iptables -A INPUT -p tcp -m iprange --src-range 172.16.100.3-172.16.100.100 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
10、限制用户Ping的数目频次
iptables -I INPUT 1 -d 172.16.100.7 -p icmp --icmp-type 8 -m limit --limit 5/minute --limit-burst 6 -j ACCEPT iptables -I OUTPUT 1 -s 72.16.100.7 -m state --state RELATED,ESTABLISHED -j ACCEPT
11、若用户请求的内容包含str字符串,则拒绝响应
iptables -I OUTPUT -s 172.16.100.7 -m string --algo kmp --string “str” -j REJRCT
12、记录日志
iptables -I INPUT 4 -d 172.16.100.7 -p icmp --icmp-type 8 -j LOG --log-prefix “--firewall log for icmp--”