火墙策略(上) & iptables

来源:互联网 发布:4选1数据选择器代码 编辑:程序博客网 时间:2024/06/09 16:06

防火墙在做信息包过滤决定时,有一套遵循和组成的规则,这些规则存储在专用的信 息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。而netfilter/iptables IP 信息包过滤系统是一款功能强大的工具,可用于添加、编辑和移除规则。 虽然 netfilter/iptables IP 信息包过滤系统被称为单个实体,但它实际上由两个组件netfilter 和 iptables 组成。 netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。除非您正在使用 Red Hat Linux 7.1 或更高版本,否则需要下载该工具并安装使用它。

三表五链的概念:

  • filter,这是默认的表(经过内核),包含了内建的链INPUT(处理进入的包)、FORWARD(处理通过的包)和OUTPUT(处理本地生成的包)。
  • nat(不经过内核),这个表被查询时表示遇到了产生新的连接的包,由三个内建的链构成:PREROUTING
    (修改到来的包,做目的地地址转换DNAT)、OUTPUT(修改路由之前本地的包)、POSTROUTING(修改准备出去的包,做源地址转换SNAT)。
  • mangle
    (附加表)这个表用来对指定的包进行修改。它有两个内建规则:PREROUTING(修改路由之前进入的包)和OUTPUT(修改路由之前本地的包)。


非常详细的参数说明:

参数  //作用-P  //设置默认策略:iptables -P INPUT (DROP|ACCEPT)-h Help.//帮助。给出当前命令语法非常简短的说明。-F -flush//清空所选链。这等于把所有规则一个个的删除。-L -list//显示所选链的所有规则。如果没有选择链,所有链将被显示。也可以和z选项一起使用,这时链会被自动列出和归零。精确输出受其它所给参数影响。-A -append//在所选择的链末添加一条或更多规则。当源(地址)或者/与 目的(地址)转换为多个地址时,这条规则会加到所有可能的地址(组合)后面。-I -insert//根据给出的规则序号向所选链中插入一条或更多规则。所以,如果规则序号为1,规则会被插入链的头部。这也是不指定规则序号时的默认方式。-D -delete//从所选链中删除一条或更多规则。这条命令可以有两种方法:可以把被删除规则指定为链中的序号(第一条序号为1),或者指定为要匹配的规则。-s address[/mask]   //匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。指定源地址,可以是主机名、网络名和清楚的IP地址。mask说明可以是网络掩码或清楚的数字,在网络掩码的左边指定网络掩码左边"1"的个数,因此,mask值为24等于255.255.255.0。在指定地址前加上"!"说明指定了相反的地址段。标志 --src 是这个选项的简写。-d  ##匹配目标地址-i -进入的(网络)接口 [!][名称]//这是包经由该接口接收的可选的入口名称,包通过该接口接收(在链INPUT、FORWORD和PREROUTING中进入的包)。当在接口名前使用"!"说明后,指的是相反的名称。如果接口名后面加上"+",则所有以此接口名开头的接口都会被匹配。如果这个选项被忽略,会假设为"+",那么将匹配任意接口。-o --输出接口[名称]//这是包经由该接口送出的可选的出口名称,包通过该口输出(在链FORWARD、OUTPUT和POSTROUTING中送出的包)那么将匹配所有任意接口。-p -protocal [!]protocol//规则或者包检查(待检查包)的协议。指定协议可以是tcp、udp、icmp中的一个或者全部,也可以是数值,代表这些协议中的某一个。当然也可以使用在/etc/protocols中定义的协议名。在协议名前加上"!"表示相反的规则。数字0相当于所有all。Protocol all会匹配所有协议,而且这是缺省时的选项。在和check命令结合时,all可以不被使用。-R -replace//从选中的链中取代一条规则。如果源(地址)或者/与 目的(地址)被转换为多地址,该命令会失败。规则序号从1开始。-Z -zero//把所有链的包及字节的计数器清空。它可以和 -L配合使用,在清空前察看计数器,请参见前文。-N -new-chain//根据给出的名称建立一个新的用户定义链。这必须保证没有同名的链存在。-X -delete-chain//删除指定的用户自定义链。这个链必须没有被引用,如果被引用,在删除之前你必须删除或者替换与之有关的规则。如果没有给出参数,这条命令将试着删除每个非内建的链。-E -rename-chain//根据用户给出的名字对指定链进行重命名,这仅仅是修饰,对整个表的结构没有影响。TARGETS参数给出一个合法的目标。只有非用户自定义链可以使用规则,而且内建链和用户自定义链都不能是规则的目标。-j 目标跳转//指定规则的目标;也就是说,如果包匹配应当做什么。目标可以是用户自定义链(不是这条规则所在的),某个会立即决定包的命运的专用内建目标,或者一个扩展(参见下面的EXTENSIONS)。如果规则的这个选项被忽略,那么匹配的过程不会对包产生影响,不过规则的计数器会增加。-v --详细//详细输出。这个选项让list命令显示接口地址、规则选项(如果有)和TOS(Type of Service)掩码。包和字节计数器也将被显示,分别用K、M、G(前缀)表示1000、1,000,000和1,000,000,000倍(不过请参看-x标志改变它),对于添加,插入,删除和替换命令,这会使一个或多个规则的相关详细信息被打印。--dport num     ##匹配目标端口号--sport num     ##匹配来源端口号

iptables策略的具体配置

环境的搭建:

yum install iptables-services.x86_64 -y   //下载火墙服务 systemctl stop firewalld systemctl status firewalld systemctl disable firewalld systemctl mask firewalld    //冻结' systemctl start iptables.service  systemctl enable iptables.service  systemctl status iptables.service 
  • iptables -nL 查看策略,-n是不解析

  • -F清除,注意清除后一定要保存,不然没用

iptables 策略即改即生效

修改iptable -P 默认规则,后面只有ACCEPT , DROP(丢弃,就会形成访问方一直访问,不会拒绝,但是一直丢弃)

  • iptables -nL 是从上到下短路规则查看权限 ,匹配了就直接通过,后面就不看了

    iptables -A INPUT -j REJECT 添加到最后一条并设为拒绝


//-A 插到最后, -I 插到第一条 -I INPUT n 插到第n条 ,-j REJECT 拒绝 ACCEPT 允许

指定规则的目标;也就是说,如果包匹配应当做什么。

iptables -I INPUT 2 -s 172.25.254.9 -p tcp --dport 22 -j ACCEPTiptables -I INPUT 3 -p tcp --dport 80 -j ACCEPT

指定源地址,可以是主机名、网络名和清楚的IP地址。
-i 中的 lo 是指定接口为内部回环接口

这是包经由该接口接收的可选的入口名称,包通过该接口接收(在链INPUT、FORWORD和PREROUTING中进入的包)。

-p 指定协议为 tcp –dport允许的端口 80(apache) 22(sshd服务的端口)… 规则或者包检查(待检查包)的协议。

数据传输看的时候,先找规则,没有匹配的就走默认(policy ACCEPT | DROP)

[root@iscsi-server ~]# iptables -D INPUT -p tcp --dport 80 -j ACCEPT//删除可以指定匹配的内容[root@iscsi-server ~]# iptables -R INPUT 1 -s 172.25.254.9 -p tcp --dprot 80 -j REJECT//-R 更改[root@iscsi-server ~]# iptables -N WESTOS//-N 创建新的表

[root@iscsi-server ~]# iptables -E WESTOS redhat//-E 重命名新的表

[root@iscsi-server ~]# iptables -X redhat//-X 删除指定的表

/etc/services里面有每个端口的信息

iptables 添加端口:


//更改完保存 service iptables save

*特殊的ftp

21端口用于连接,20端口用于传输数据

 进行FTP文件传输中,客户端首先连接到FTP服务器的21端口,进行用户的认证,认证成功后,要传输文件时,服务器会开启一个新的端口为20来进行传输数据文件。

FTP中,PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了XXXX端口,你过来连接我”。于是服务器从20端口向客户端的XXXX端口发送连接请求,建立一条数据链路来传送数据。 PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求,建立一条数据链路来传送数据。

按照上述的火墙策略:最后一条命令会让ftp用户连接失败,原因就是ftp的被动连接,会有第三个端口的出现,而iptables中的火墙策略只有ftp的两个端口被允许,并且拒绝了其他所有的端口,而默认端口是大于1024的,所以,我们需要编写配置文件让其被动访问的端口具体化,从而实现端口确定达到可以编辑火墙策略的目的。
ftp需要单独设置

iptables 因为ftp的主动被动模式 所以不稳定//ftp端口默认大于1024pasv_max_port=7000pasv_min_port=7000//两个最大最小设置成一样的就稳定了,这时候就可以访问"通过配置帮助可以查看两个参数的具体配置信息:pasv_max_port:              The maximum port to allocate for PASV style data  connections.  Can  be  used  to specify a narrow port range to assist firewalling.        Default: 0 (use any port)pasv_min_port:              The  minimum  port  to  allocate  for PASV style data connections. Can be used to specify a narrow port range to assist firewalling.        Default: 0 (use any port)

"注意 : selinux要关闭""hosts.deny|allow   也要配置为允许" 

实现伪装策略:

server端:

server端设置为双网卡,一个外网172.25.254.109,一个私有网段172.25.9.109client设置172.25.9.209 ,网关为 172.25.9.109刷掉原来的策略[root@iscsi-server ~]# iptables -Fservice iptables save[root@iscsi-server ~]# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.109

  • 查看内核路由功能 sysctl -a | grep forward

编辑内核路由功能的配置文件vim /etc/sysctl.conf 

sysctl -p //刷新内核功能 

  • 这样,只有内网ip的client就可以访问外网172.25.254.9

  • 而且,此时查看时,内网连接外网时,外网显示的时server端的ip,这就是地址伪装
  • 外网如果ssh server端,那么连接的其实是内网client端

在红帽企业版七出现之后,出现了一款新的火墙策略配置方式 firewalld ,个人认为是相对比iptables容易上手一些的,下一章将详细讲解