IPTABLES——学习防火墙_一
iptables
初识防火墙
防火墙历史
早期,LInux上没有防火墙机制,参考OpenBSD的机制,移植而来。LInux2.2之后出现了真正意义上的Linux防火墙
版本 | 用户空间名称 | 内核名称 |
---|---|---|
Linux2.0 | ipfw | firewall |
Linux2.2 | ipchain | firewall |
Linux2.4-2.6 | iptables | netfilter |
什么是防火墙
防火墙:对于互联网、计算机来说,工作在主机或者网络边缘(数据报文进出的地方:网卡、路由),对于进出的报文进行检查、监控、根据事先定义好的规则,做出相应处理的处理动作的一组组件。
Linux中的防火墙
工作在Linux内核中的网络防火墙系统,由iptables和netfilter组成,iptables和netfilter是一组工具,真正生效、发挥作用的是netfilter(内核中的一个过滤框架),iptables是一个生成防火墙规则、并将其附加在netfilter上,从而实现数据报文处理的工具。
防火墙流程:iptables生成规则,附加给netfilter,根据ip报文首部和tcp报文首部等进行处理
icmp:互联网控制消息协议
防火墙分类 :硬件和软件。通过软硬件实现:定义匹配规则,处理办法。
防火墙机制:
默认规则:如果没有定义的规则,则由默认规则生效,默认规则有两种思想:
堵:拒绝所有未知(未定义规则)的请求
-
通:除了定义的规则(定义中的请求全部拒绝),其他都默认允许访问
一般情况,防火墙默认规则都是用"堵"的思想。
定义防火墙规则的依据
防火墙的匹配标准(如何定义规则/根据什么定义规则),根据研究报文的特征:
对于IP报文,有源IP,目标IP
-
对于TCP/UDP报文,有源PORT,目标PORT。甚至TCP的消息位,SYN,FIN,RST,ACK等不同的值,来进行防火墙规则定义。
如:SYN=1,ACK=0,RST=0,FIN=0,这样的值,就可以定义第一次握手规则。
对于ICMP报文,有icmp-type,icmp使用 不同报文格式
这些都可以成为防火墙生效的依据,即根据上述的特征,实现防火墙规则的生成
防火墙规则设定
防火墙规则是在内核里面设定的,不能放在用户空间,通过iptables工具(管理工具)对规则定义,在内核中实现。在TCP/IP栈上,开辟了五个位置,对用户空间iptales开放。
四表五链
HOOK:钩子函数,
工作在TCP/IP协议栈有三个钩子函数,对报文进行处理:
在路由决策后,如果时转发给本地用户空间,在转往用户空间时,设置有一个HOOK,叫INPUT,即图位置'1'
用户空间响应请求,做出响应报文发送,要通过内核的TCP/IP栈,设置有一个HOOK,叫OUTPUT,即图位置'2'
在路由决策后,要转发报文信息到别的地址,在出TCP/IP栈时,设置有一个HOOK,叫FORWARD,即图位置'3'
还有两个钩子函数,主要时为了实现一些如地址转换的功能:
在数据报文进入时,在网卡处,在路由表做出决策之前,设置有一个HOOK,叫PREROUTING,即图位置'4'
在路由表做出决策之后,转发的报文在出去之前,经过网卡时,设置有一个HOOK,叫POSTROUTING,即图位置'5'
什么是规则链:每个钩子上,都可以放很多规则,称之为规则链,即INPUT链、OUTPUT链、FORWARD链、PREROUTING链、POSTROUTING链。
不同的链,可以实现不通的规则,形成表:
filter(过滤规则)表可以在如下的链上进行实现:过滤数据包
IPUT链
OUTPUT链
FORWARD链
nat(地址转换)表:对数据报文(针对IP和端口)进行转换
PREROUTING链
POSTROUTING链
OUTPUT链
mangle()表:将报文首部(如TTL值、服务类型等)拆开,修改,再封装
五个链都可以进行操作
Raw()表:决定数据包是否被状态跟踪机制处理
PREROUTING链
OUTPUT链
四表顺序(优先次序):
PREROUTING | INPUT | OUTPUT | FORWARD | POSTROUTING | |
---|---|---|---|---|---|
filter | 2 | 4(最低优先级) | 2 | ||
nat | 3 | 3 | 2 | ||
mangle | 2 | 1 | 2 | 1 | 1 |
raw | 1(最高优先级) | 1 |
所谓的net(地址转换):是对报文进行拆封操作,更改报文的IP,端口,MAC等操作。具体有:
目标地址转换:这是在路由决策之前进行更改的。
源地址转换:这是在响应时更改的,在路由决策之后。
能否使用自定义的链?如果需要自定义链,但必须让默认链调用后发挥作用,而且如果没有被任何一条规则匹配到应该有返回机制。用户可以删除自定义的空链,默认链不可以被删除。自定义链的好处:可以提高效率。
每个规则都有两个计数器,一个用来记录被匹配到的报文个数,另一个用来记录被匹配到的报文体积之和。
规则分为两块:匹配标准、处理动作
匹配标准有:
通用匹配(普通匹配):使用netfilter默认都有的模块进行匹配
-
扩展匹配:是用netfilter的扩展模块才能使用匹配
扩展匹配可以分为:
隐含扩展:不用特别指名由哪个模块扩展:使用-p tcp|udp|icmp
显示扩展:必须指明由哪个模块进行扩展,使用-m可以完成
IPTABLES工具
使用用户空间的iptables
工具,可以实现规则的生成,传递给内核。具体方式:
iptables -t 表名 链选项 链名 匹配标准 -j 处理办法
iptables的通用匹配规则
iptables [ -t TABLE ] COMMAND CHAIN [ NUM ] 匹配标准 -j 处理办法
-t TABLE:指定对哪个表进行操作
COMMAND:操作动作
CHAIN:指定对哪个链进行操作
通用匹配:
-s,--src:源地址
-d,--dst:目标地址
-p,{tcp|udp|icmp}:协议
-i 网络接口(如:eth1):指定数据报文流入的接口,一般用在PREROUTING,INOUT,FORWARD链
-o 网络接口:指定数据报文流出的接口,一般用在,OUTPUT,POSTROUTING,FORWARD链
-j TARGET:跳转到处理办法
常用的处理办法:
ACCEPT:同意通过
DROP:丢弃
REJECT:拒绝通过
示例:
iptables -t filter -A INPUT -s 172.25.254.0/24 -j DROP //经过input链,源ip为172.25.254网段,都丢弃
IPTABLES使用
使用环境:
redhat6.5
局域:172.25.254.0/24
本机IP:172.25.254.102
常用的命令分为两大类:管理规则和管理链。
管理规则:
-A(append):在尾部附加一条规则
-I CHAIN [num]:插入一条规则,可以指定位置即插入到某链的第num条,如果省略num则插到第一条;
-D CHAIN [num]:删除指定链中第num条规则
-R CHAIN [num]:替换(修改)第num条规则
管理链:
-F(flash) [ CHAIN]:清空指定链,如果省略CHAIN,则实现删除对应表中的所有链
-P CHAIN [ accept/dorp/reject]:设定指定链的默认规则策略
-N:自定义一个新的空链
-X:删除一个自定义的空链
-Z:清空指定链中的所有规则的计数器(置0)
-E:重命名自定义的链
查看类:
-L:显示指定表中的所有规则
-L -n:以数字格式显示主机地址和端口号
-L -v:详细信息
-L -x:显示计数器的精确值
-L --list-numbers:显示规则号码
执行的动作(target):
ACCEPT:同意
DROP:丢弃
REJECT:拒绝
SNAT:源地址转换
DNAT:目标地址转换
REDIRECT:端口重定向
MASQUERADE:地址伪装
LOG:记录日志
MARK:标记报文隐含匹配:
-p tcp:
--sport:源端口(支持连续端口:PORT-PORT)
--dport:目标端口
--tcp-flags mask comp:TCP的标志位,只检查mask标记的标志位列表,comp中列表位必须位1;如:--tcp-flags SYN,FIN,ACK,RST SYN,ACK 这个的意思是:检查SYN,FIN,ACK,RST 且只能SYN,ACK为1,其他的必须为0
--syn:专门匹配三次握手中的第一次
-p icmp:
--icmp-type [number]
ping出去的请求时8:叫ECHO REQUEST(请求);ping回来的是0:叫ECHO REPLY(回应)
-p udp:
--sport
--dport
测试
测试1
目的,开启防火墙后,对外提供httpd
服务
首先开启httpd
服务,在本机测试:
[[email protected] ~]# echo "test for iptables 172.25.254.102"> /var/www/html/index.html [[email protected] ~]# curl 172.25.254.102 test for iptables 172.25.254.102
开启防火墙:
[[email protected] ~]# /etc/init.d/iptables start iptables: Applying firewall rules: [ OK ]
开启防火墙功能,查看防火墙当前信息:
[[email protected] ~]# iptables -L -nChain INPUT (policy ACCEPT) //INPUT链上target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited //拒绝一切服务,但是这条规则比较靠后,之前的ACCEPT无法被拒绝
Chain FORWARD (policy ACCEPT) //FORWARD链target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT) //OUTPUT链target prot opt source destination
此时客户端(172.25.254.111)访问httpd
服务
[[email protected] ~]# ifconfig br0 br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.25.254.111 netmask 255.255.255.0 broadcast 172.25.254.255 inet6 fe80::221:ccff:fe4a:b047 prefixlen 64 scopeid 0x20<link> ether 00:21:cc:4a:b0:47 txqueuelen 0 (Ethernet) RX packets 13748 bytes 1968858 (1.8 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 20923 bytes 45240059 (43.1 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [[email protected] ~]# curl 172.25.254.102 curl: (7) Failed connect to 172.25.254.102:80; No route to host //此时访问被拒绝
添加防火墙墙规则允许访问httpd
[[email protected] ~]# iptables -t filter -I INPUT -d 172.25.254.102 -p tcp --dport 80 -j ACCEPT
//-t filter:指定是filter表;-I INPUT:指定插入最前,INPUT链。-d 172.25.254.102:这里没有添加sport,默认是0.0.0.0,-d是dport,目标IP为172.25.254.102;-p tcp --dport 80:指定tcp协议,目标端口80,省略--sport,如果不指定--sport默认为全部端口允许;-j ACCEPT:处理方式为允许
//如果只添加这个,报文能进去(能通过INPUT链),出不来(不能通过OUTPUT链响应)
[[email protected] ~]# iptables -t filter -I OUTPUT -s 172.25.254.102 -p tcp --sport 80 -j ACCEPT
//指定规则,可以从OUTPUT链出来
[[email protected] ~]# iptables -L -nChain INPUT (policy ACCEPT)target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 172.25.254.102 tcp dpt:80 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)target prot opt source destination ACCEPT tcp -- 172.25.254.102 0.0.0.0/0 tcp spt:80
此时客户端(172.25.254.111)访问httpd
服务
[[email protected] ~]# curl 172.25.254.102 test for iptables 172.25.254.102 //访问成功
测试2
不想被ping
通,原本的默认服务器策略:
[[email protected] ~]# iptables -LChain INPUT (policy ACCEPT)target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT icmp -- anywhere anywhere //允许icmp协议通过防火墙ACCEPT all -- anywhere anywhere ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)target prot opt source destination REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)target prot opt source destination [[email protected] ~]# iptables -D INPUT 2
此时,客户端(172.25.254.111)可以ping
通主机
[[email protected] ~]# ping 172.25.254.102 PING 172.25.254.102 (172.25.254.102) 56(84) bytes of data. 64 bytes from 172.25.254.102: icmp_seq=1 ttl=64 time=0.224 ms ^C --- 172.25.254.102 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms
在服务器端删除允许icmp
策略的规则:
[[email protected] ~]# iptables -D INPUT 2 //可以看到
icmp
是INPUT链的第二条规则,删除[[email protected] ~]# iptables -LChain INPUT (policy ACCEPT)target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT all -- anywhere anywhere ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh REJECT all -- anywhere anywhere reject-with icmp-host-prohibitedChain FORWARD (policy ACCEPT)target prot opt source destination REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)target prot opt source destination [[email protected] ~]# iptables -LChain INPUT (policy ACCEPT)target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT all -- anywhere anywhere ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)target prot opt source destination REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)target prot opt source destination
此时,客户端(172.25.254.111)就不可以ping
通主机
[[email protected] ~]# ping 172.25.254.102 PING 172.25.254.102 (172.25.254.102) 56(84) bytes of data. From 172.25.254.102 icmp_seq=1 Destination Host Prohibited From 172.25.254.102 icmp_seq=2 Destination Host Prohibited From 172.25.254.102 icmp_seq=3 Destination Host Prohibited ^C --- 172.25.254.102 ping statistics --- 3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 1999ms
测试3
不让自己主机访问自己主机,(没有任何意义,只是为了熟悉IPTABLES规则)
两条规则搞定:
[[email protected] ~]# iptables -t filter -I INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo -j DROP //注意:-i lo是指流入网卡是经过lo网卡;下面的-o lo是指流出网卡时,经过lo网卡 [[email protected] ~]# iptables -t filter -I OUTPUT -s 127.0.0.1 -d 127.0.0.1 -o lo -j DROP [[email protected] ~]# ping 172.25.254.102 //ping本机失败 PING 172.25.254.102 (172.25.254.102) 56(84) bytes of data. From 172.25.254.102 icmp_seq=1 Destination Host Prohibited From 172.25.254.102 icmp_seq=2 Destination Host Prohibited ^C --- 172.25.254.102 ping statistics --- 2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 1000ms
查看iptables规则:
[[email protected] ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination DROP all -- 127.0.0.1 127.0.0.1 //拒绝本机访问本机 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:67 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:67 DROP tcp -- 172.25.254.111 172.25.254.102 tcp dpt:80 Chain FORWARD (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 192.168.122.0/24 ctstate RELATED,ESTABLISHED ACCEPT all -- 192.168.122.0/24 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable Chain OUTPUT (policy ACCEPT) target prot opt source destination DROP all -- 127.0.0.1 127.0.0.1 //拒绝本机向本机响应