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开放。

四表五链

IPTABLES——学习防火墙_一

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-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 -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              //拒绝本机向本机响应