运维基础-防火墙和iptables
1、防火墙
- 防火墙(Firewall)技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。
- 防火墙技术的功能主要在于及时发现并处理计算机网络运行时可能存在的安全风险、数据传输等问题,其中处理措施包括隔离与保护,同时可对计算机网络安全当中的各项操作实施记录与检测,以确保计算机网络运行的安全性,保障用户资料与信息的完整性,为用户提供更好、更安全的计算机网络使用体验。
- 从逻辑上,防火墙可以大体分为主机防火墙和网络防火墙。
- 主机防火墙:针对于单个主机进行防护。
- 网络防火墙:往往处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网。
- 网络防火墙和主机防火墙并不冲突,可以理解为,网络防火墙主外(集体) ,主机防火墙主内(个人)
- 从物理上,防火墙可以分为硬件防火墙和软件防火墙。
- 硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。
- 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低。
1.1、防火墙功能
- 防火墙对流经它的网络通信进行扫描,这样能够过滤掉一些攻击,以免其在目标计算机上被执行。防火墙还可以关闭不使用的端口。而且它还能禁止特定端口的流出通信,封锁特洛伊木马。最后,它可以禁止来自特殊站点的访问,从而防止来自不明入侵者的所有通信。
1、网络安全的屏障
- 一个防火墙(作为阻塞点、控制点)能极大地提高一个内部网络的安全性,并通过过滤不安全的服务而降低风险。
- 由于只有经过精心选择的应用协议才能通过防火墙,所以网络环境变得更安全。如防火墙可以禁止诸如众所周知的不安全的NFS协议进出受保护网络,这样外部的攻击者就不可能利用这些脆弱的协议来攻击内部网络。
- 防火墙同时可以保护网络免受基于路由的攻击,如IP选项中的源路由攻击和ICMP重定向中的重定向路径。
- 防火墙应该可以拒绝所有以上类型攻击的报文并通知防火墙管理员。
2、强化网络安全策略
- 通过以防火墙为中心的安全方案配置,能将所有安全软件(如口令、加密、身份认证、审计等)配置在防火墙上。与将网络安全问题分散到各个主机上相比,防火墙的集中安全管理更经济。例如在网络访问时,一次一密口令系统和其它的身份认证系统完全可以不必分散在各个主机上,而集中在防火墙一身上。
3、监控审计
- 如果所有的访问都经过防火墙,那么,防火墙就能记录下这些访问并作出日志记录,同时也能提供网络使用情况的统计数据。
- 当发生可疑动作时,防火墙能进行适当的报警,并提供网络是否受到监测和攻击的详细信息。
- 另外,收集一个网络的使用和误用情况也是非常重要的。首先的理由是可以清楚防火墙是否能够抵挡攻击者的探测和攻击,并且清楚防火墙的控制是否充足。而网络使用统计对网络需求分析和威胁分析等而言也是非常重要的。
4、防止内部信息的外泄
- 通过利用防火墙对内部网络的划分,可实现内部网重点网段的隔离,从而限制了局部重点或敏感网络安全问题对全局网络造成的影响。再者,隐私是内部网络非常关心的问题,一个内部网络中不引人注意的细节可能包含了有关安全的线索而引起外部攻击者的兴趣,甚至因此而暴漏了内部网络的某些安全漏洞。使用防火墙就可以隐蔽那些透漏内部细节如Finger,DNS等服务。Finger显示了主机的所有用户的注册名、真名,最后登录时间和使用shell类型等。但是Finger显示的信息非常容易被攻击者所获悉。攻击者可以知道一个系统使用的频繁程度,这个系统是否有用户正在连线上网,这个系统是否在被攻击时引起注意等等。防火墙可以同样阻塞有关内部网络中的DNS信息,这样一台主机的域名和IP地址就不会被外界所了解。除了安全作用,防火墙还支持具有Internet服务性的企业内部网络技术体系VPN(虚拟专用网)。
5、日志记录与事件通知
- 进出网络的数据都必须经过防火墙,防火墙通过日志对其进行记录,能提供网络使用的详细统计信息。当发生可疑事件时,防火墙更能根据机制进行报警和通知,提供网络是否受到威胁的信息。
1.2、防火墙主要类型
1、过滤型防火墙
- 过滤型防火墙是在网络层与传输层中,可以基于数据源头的地址以及协议类型等标志特征进行分析,确定是否可以通过。在符合防火墙规定标准之下,满足安全性能以及类型才可以进行信息的传递,而一些不安全的因素则会被防火墙过滤、阻挡。
2、应用代理类型防火墙
- 应用代理防火墙主要的工作范围就是在OSI的最高层,位于应用层之上。其主要的特征是可以完全隔离网络通信流,通过特定的代理程序就可以实现对应用层的监督与控制。
3、复合型
- 截至2018年应用较为广泛的防火墙技术当属复合型防火墙技术,综合了包过滤防火墙技术以及应用代理防火墙技术的优点,譬如发过来的安全策略是包过滤策略,那么可以针对报文的报头部分进行访问控制;如果安全策略是代理策略,就可以针对报文的内容数据进行访问控制,因此复合型防火墙技术综合了其组成部分的优点,同时摒弃了两种防火墙的原有缺点,大大提高了防火墙技术在应用实践中的灵活性和安全性。
1.3、防火墙的部署方式
- 防火墙是为加强网络安全防护能力在网络中部署的硬件设备,有多种部署方式,常见的有桥模式、网关模式和NAT模式等。
1、桥模式
- 桥模式也可叫作透明模式。最简单的网络由客户端和服务器组成,客户端和服务器处于同一网段。为了安全方面的考虑,在客户端和服务器之间增加了防火墙设备,对经过的流量进行安全控制。正常的客户端请求通过防火墙送达服务器,服务器将响应返回给客户端,用户不会感觉到中间设备的存在。工作在桥模式下的防火墙没有IP地址,当对网络进行扩容时无需对网络地址进行重新规划,但牺牲了路由、VPN等功能。
2、网关模式
- 网关模式适用于内外网不在同一网段的情况,防火墙设置网关地址实现路由器的功能,为不同网段进行路由转发。网关模式相比桥模式具备更高的安全性,在进行访问控制的同时实现了安全隔离,具备了一定的私密性。
3、NAT模式
- NAT(Network Address Translation)地址翻译技术由防火墙对内部网络的IP地址进行地址翻译,使用防火墙的IP地址替换内部网络的源地址向外部网络发送数据;当外部网络的响应数据流量返回到防火墙后,防火墙再将目标地址替换为内部网络的源地址。NAT模式能够实现外部网络不能直接看到内部网络的IP地址,进一步增强了对内部网络的安全防护。同时,在NAT模式的网络中,内部网络可以使用私网地址,可以解决IP地址数量受限的问题。
- 如果在NAT模式的基础上需要实现外部网络访问内部网络服务的需求时,还可以使用地址/端口映射(MAP)技术,在防火墙上进行地址/端口映射配置,当外部网络用户需要访问内部服务时,防火墙将请求映射到内部服务器上;当内部服务器返回相应数据时,防火墙再将数据转发给外部网络。使用地址/端口映射技术实现了外部用户能够访问内部服务,但是外部用户无法看到内部服务器的真实地址,只能看到防火墙的地址,增强了内部服务器的安全性。
4、高可靠性设计
- 防火墙都部署在网络的出入口,是网络通信的大门,这就要求防火墙的部署必须具备高可靠性。一般IT设备的使用寿命被设计为3至5年,当单点设备发生故障时,要通过冗余技术实现可靠性,可以通过如虚拟路由冗余协议(VRRP)等技术实现主备冗余。到2019年为止,主流的网络设备都支持高可靠性设计。
2、iptables和Netfilter
- Linux网络协议栈非常高效,同时比较复杂。如果我们希望在数据的处理过程中对关心的数据进行一些操作,则该怎么做呢?Linux提供了一套机制来为用户实现自定义的数据包处理过程。
- 在Linux网络协议栈中有一组回调函数挂接点,通过这些挂接点挂接的钩子函数可以在Linux网络栈处理数据包的过程中对数据包进行一些操作,例如过滤、修改、丢弃等。整个挂接点技术叫作Netfilter和iptables。
2.1、iptables和Netfilter的关系
- iptables和Netfilter配合实现整个Linux网络协议栈中灵活的数据包处理机制。
- Netfilter负责在内核中执行各种挂接的规则;是Linux操作系统内核中的数据包处理模块。
- iptables是在用户模式下运行的进程,负责协助和维护内核中Netfilter的各种规则表。(iptables是命令行工具)
- Netfilter有5个可以挂接规则的挂载点(即钩子函数),如图7.4中的粉色图形所示。
2.2、iptables操作的4表5链
- 表:是Netfilter内置的4个表,不同的钩子上可以应用的表不同。
- 链:内置链和自定义链。
2.2.1、规则表(Table)
- 规则表有4种:RAW、MANGLE、NAT和FILTER(RAW的优先级最高,FILTER最低)。
- raw表:关闭nat表上启用的连接追踪机制。使用的内核模块是iptable_raw。
- mangle表:拆解报文,做出修改,并重新封装的功能(用于修改TCP协议中的除IP之外的其他信息)。使用的内核模块是 iptable_mangle。
- nat表:network address translation,网络地址转换功能,用于修改源IP或目标IP,也可以修改端口。使用的内核模块是iptable_nat。
- filter表:负责过滤,实现了防火墙的功能。使用的内核模块是iptables_filter。
2.2.2、链(chain)
- 内置链:Netfilter的钩子在iptables命令中被称为规则链(即内置链与Netfilter的钩子一一对应,不过字母全部要大写),不同的链(钩子)上可以应用的表不同。
- PREROUTING
- INPUT
- FORWARD
- OUTPUT
- POSTROUTING
- 自定义链:用于内置链的扩展和补充,可实现更灵活的规则管理机制。
2.2.3、表与链的关系
- 在实际应用中,不同的内置链(挂接点)需要的表(规则类型)通常不同(图7.4中每个链(挂载点)旁边的方框中就是其可以使用表(规则类型)。
- 当Linux协议栈的数据处理运行到内置链(挂接点)时,它会依次调用挂接点上所有的挂钩函数,直到数据包的处理结果是明确地接受或者拒绝。
2.3、iptables的处理规则
- 每个规则的特性都分为以下几部分:
- 哪个表(准备干什么事情)。
- 哪个挂接点(什么时候起作用)。
- 匹配的参数是什么,即匹配条件(针对什么样的数据包)。
- 匹配后有什么动作(匹配后具体的操作是什么)。
- 处理规则是高度模块化,由诸多扩展模块实现其检查条件或处理动作的定义。
1 2 3 4 | //大写是处理动作扩展,小写是匹配条件扩展 ]# ls -l /usr/lib64/xtables/ //IPV6:libip6t_* //IPV4:libipt_*,libxt_* |
2.3.1、匹配条件
- 根据匹配条件来尝试匹配报文,一旦匹配成功(只要匹配成功,就不会在继续匹配其他的规则),就由规则定义的处理动作作出处理。
- 匹配条件有2种:
- 基本匹配条件(内建)
- 扩展匹配条件(扩展模块)
- 常见的匹配参数如下:
- 流入、流出的网络接口(网卡名)。
- 来源、目标地址。
- 协议类型。
- 来源、目标端口。
2.3.2、匹配后的处理动作
- 一旦有数据匹配,就会执行相应的动作。动作类型既可以是标准的预定义的几个动作,也可以是自定义的模块注册的动作,或者是一个新的规则链,以便更好地组织一组动作。
- 处理动作有3种:
- 基本处理动作(内建)
- 内建扩展处理动作(扩展模块)
- 自定义处理机制(自定义链)
3、iptables命令
- iptables使用手册:
1 2 | ]# man iptable ]# man iptables-extensions |
- iptables命令的基本使用格式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | iptables [-t table] COMMAND [chain [rulenum]] [match-options...] -j target table:规则表,可用值有raw、mangle、nat、filter,默认值是filter。 chain:链,可用值有PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。 rulenum:规则序号。 target:处理动作,可用值有ACCEPT(接受)、DROP(丢弃)、REJECT(拒绝) match-options: [!] -p,--protocol protocol 协议名 [!] -s,--source address[/mask][...] 源地址或源网络 [!] -d,--destination address[/mask][...] 目标地址或目标网络 [!] -i,--in- interface input_interface 网络接口名称([+]表示通配符) [!] -o,--out- interface out_interface 网络接口名称([+]表示通配符) -m,--match match 加载扩展模块 -t,--table table 规则表(默认值: 'filter' ) -j,--jump target 处理动作(可以加载目标扩展) COMMAND:命令,例如-A等。 -L列出指定链上的所有规则 -P设置链的默认处理动作 -N创建一个新的自定义链 -X删除自定义链 -E重命名自定义链 -I插入规则 -A追加规则 -R替换规则 -D删除规则 -Z计数置零 -F清空规则 |
3.1、iptables命令--基本使用
- 添加规则时的考量点:
- (1)要实现哪种功能:判断添加到哪个表上。
- (2)报文流经的路径:判断添加到哪个链上。
- 链上的规则次序,即为检查的次序。因此,隐含一定的应用法则:
- (1)同类规则(访问同一应用) ,匹配范围小的放上面。
- (2)不同类的规则(访问不同应用) ,匹配到报文频率较大的放在上面。
- (3)将那些可由一条规则描述的多个规则合并起来。
- (4)设置默认策略。
- 注意,所有的示例都是在关闭防火墙和清除规则之后进行的。
1 2 | ]# systemctl stop firewalld.service ]# iptables -F |
3.1.1、查看
- 列出指定链上的所有规则。
1 2 3 4 5 | iptables [-t table] -L [chain [rulenum]] [options...] -n,--numeric:以数字格式显示地址和端口号 -v,--verbose:详细信息(-vv更详细的信息) -x,--exact:显示精确值(计数器结果) --line-numbers:显示规则的序号 |
3.1.2、链管理
1、设置链的默认处理动作
1 | iptables [-t table] -P chain target |
2、创建一个新的自定义链
1 2 3 4 | iptables [-t table] -N chain 创建自定义链:iptables -t filter -N IN_WEB 引用自定义链:iptables -I INPUT –p tcp --sprot 80 -j IN_WEB 添加规则:和内置链一样 |
3、删除自定义链
1 2 | iptables [-t table] -X [chain] 注意:仅能删除 引用计数为0的 空的 自定义的链 |
4、重命名自定义链
1 2 | iptables -E old-chain-name new -chain-name 注意,引用计数不为0的自定义链不能被重命名 |
示例1:
1 2 3 4 5 | //设置链的默认策略 ]# iptables -P FORWARD DROP ]# iptables -t filter -nL FORWARD Chain FORWARD (policy DROP) ...... |
示例2:
- 操作自定义链。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | //创建自定义链 ]# iptables -t filter -N IN_WEB //引用自定义链 ]# iptables -I INPUT -p tcp -j IN_WEB //添加规则到自定义链 ]# iptables -I IN_WEB -s 10.1.2.0/24 -p tcp --sport 80 -j DROP //查看(结果只是一部分) ]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination IN_WEB tcp -- 0.0.0.0/0 0.0.0.0/0 ...... Chain IN_WEB (1 references) target prot opt source destination DROP tcp -- 10.1.2.0/24 0.0.0.0/0 tcp spt:80 //删除引用IN_WEB链的规则 ]# iptables -D INPUT 1 //清空IN_WEB链中的规则 ]# iptables -X IN_WEB //删除IN_WEB链 ]# iptables -X IN_WEB |
3.1.3、规则管理
1、插入规则
- 将规则插入到指定的位置,默认将规则插入为第一条。
1 | iptables [-t table] -I chain [rulenum] [match-options...] -j target |
2、追加规则
- 将规则追加到链的最后。
1 | iptables [-t table] -A chain [match-options...] -j target |
3、替换规则
- 替换链上的规则。
1 | iptables [-t table] -R chain rulenum [match-options...] -j target |
4、删除规则
1 2 3 4 | //指明规则序号 iptables [-t table] -D chain rulenum //指明规则本身 iptables [-t table] -D chain [match-options...] -j target |
5、计数置零
- iptables的每条规则都有两个计数器:
- 匹配到的报文的个数。
- 匹配到的所有报文的大小之和。
1 | iptables [-t table] -Z [chain [rulenum]] |
6、清空规则
1 | iptables [-t table] -F [chain [rulenum]] |
示例1:
- 使用默认处理动作是drop,并设置白名单。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | ]# iptables -F //只允许10.1.1.0/24网络的tcp协议的报文通过(白名单) ]# iptables -A INPUT -s 10.1.1.0/24 -d 10.1.1.11 -p tcp -j ACCEPT ]# iptables -A OUTPUT -s 10.1.1.11 -d 10.1.1.0/24 -p tcp -j ACCEPT //修改链的默认处理动作为DROP ]# iptables -P INPUT DROP ]# iptables -P OUTPUT DROP //查看(结果只是一部分) ]# iptables -nL Chain INPUT (policy DROP) target prot opt source destination ACCEPT tcp -- 10.1.1.0/24 10.1.1.11 Chain OUTPUT (policy DROP) target prot opt source destination ACCEPT tcp -- 10.1.1.11 10.1.1.0/24 |
示例2:
- 使用默认处理动作是accept,并设置白名单。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | //修改INPUT和OUTPUT链上的第一条规则。只允许10.1.1.0/24网络的tcp协议并且访问本机22端口的报文通过 ]# iptables -R INPUT 1 -s 10.1.1.0/24 -d 10.1.1.11 -p tcp --dport 22 -j ACCEPT ]# iptables -R OUTPUT 1 -s 10.1.1.11 -d 10.1.1.0/24 -p tcp --sport 22 -j ACCEPT //修改链的默认处理动作为ACCEPT ]# iptables -P INPUT ACCEPT ]# iptables -P OUTPUT ACCEPT //拒绝所有访问该主机的报文通过(ping 127.0.0.1是通的) ]# iptables -A INPUT -d 10.1.1.11 -j REJECT ]# iptables -A OUTPUT -s 10.1.1.11 -j REJECT //查看(结果只是一部分) ]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 10.1.1.0/24 10.1.1.11 tcp dpt:22 REJECT all -- 0.0.0.0/0 10.1.1.11 reject-with icmp-port-unreachable Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 10.1.1.11 10.1.1.0/24 tcp spt:22 REJECT all -- 10.1.1.11 0.0.0.0/0 reject-with icmp-port-unreachable |
3.2、iptables命令--基本匹配条件
- 当一条规则中有多个匹配条件时,多个匹配条件之间的关系默认是"与"。
- 即当一条规则中存在多个匹配条件时,报文必须同时满足这些条件,才算被该规则匹配。
- 使用基本匹配条件的时候,无需加截任何模块,由iptables/netfilter自行提供。
1、匹配IP地址
- [!] -s,--source address[/mask][...] 检查报文中的源IP地址是否符合此处指定的地址或范围
- [!] -d,--destination address[/mask][...] 检查报文中的目标IP地址是否符合此处指定的地址或范围
- 可以是单个或多个ip。
- 可以是一个网段。
- 也可以是前两者的混合,用逗号隔开(逗号前后无空格)。
2、匹配协议
- [!] -p,--protocol protocol 检查报文中的协议是否符合此处的指定。
- centos6中,-p选项支持如下协议类型
- tcp,udp,udplite,icmp,esp,ah,sctp
- centos7中,-p选项支持如下协议类型
- tcp,udp,udplite,icmp,esp,ah,sctp,mh,icmpv6
- centos6中,-p选项支持如下协议类型
3、匹配网卡接口
- [!] -i,--in-interface input_interface 数据报文流入的接口
- 只能应用于数据报文流入的环节,只能应用于PREROUTING、INPUT和FORWARD链
- [!] -o,--out-interface out_interface 数据报文流出的接口
- 只能应用于数据报文流出的环节,只能应用于FORWARD、OUTPUT和POSTROUTING链
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | ]# iptables -F //只允许10.1.1.0/24网络的tcp协议并且访问本机22端口的报文通过 ]# iptables -I INPUT -s 10.1.1.0/24 -d 10.1.1.11 -p tcp --dport 22 -j ACCEPT ]# iptables -I OUTPUT -s 10.1.1.11 -d 10.1.1.0/24 -p tcp --sport 22 -j ACCEPT //拒绝所有使用ens33接口的报文通过(ping 127.0.0.1是通的) ]# iptables -A INPUT -i ens33 -j REJECT ]# iptables -A OUTPUT -o ens33 -j REJECT //查看(结果只是一部分) ]# iptables -nvL Chain INPUT (policy ACCEPT 4 packets, 416 bytes) pkts bytes target prot opt in out source destination 101 6380 ACCEPT tcp -- * * 10.1.1.0/24 10.1.1.11 tcp dpt:22 3 228 REJECT all -- ens33 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable Chain OUTPUT (policy ACCEPT 4 packets, 416 bytes) pkts bytes target prot opt in out source destination 59 7052 ACCEPT tcp -- * * 10.1.1.11 10.1.1.0/24 tcp spt:22 4 304 REJECT all -- * ens33 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable |
3.3、iptables命令--扩展匹配条件
- 当一条规则中有多个匹配条件时,多个匹配条件之间的关系默认是"与"。
- 即当一条规则中存在多个匹配条件时,报文必须同时满足这些条件,才算被该规则匹配。
- 隐式扩展:在使用-p选项指明协议时,无需再使用-m选项指明扩展模块。
- 显式扩展:必须使用-m选项指明要调用的扩展模块。
3.3.1、隐式扩展
1、tcp
- 如果指定了"--protocol tcp",则可以使用下面的选项(由扩展提供):
- [!] --source-port,--sport port[:port] 匹配报文的源端口。可以是单个端口,也可以是端口范围。
- [!] --destination-port,--dport port[:port] 匹配报文的目标端口。可以是单个端口,也可以是端口范围。
- [!] --tcp-flags mask comp
- mask的值是[SYN,ACK,FIN,RST,URG,PSH,ALL,NONE]的子集。
- comp的值是mask的子集。
- 例如:"--tcp-flags SYN,ACK,FIN,RST SYN"表示,要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0。
- [!]--syn:用于匹配第一次握手,相当于"--tcp-flags SYN,ACK,FIN,RST SYN"
2、udp
- 如果指定了"--protocol udp",则可以使用下面的选项(由扩展提供):
- [!] --source-port,--sport port[:port]匹配报文的源端口。可以是单个端口,也可以是端口范围。
- [!] --destination-port,--dport port[:port]匹配报文的目标端口。可以是单个端口,也可以是端口范围。
3、icmp
- 如果指定了"--protocol icmp",则可以使用下面的选项(由扩展提供):
- [!] --icmp-type {type[/code]|typename}
- echo-request: 8 ping请求报文的编码是8/0
- echo-reply: 0 ping应答报文的编码是0/0
- [!] --icmp-type {type[/code]|typename}
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | ]# iptables -F //只允许10.1.1.0/24网络的tcp协议并且访问本机22端口的报文通过 ]# iptables -I INPUT -s 10.1.1.0/24 -d 10.1.1.11 -p tcp --dport 22 -j ACCEPT ]# iptables -I OUTPUT -s 10.1.1.11 -d 10.1.1.0/24 -p tcp --sport 22 -j ACCEPT //拒绝所有使用ens33接口的报文通过(ping 127.0.0.1是通的) ]# iptables -A INPUT -i ens33 -j REJECT ]# iptables -A OUTPUT -o ens33 -j REJECT //允许本机ping,不允许本机被ping ]# iptables -I OUTPUT 2 -s 10.1.1.11 -d 10.1.1.0/24 -p icmp --icmp-type 8 -j ACCEPT ]# iptables -I INPUT 2 -s 10.1.1.0/24 -d 10.1.1.11 -p icmp --icmp-type 0 -j ACCEPT //查看(结果只是一部分) ]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 10.1.1.0/24 10.1.1.11 tcp dpt:22 ACCEPT icmp -- 10.1.1.0/24 10.1.1.11 icmptype 0 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 ACCEPT tcp -- 10.1.1.11 10.1.1.0/24 tcp spt:22 ACCEPT icmp -- 10.1.1.11 10.1.1.0/24 icmptype 8 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable |
3.3.2、显式扩展
1、multiport
- 以离散或连续的方式定义多端口匹配条件,最多15个。例如,"53,1024:65535"将匹配端口53以及从1024到65535的所有端口。
- [!] --source-ports,--sports port[,port|,port:port]... 如果源端口是给的定端口之一,则匹配。
- [!] --destination-ports,--dports port[,port|,port:port]... 如果目标端口是给的定端口之一,则匹配。
- [!] --ports port[,port|,port:port]... 如果源端口或目标端口是给定端口中的一个,则匹配。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 | ]# iptables -F ]# iptables -I INPUT -s 10.1.1.0/24 -d 10.1.1.11 -p tcp -m multiport --dport 22,80,1024:1100 -j ACCEPT ]# iptables -I OUTPUT -s 10.1.1.11 -d 10.1.1.0/24 -p tcp -m multiport --dport 22,80,1024:1100 -j ACCEPT //查询 ]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 10.1.1.0/24 10.1.1.11 multiport dports 22,80,1024:1100 Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 10.1.1.11 10.1.1.0/24 multiport dports 22,80,1024:1100 |
2、iprange
- 以连续IP块的方式来指定多个连续IP地址。
- [!] --src-range from[-to]
- [!] --dst-range from[-to]
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 | ]# iptables -F ]# iptables -I INPUT -m iprange --src-range 10.1.1.12-10.1.1.14 -d 10.1.1.11 -p tcp -m multiport --dport 22,80,1024:1100 -j ACCEPT ]# iptables -I OUTPUT -s 10.1.1.11 -m iprange --dst-range 10.1.1.12-10.1.1.14 -p tcp -m multiport --dport 22,80,1024:1100 -j ACCEPT //查询 ]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 10.1.1.11 source IP range 10.1.1.12-10.1.1.14 multiport dports 22,80,1024:1100 Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 10.1.1.11 0.0.0.0/0 destination IP range 10.1.1.12-10.1.1.14 multiport dports 22,80,1024:1100 |
3、time
- 如果报文到达的时间/日期在给定的范围内,则匹配。默认情况下,所有时间都被解释为UTC。
- --timestart hh:mm[:ss] 取值范围00:00:00-23:59:59
- --timestop hh:mm[:ss]
- [!] --monthdays day[,day...] 取值范围1-7
- [!] --weekdays day[,day...] 取值范围1-31
- --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
- --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
- --kerneltz 使用内核时区代替UTC来判断报文是否符合时间规则。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 | ]# iptables -F ]# iptables -I INPUT -s 10.1.1.0/24 -d 10.1.1.11 -p tcp -m multiport --dport 22,80,1024:1100 -m time --timestart 09:00:00 --timestop 18:00:00 --kerneltz -j ACCEPT ]# iptables -I OUTPUT -s 10.1.1.11 -d 10.1.1.0/24 -p tcp -m multiport --dport 22,80,1024:1100 -m time --timestart 09:00:00 --timestop 18:00:00 --kerneltz -j ACCEPT //查看(结果只是一部分) ]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 10.1.1.0/24 10.1.1.11 multiport dports 22,80,1024:1100 TIME from 09:00:00 to 18:00:00 Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 10.1.1.11 10.1.1.0/24 multiport dports 22,80,1024:1100 TIME from 09:00:00 to 18:00:00 |
4、string
- 过滤报文中的字符串,没有解析成明文,而是过滤流字节。例如,假设'hello'被编码成'001001001',如果报文中出现'001001001'就会说该报文中有'hello'。
- --algo {bm|kmp}选择模式匹配策略
- --from offset设置开始的偏移量。默认值为0。
- --to offset设置结束的偏移量。默认为数据包的结尾。
- [!] --string pattern指定需要匹配的字符串
- [!] --hex-string pattern指定需要匹配的十六进制字符串
示例:
1 2 3 4 5 6 7 8 | ]# iptables -F ]# iptables -I OUTPUT -m string --algo bm --string "hello" -j REJECT //查看(结果只是一部分) ]# iptables -nL Chain OUTPUT (policy ACCEPT) target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 STRING match "hello" ALGO name bm TO 65535 reject-with icmp-port-unreachable |
5、connlimit
- 限制每个客户端IP地址(或客户端地址块)到一个服务器的并行连接数。
- --connlimit-upto n 如果现有连接数小于或等于n,则匹配。
- --connlimit-above n 如果现有连接数大于n则匹配。
- --connlimit-mask 限制"某网段"的链接数。对于IPv4,必须为0-32之间的数字。对于IPv6,取值范围为0-128。如果不指定,则使用适用协议的最大前缀长度。
示例:
- 每个客户端主机允许2个ssh连接该机器
1 2 3 4 | //大于2个,就匹配并拒绝 iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 -j REJECT //小于等于2个,就匹配并允许 iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-upto 2 -j ACCEPT |
6、limit
- 使用此扩展的规则将匹配,直到达到此限制。例如,它可以与LOG目标结合使用,以提供有限的日志记录。
- --limit rate[/second|/minute|/hour|/day] 最大平均匹配率:指定为一个数字,默认为3/hour。
- --limit-burst number 限制令牌桶中令牌的数量
- 限制本机某tcp服务接收新请求的速率:--syn -m limit。
7、state
- "state"扩展是"conntrack"模块的一个子集。
- 非常繁忙的机器不建议开启"状态追踪"机制,因为内核内存的大小有限,一旦被塞满,新来的的连接将会因为连接超时被拒绝。
- 将最大记录数调大,即将/proc/sys/net/netfilter/nf_conntrack_max中的数值调大(注意内存是否够用)。
- 或者将记录的保存时间调小,即将/proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established中的数值调小(不建议使用)。
- state可以让iptables实现“连接追踪”机制。
- [!] --state state 要匹配的连接的状态,使用逗号分隔。可用值有INVALID、ESTABLISHED、NEW、RELATED或UNTRACKED。
- 五种状态的释义:
- NEW 新连接请求
- ESTABLISHED 已建立的连接
- INVALID 无法识别的连接
- RELATED 相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接(例如,ftp服务可能会有该状态)
- UNTRACKED 未追踪的连接
- 加载必要的模块
1 2 3 4 5 6 | //查看模块 ]# lsmod | grep conntrack //要实现“连接追踪”机制,必须加载nf-conntrack模块 ]# modprobe nf-conntrack //要实现“连接追踪”机制中追踪"RELATED"状态,必须加载nf_conntrack_ftp模块 ]# modprobe nf_conntrack_ftp |
- nf_conntrack模块常用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | //查看nf_conntrack表当前已经记录的连接(即已经记录到内存中) cat /proc/net/nf_conntrack //查看nf_conntrack表当前已经记录的连接数 cat /proc/sys/net/netfilter/nf_conntrack_count //通过dmesg可以查看nf_conntrack的状况: dmesg |grep nf_conntrack //通过conntrack命令行工具查看conntrack的内容 yum install -y conntrack conntrack -L //通过内核参数查看命令,查看所有参数配置 sysctl -a | grep nf_conntrack //查看nf_conntrack表最大记录的连接数 cat /proc/sys/net/netfilter/nf_conntrack_max //查看存储conntrack条目的哈希表大小,此为只读文件 cat /proc/sys/net/netfilter/nf_conntrack_buckets //查看nf_conntrack的TCP连接的记录可以保存的时间 cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established |
示例:
- 使用“状态追踪”设置处理规则。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | //允许tcp协议、目标端口是22:23,80,3306、状态是NEW或ESTABLISHED的报文通过(进入) ]# iptables -I INPUT -d 10.1.1.11 -p tcp -m multiport --dports 22:23,80,3306 -m state --state NEW -j ACCEPT ]# iptables -I INPUT -d 10.1.1.11 -m state --state ESTABLISHED -j ACCEPT //允许状态是ESTABLISHED的报文通过(出去) ]# iptables -I OUTPUT -s 10.1.1.11 -m state --state ESTABLISHED -j ACCEPT //拒绝所有报文通过10.1.1.11 ]# iptables -A INPUT -d 10.1.1.11 -j REJECT ]# iptables -A OUTPUT -s 10.1.1.11 -j REJECT //查看(结果只是一部分) ]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 10.1.1.11 state ESTABLISHED ACCEPT tcp -- 0.0.0.0/0 10.1.1.11 multiport dports 22:23,80,3306 state NEW REJECT all -- 0.0.0.0/0 10.1.1.11 reject-with icmp-port-unreachable Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 10.1.1.11 0.0.0.0/0 state ESTABLISHED REJECT all -- 10.1.1.11 0.0.0.0/0 reject-with icmp-port-unreachable |
3.4、iptables命令--处理动作(跳转目标)
3.4.1、基本处理动作
- 基本处理动作有两种:
- ACCEPT
- DROR
3.4.2、扩展处理动作
- 扩展处理动作有很多,这里只介绍2种。
1、REJECT
- 用一个标明错误的数据包响应它匹配到的数据包,否则它等同于DROP。
- --reject-with type
- 可以指定的类型有icmp-net-unreachable、icmp-host-unreachable、icmp-port-unreachable、icmp-proto-unreachable、icmp-net-prohibited、icmp-host-prohibited或者icmp-admin-prohibited 。默认值是icmp-port-unreachable。
- --reject-with type
2、LOG
- 这是一个“非终止目标”,即规则遍历继续到下一个规则。因此,如果希望对拒绝的数据包进行日志记录,请使用两个具有相同匹配条件的单独规则,先使用目标LOG,然后使用DROP(或REJECT)。
- --log-level level
- 日志记录级别。可能的值(按照优先级递减的顺序):emerg、alert、crit、error、warning、notice、info或debug。
- --log-prefix prefix
- 使用指定的前缀为日志消息添加前缀;最长29个字母,用于区分日志中的消息。
- --log-level level
- 日志默认保存于/var/log/messages。
示例:
1 2 3 4 5 6 7 8 9 10 | //大于2个,就匹配并记录log。 ]# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 -j LOG --log-prefix "ssh>2 " //大于2个,就匹配并拒绝。 ]# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 -j REJECT ]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination LOG tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 flags:0x17/0x02 #conn src/32 > 2 LOG flags 0 level 4 prefix "ssh>2" REJECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 flags:0x17/0x02 #conn src/32 > 2 reject-with icmp-port-unreachable |
3.4.3、自定义处理机制(自定义链)
- 和“操作自定义链”相同。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //创建自定义链 ]# iptables -t filter -N IN_WEB //引用自定义链(将自定义链作为处理动作) ]# iptables -I INPUT -p tcp -j IN_WEB //添加规则到自定义链 ]# iptables -I IN_WEB -s 10.1.2.0/24 -p tcp --sport 80 -j DROP //查看(结果只是一部分) ]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination IN_WEB tcp -- 0.0.0.0/0 0.0.0.0/0 ...... Chain IN_WEB (1 references) target prot opt source destination DROP tcp -- 10.1.2.0/24 0.0.0.0/0 tcp spt:80 |
3.5、iptables命令--网络防火墙
- 网络防火墙:是通过iptables命令操作FORWARD链实现的。
3.5.1、开启linux的核心转发功能
- 如果要将linux主机作为网络防火墙,就必须开启主机的核心转发功能,使其能够转发报文。
- 查看当前主机是否已经开启了核心转发,0表示为开启,1表示已开启。
1 | ]# cat /proc/sys/net/ipv4/ip_forward |
- 开启核心转发,临时有效:
1 2 3 4 | //方法一 ]# echo 1 > /proc/sys/net/ipv4/ip_forward //方法二 ]# sysctl -w net.ipv4.ip_forward=1 |
- 开启核心转发,永久生效:
1 2 3 | ]# vim /etc/sysctl.conf #centos7中配置/usr/lib/sysctl.d/00-system.conf文件 net.ipv4.ip_forward=1 ]# sysctl -p |
3.5.2、进行实验
- 在进行实验时,可以使用抓包工具(tcpdump -i -p)进行分析。
1、实验的架构
- A主机:当作外网主机
- 仅有一块网卡:VMware网卡是VMnet8,主机网卡接口和地址分别是ens33、10.1.1.11
- B主机:当作路由器
- 第一块网卡:VMware网卡是VMnet8,主机网卡接口和地址分别是ens33、10.1.1.12
- 第二块网卡:VMware网卡是VMnet1,主机网卡接口和地址分别是ens36、192.168.1.12
- C主机:当作内网主机
- 仅有一块网卡:VMware网卡是VMnet1,主机网卡接口和地址分别是ens33、192.168.1.11
- 10.1.1.11和10.1.1.12可以互ping通了,192.168.1.11和192.168.1.12也可以互ping通了。如果不通,请检测路由。
1 2 3 4 | //在A上执行 ]# ip route add 192.168.1.0/24 via 10.1.1.12 dev ens33 //在C上执行 ]# ip route add 10.1.1.0/24 via 192.168.1.12 dev ens33 |
2、开启核心转发
- 开启核心转发,永久生效
1 2 3 4 | //在B上执行 ]# vim /etc/sysctl.conf net.ipv4.ip_forward=1 ]# sysctl -p |
- 开启核心转发后,10.1.1.11和192.168.1.11可以互ping通了,这是因为所有的主机都关闭了firewalld,并且处理规则的默认处理动作是ACCEPT。
3、配置FORWARD
- 内网访问外网的WEB
- 在10.1.1.11上安装nginx
- 在192.168.1.11上执行curl 10.1.1.11:80
1 2 3 4 5 6 7 8 9 10 11 | //方法一(在B上执行) iptables -F FORWARD iptables -A FORWARD -j REJECT iptables -I FORWARD -s 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT iptables -I FORWARD -d 192.168.1.0/24 -p tcp --sport 80 -j ACCEPT //方法二(在B上执行) iptables -F FORWARD iptables -A FORWARD -j REJECT iptables -I FORWARD -m state --state ESTABLISHED -j ACCEPT iptables -I FORWARD -s 192.168.1.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT |
4、可以互ping实验
示例1:
- 在FORWARD链上不使用“状态追踪”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //清空FORWARD链(此时10.1.1.11和192.168.1.11依然可以互ping通) ]# iptables -F FORWARD //拒绝所有报文转发(此时10.1.1.11和192.168.1.11不能互ping通了) ]# iptables -A FORWARD -j REJECT //10.1.1.0/24和192.168.1.0/24两个网络可以通信(两个命令执行完后,10.1.1.11和192.168.1.11才可以互ping通) ]# iptables -I FORWARD -s 10.1.1.0/24 -d 192.168.1.0/24 -p icmp -j ACCEPT ]# iptables -I FORWARD -s 192.168.1.0/24 -d 10.1.1.0/24 -p icmp -j ACCEPT ]# iptables -nL Chain FORWARD (policy ACCEPT) target prot opt source destination ACCEPT icmp -- 192.168.1.0/24 10.1.1.0/24 ACCEPT icmp -- 10.1.1.0/24 192.168.1.0/24 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable |
示例2:
- 在FORWARD链上使用“状态追踪”
1 2 3 4 5 6 7 8 9 10 11 12 | //清空FORWARD链(此时10.1.1.11和192.168.1.11依然可以互ping通) ]# iptables -F FORWARD //拒绝所有报文转发(此时10.1.1.11和192.168.1.11不能互ping通了) ]# iptables -A FORWARD -j REJECT //允许状态是ESTABLISHED的报文通过 ]# iptables -I FORWARD -m state --state ESTABLISHED -j ACCEPT //允许状态是NEW,且从10.1.1.0/24到192.168.1.0/24的报文通过(此时10.1.1.11可以ping通192.168.1.11,反之不行) ]# iptables -I FORWARD -s 10.1.1.0/24 -d 192.168.1.0/24 -m state --state NEW -j ACCEPT //允许状态是NEW,且从192.168.1.0/24到0.1.1.0/24的报文通过 ]# iptables -I FORWARD -s 192.168.1.0/24 -d 10.1.1.0/24 -m state --state NEW -j ACCEPT |
3.6、iptables命令--SNAT和DNAT
3.6.1、SNAT和DNAT的原理图
- SNAT和DNAT不要配置在同一网络上。
- ip地址转换后,会将转化前后的地址(ip+port)对应记录到“nat连接追踪表”中。
1、SNAT原理图
- SNAT的作用:
- (1)SNAT主要用于隐藏客户端。
- (2)SNAT解决了ipv4紧缺的问题。
- 实现SNAT的规则要添加到nat表的POSTROUTING链上。
2、DNAT原理图
- DNAT的作用:
- (1)DNAT主要用于隐藏服务器
- (2)DNAT解决了ipv4紧缺的问题
- 实现DNAT的规则要添加到nat表的PREROUTING链上。
3.6.2、SNAT和DNAT使用的处理动作(target)
1、SNAT
- SNAT只在nat表中的POSTROUTING和INPUT链上有效。
- SNAT指定将源地址转换成哪个或哪些IP地址。它接受以下选项:
- --to-source [ipaddr[-ipaddr]][:port[-port]] 指定一个新的源IP地址或IP地址的范围。如果有多个新的源地址,将轮询这些地址。
- --random 端口映射将随机化。
- --persistent 如果指定多个新的源地址,同一个源IP将会被映射到同一个新的源IP。
2、MASQUERADE
- MASQUERADE可以实现动态ip的SNAT(如果是静态IP地址,建议使用SNAT)。
- MASQUERADE只在nat表中POSTROUTING链上有效。
- MASQUERADE只用于动态分配的IP(拨号)连接。
- --to-ports port[-port] 指定要使用的源端口范围,只有当规则同时指定以下协议之一时才有效:tcp、udp、dccp或sctp。
- --random 端口映射将随机化
3、DNAT
- DNAT只在nat表中PREROUTING和OUTPUT链上有效。
- SNAT指定将目标地址转换成哪个或哪些IP地址。它接受以下选项:
- --to-destination [ipaddr[-ipaddr]][:port[-port]]
- 指定一个新的目标IP地址或IP地址的范围。如果指定多个源地址,将会轮询这些地址。
- 如果要指定新的目标端口或目标端口范围,该规则必须指定了tcp、udp、dccp或sctp协议之一,否则不能指定新的端口。
- 如果没有指定新的端口,则永远不会修改目标端口。
- --random 端口映射将随机化
- --persistent 如果指定多个新的目标地址,同一个目标IP将会被映射到同一个新的目标IP。
- --to-destination [ipaddr[-ipaddr]][:port[-port]]
4、REDIRECT
- REDIRECT只在nat表中的PREROUTING和OUTPUT链上有效。
- REDIRECT通过将目的IP更改为传入接口的主地址来将包重定向到机器本身。
- --to-ports port[-port]
- 指定要使用的目标端口或目标端口范围,只有当规则同时指定以下协议之一时才有效:tcp、udp、dccp或sctp。
- 如果没有指定,则目标端口不会改变。
- --random 端口映射将随机化
- --to-ports port[-port]
3.6.3、实现SNAT
1、实验架构
- 将C机器当作内网的客户端。
- 将B机器当作网络防火墙。
- 10.1.1.11和10.1.1.12可以互ping通了,192.168.1.11和192.168.1.12也可以互ping通了。如果不通,请检测路由。
1 2 3 4 | //在A上执行 ]# ip route add 192.168.1.0/24 via 10.1.1.12 dev ens33 //在C上执行 ]# ip route add 10.1.1.0/24 via 192.168.1.12 dev ens33 |
2、开启核心转发
- 开启核心转发,永久生效
1 2 3 4 | //在B上执行 ]# vim /etc/sysctl.conf net.ipv4.ip_forward=1 ]# sysctl -p |
- 开启核心转发后,10.1.1.11和192.168.1.11可以互ping通了,这是因为所有的主机都关闭了firewalld,并且处理规则的默认处理动作是ACCEPT。
3、配置POSTROUTING链
- 客户端可能访问互联网的任意协议、端口以及地址,因此SNAT要开放所有(目标)的协议、端口和地址。
1 2 3 4 5 6 7 8 9 10 11 12 | //清空(在B上执行) ]# iptables -F FORWARD ]# iptables -t nat -F //将192.168.1.0/24网络的主机的地址映射为10.1.1.12(在B上执行) ]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 10.1.1.12 //查看(结果只是一部分) ]# iptables -t nat -nL Chain POSTROUTING (policy ACCEPT) target prot opt source destination SNAT all -- 192.168.1.0/24 0.0.0.0/0 to:10.1.1.12 |
3.6.4、实现DNAT
1、实验架构
- 将C机器当作内网的服务器。
- 将B机器当作网络防火墙。
- 10.1.1.11和10.1.1.12可以互ping通了,192.168.1.11和192.168.1.12也可以互ping通了。如果不通,请检测路由。
1 2 3 4 | //在A上执行 ]# ip route add 192.168.1.0/24 via 10.1.1.12 dev ens33 //在C上执行 ]# ip route add 10.1.1.0/24 via 192.168.1.12 dev ens33 |
2、开启核心转发
- 开启核心转发,永久生效
1 2 3 4 | //在B上执行 ]# vim /etc/sysctl.conf net.ipv4.ip_forward=1 ]# sysctl -p |
- 开启核心转发后,10.1.1.11和192.168.1.11可以互ping通了,这是因为所有的主机都关闭了firewalld,并且处理规则的默认处理动作是ACCEPT。
3、配置PREROUTING链
- 服务器只开放有限协议的有限端口。
- DNAT配合FORWARD链进行过滤(filter表)时,注意报文的目标地址和目标端口可能都已经改变。
1 2 3 4 5 6 7 8 9 10 11 12 | //清空(在B上执行) ]# iptables -F FORWARD ]# iptables -t nat -F //将10.1.1.12的80端口映射到192.168.1.11(在B上执行) ]# iptables -t nat -A PREROUTING -d 10.1.1.12 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.11 //查看(结果只是一部分) ]# iptables -t nat -nL Chain PREROUTING (policy ACCEPT) target prot opt source destination DNAT tcp -- 0.0.0.0/0 10.1.1.12 tcp dpt:80 to:192.168.1.11 |
3.7、保存和重载规则
- 保存:iptables-save > /PATH/TO/SOMERULE-FILE
- 重载:iptabls-restore < /PATH/FROM/SOME_RULE-FILE
- -n,--noflush:不清除原有规则
- -t,--test:仅分析生成规则集,但不提交
- Centos 6保存和重载的方法:
- 保存规则:
- service iptables save
- 保存规则于/etc/sysconfig/iptables文件,覆盖保存。
- 重载规则:
- service iptables restart
- 默认重载/etc/sysconfig/lptables文件中的规则。
- 配置文件:/etc/sysconfig/ptables-config
- 保存规则:
- CentoS 7保存和重载的方法:
- (1)自定义Unit File,进行iptables-restore。
- (2)firewalld服务。
- (3)自定义脚本。
3.8、规则优化的思路
- 使用自定义链管理特定应用的相关规则,模块化管理规则。
- (1)优先放行双方向状态为ESTABLISHED的报文。
- (2)服务于不同类别的功能的规则,匹配到报文可能性更大的放前面。
- (3)服务于同一类别的功能的规则,匹配条件较严格的放在前面。
- (4)设置默认策略:白名单机制
- (a) iptables -P,不建议。
- (b)建议在规则的最后定义规则做为默认策略。
1 | # # |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!