防火墙:
netfilter/iptables是集成在Linux2.4.X版本内核中的包过滤防火墙系统。该架构可以实现数据包过滤,网络地址转换以及数据包管理功能。linux中防火墙分为两部分:netfilter和iptables。netfilter位于内核空间,目前是Linux内核的组成部分。netfilter可以对本机所有流入,流出。转发的数据包进行查看,修改,丢弃,拒绝等操作。netfilter位于内核空间中,用户无法接触内核和修改内核,需要使用iptables或Firewalld等工具。
防火墙模块位于/lib/modules/`uname -r `/kernel/net/netfilter目录下,需要某个模块可以通过modprobe加载该模块。
iptables是组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。在日常Linux运维工作中,经常会设置iptables防火墙规则,用来加固服务安全。
CENTOS7中在原有netfilter/iptables架构基础上添加了firewalld。iptables仅可以调整ipv4的防火墙规则。centos7中默认是用Firewalld作为用户的防火墙工具,当用户使用firewalld编写ipv4防火墙规则时,firewalld依然调用底成的iptables实现具体功能。
传统iptables如何使用。
iptables的规则表和链
表(tables):提供特定的功能,iptables内置了4个表,即
filter表(实现包过滤)
nat表(网络地址转换)
mangle表(修改数据标记位规则表)
raw表(跟踪数据表规则表)
链(chains):当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定 义的默认策略来处理数据包。
INPUT(入站数据过滤)
OUTPUT(出站数据过滤)
FORWARD(转发数据过滤)
PREROUTING(路由前过滤)
POSTROUTING(路由后过滤)
-->PREROUTING-->路由决定----->FORWARD------------->POSTROUTING| ^| |INPUT--->LOCAL PRECESS-->OUTPUT
1)外部主机发送到数据包给防火墙本机,数据经过PREROUTING链和INPUT链
2)防火墙本机发送数据包到外部主机,数据经过OUTPUT和POSTROUTING
3)防火墙作为路由负责转发数据,数据经过PREROUTING,FORWARD,POSTROUTING.
1)当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
2)如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
3)如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
规则概念
规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息 包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。
当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept),拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作是添加,修改和删除等规则。
其中:
匹配(match):符合指定的条件,比如指定的 IP 地址和端口。
丢弃(drop):当一个包到达时,简单地丢弃,不做其它任何处理。
接受(accept):和丢弃相反,接受这个包,让这个包通过。
拒绝(reject):和丢弃相似,但它还会向发送这个包的源主机发送错误消息。这个错误消息可以指定,也可以自动产生。
目标(target):指定的动作,说明如何处理一个包,比如:丢弃,接受,或拒绝。
跳转(jump):和目标类似,不过它指定的不是一个具体的动作,而是另一个链,表示要跳转到那个链上。
规则(rule):一个或多个匹配及其对应的目标。
防火墙的语法格式
1)iptables的基本语法格式
iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
说明:
表名、链名:用于指定iptables命令所操作的表和链;
命令选项:用于指定管理iptables规则的方式(比如:插入、增加、删除、查看等;
条件匹配:用于指定对符合什么样 条件的数据包进行处理;
目标动作或跳转:用于指定数据包的处理方式(比如允许通过、拒绝、丢弃、跳转(Jump)给其它链处理。
2)iptables命令的基本参数
-P 设置默认策略:iptables -P INPUT (DROP ACCEPT) -F 清空规则链 -L 查看规则链 -A 在规则链的末尾加入新规则 -I num 在规则链的头部加入新规则 -D num 删除某一条规则 -s 匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。 -d 匹配目标地址 -i 网卡名称 匹配从这块网卡流入的数据 -o 网卡名称 匹配从这块网卡流出的数据 -p 匹配协议,如tcp,udp,icmp --dport num 匹配目标端口号 --sport num 匹配来源端口号
常用命令: -A 追加规则-->iptables -A INPUT -D 删除规则-->iptables -D INPUT 1(编号) -R 修改规则-->iptables -R INPUT 1 -s 192.168.12.0 -j DROP 取代现行规则,顺序不变(1是位置) -I 插入规则-->iptables -I INPUT 1 --dport 80 -j ACCEPT 插入一条规则,原本位置上的规则将会往后移动一个顺位 -L 查看规则-->iptables -L INPUT 列出规则链中的所有规则,默认是filter表,如果列出nat表的规则需要添加-t,即iptables -t nat -L -N 新的规则-->iptables -N allowed 定义新的规则通用参数: -p 协议 例:iptables -A INPUT -p tcp -s源地址 例:iptables -A INPUT -s 192.168.1.1 -d目的地址 例:iptables -A INPUT -d 192.168.12.1 -sport源端口 例:iptables -A INPUT -p tcp --sport 22 -dport目的端口 例:iptables -A INPUT -p tcp --dport 22 -i指定入口网卡 例:iptables -A INPUT -i eth0 -o指定出口网卡 例:iptables -A FORWARD -o eth0 -j 指定要进行的处理动作
常用的ACTION: DROP:丢弃 REJECT:明示拒绝 ACCEPT:接受 SNAT基于原地址的转换 source--指定原地址
MASQUERADE:源地址伪装
REDIRECT:重定向:主要用于实现端口重定向
MARK:打防火墙标记的
RETURN:返回 在自定义链执行完毕后使用返回,来返回原规则链
实例:
1.空当前的所有规则和计数
iptables -F # 清空所有的防火墙规则 iptables -X # 删除用户自定义的空链 iptables -Z # 清空计数
2.配置允许ssh端口连接
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT # 22为你的ssh端口, -s 192.168.1.0/24表示允许这个网段的机器来连接,其它网段的ip地址是登陆不了你的机器的。 -j ACCEPT表示接受这样的请求
3.允许本地回环地址可以正常使用
iptables -A INPUT -i lo -j ACCEPT #本地圆环地址就是那个127.0.0.1,是本机上使用的,它进与出都设置为允许 iptables -A OUTPUT -o lo -j ACCEPT
4.设置默认的规则
iptables -P INPUT DROP # 配置默认的不让进 iptables -P FORWARD DROP # 默认的不允许转发 iptables -P OUTPUT ACCEPT # 默认的可以出去
5.配置白名单
iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT # 允许机房内网机器可以访问 iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT # 允许机房内网机器可以访问 iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允许183.121.3.7访问本机的3380端口
6.开启相应的服务端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 开启80端口,因为web对外都是这个端口 iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT # 允许被ping iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已经建立的连接得让它进来
保存规则到配置文件中
cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak # 任何改动之前先备份,请保持这一优秀的习惯 iptables-save > /etc/sysconfig/iptables cat /etc/sysconfig/iptables
列出已设置的规则
iptables -L [-t 表名] [链名] 四个表名 raw,nat,filter,mangle 五个规则链名 INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING filter表包含INPUT、OUTPUT、FORWARD三个规则链iptables -L -t nat # 列出 nat 上面的所有规则 # ^ -t 参数指定,必须是 raw, nat,filter,mangle 中的一个 iptables -L -t nat --line-numbers # 规则带编号 iptables -L INPUTiptables -L -nv # 查看,这个列表看起来更详细
清除已有规则
iptables -F INPUT # 清空指定链 INPUT 上面的所有规则 iptables -X INPUT # 删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。# 如果没有指定链名,则会删除该表中所有非内置的链。 iptables -Z INPUT # 把指定链,或者表中的所有链上的所有计数器清零。
开放指定的端口
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已建立的或相关连的通行
iptables -A OUTPUT -j ACCEPT #允许所有本机向外的访问
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许访问22端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许访问80端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT #允许ftp服务的21端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT #允许FTP服务的20端口
iptables -A INPUT -j reject #禁止其他未允许的规则访问
iptables -A FORWARD -j REJECT #禁止其他未允许的规则访问
屏蔽IP
iptables -A INPUT -p tcp -m tcp -s 192.168.0.8 -j DROP # 屏蔽恶意主机(比如,192.168.0.8 iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令 iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到123.255.255.254的命令 iptables -I INPUT -s 124.45.0.0/16 -j DROP #封IP段即从123.45.0.1到123.45.255.254的命令 iptables -I INPUT -s 123.45.6.0/24 -j DROP #封IP段即从123.45.6.1到123.45.6.254的命令是
指定数据包出去的网络接口,只对 OUTPUT,FORWARD,POSTROUTING 三个链起作用。
iptables -A FORWARD -o eth0
查看已添加的规则
iptables -L -n -v Chain INPUT (policy DROP 48106 packets, 2690K bytes)pkts bytes target prot opt in out source destination5075 589K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0191K 90M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 1499K 133M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 4364K 6351M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED6256 327K ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destinationChain OUTPUT (policy ACCEPT 3382K packets, 1819M bytes)pkts bytes target prot opt in out source destination5075 589K ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
启动网络转发规则,
公网210.14.67.7
让内网192.168.188.0/24
上网
iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127
端口映射,
本机的 2222 端口映射到内网 虚拟机的22 端口
iptables -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222 -j DNAT --to-dest 192.168.188.115:22
字符串匹配
比如,我们要过滤所有TCP连接中的字符串test
,一旦出现它我们就终止这个连接,我们可以这么做:
iptables -A INPUT -p tcp -m string --algo kmp --string "test" -j REJECT --reject-with tcp-reset iptables -L# Chain INPUT (policy ACCEPT) # target prot opt source destination # REJECT tcp -- anywhere anywhere STRING match "test" ALGO name kmp TO 65535 reject-with tcp-reset # # Chain FORWARD (policy ACCEPT) # target prot opt source destination # # Chain OUTPUT (policy ACCEPT) # target prot opt source destination
阻止Windows蠕虫的攻击
iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --algo kmp --string "cmd.exe"
防止SYN洪水攻击
iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEP
iptables防火墙规则的顺序十分重要,内核按顺序检查这些规则,如果发现有匹配的规则条目,则立刻执行相关动作,停止继续向下查找规则条目,如果所有的防火墙规则都未匹配成功,则按照默认的策略处理, -A添加防火墙规则追加到整个链的最后,-I默认会插入到链中作为第一条规则
iptables的用法:iptables [-t 表名] {-A|-D|-I|-F|-L|-R|-Z|-P} 链名 rule-specification
查看filter表的所有规则 iptables -nL
查看filter表防火墙规则并显示规则编号 iptables -nL --line-number
查看net表的所有规则 iptables -t nat -nL
清空filter表的所有规则 iptables -F
在filter表中添加一条新的入站规则,丢弃192.168.1.0主机发送给防火墙本机的所有数据包 iptables -A INPUT -s 192.168.0.1 -j DROP
在filter表中,拒绝192.168.0.22ping防火墙本机 iptables -I INPUT -s 192.168.0.22 -p icmp -j REJECT
删除filter表中INPUT链的第一条规则 iptables -D INPUT 1
替换filter表中第二条规则,拒绝192.168.1.254之外的任何主机连接到防火墙本机 iptables -R INPUT 2 ! -s 192.168.1.254 -j REJECT
修改filter表中INPUT的默认规则是接受数据包 iptables -t filter -P INPUT ACCEPT
将192.168.0.10主机发送给防火墙本机22端口的所有数据包信息记录到messages日志: iptables -I INPUT -s 192.168.0.10 -p tcp --dport 22 -j LOG
允许任何主机从eno16网络接口访问防火墙本机的80端口 iptables -I INPUT -i eno16 --p tcp --dport 80 -j ACCEPT
IPTABLES防火墙应用实例
案例一:允许任意客户端访问服务器主机提供的日常服务(http,https,ssh),在Linux系统中/etc/services文件可以找到各种服务对应的端口号
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
(如果你把OUTPUT 设置成DROP,就需要加上这个规则,否则SSH还是不能登录,因为SSH服务职能进不能出.) iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT iptables -P INPUT DROP
(-P:设置链默认规则) iptables -P OUTPUT ACCEPT
案例二:公司拥有一个共有ip,使用防火墙实现局域网中所有主机通过SNAT共享上网,使用centos7作为公司软路由,公司内部所有192.168.0.1/24网段内的主机连接到外网124.126.199.84时,防火墙自动将所有数据包的原地址修改为路由器上的公有IP,最后互联网将信息返回路由后,由路由转交给真正的后端主机。防火墙原地址转换(SNAT)规则需写入到NAT表中的POSTROUTING链。
在centos7软路由配置:
vim /etc/sysctl.conf net.ipv4.ip_forward = 1 sysctl -p iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 124.126.199.84
案例三:公司对外有一个公有IP,内部有http,mail两台核心的服务器,通过防火墙实现客户可以从互联网的任意位置访问位于公司内部的两台服务器资源,连接方向发生变化,案例二是SNAT,本例是DNAT.
该案例中0.100是http,0.101是postfix,124.126.199.84是作为软路由使用的。
vim /etc/sysctl.conf net.ipv4.ip_forward = 1 sysctl -p iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -d 124.126.199.84 -p tcp --dport 80 DNAT --to-destination 192.168.0.100 iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -d 124.126.199.84 -p tcp --dport 25 DNAT --to-destination 192.168.0.101
iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -d 124.126.199.84 -p tcp --dport 110 DNAT --to-destination 192.168.0.101
案例四:目前网络上攻击手法多,很多攻击采用发送大量无效的数据包给服务器,造成服务器无法正常响应正常的数据请求,iptables提供了一个limit扩展功能,可以限制单位时间内数据包的个数。下面是规则是当每秒数据包个数为500时接受入站连接,否则拒绝连接。
iptables -I INPUT -m limit --limit 500/sec -j ACCEPT iptables -P INPUT DROP
案例五:企业环境中,服务器面临各种攻击,iptables本身属于三层过滤防火墙,也提供了string扩展功能,通过--string可以根据关键词限制网络连接。下面是记录基于Linux软路由服务器防火墙规则中,实现拒绝转发包含有关键词/etc/passwd 以及qq的数据包,防止将密码文件复制出局域网,防止内部员工访问QQ网站。
iptables -I FORWARD -m string --algo bm--string "/etc/passwd" -j REJECT iptables -I FORWARD -m string --algo bm--string "qq" -j REJECT
案例六:根据数据连接状态设置防火墙规则,放行所有的出站数据包,拒绝入站的新连接请求与无效连接,放行入站的回应请求。
iptables -F iptables -A INPUT -m state --state NEW -j DROP iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -P OUTPUT ACCEPT
案例七:公司基于Linux软路由设备,要求在路由设备上设置防火墙,记录192.168.0.1-192.168.0.11地址内所有主机发送给路由要求转发的数据包,并允许转发这些数据包
iptables -A FORWARD -m iprange --src-range 192.168.0.1-192.168.0.11 -p tcp --dport 80 -j ACCEPT
案例八:减少不安全的端口连接
iptables -A OUTPUT -p tcp --sport 31337 -j DROPiptables -A OUTPUT -p tcp --dport 31337 -j DROP 有些特洛伊木马会扫描端口31337到31340(即黑客语言中的 elite 端口)上的服务, 既然合法服务都不使用这些非标准端口来通信, 阻塞这些端口能够有效地减少你的网络上可能被感染的机器和它们的远程主服务器进行独立通信的机会。 还有其他端口:31335、27444、27665、20034 NetBus、9704、137-139(smb),2049(NFS)端口也应被禁止
案例九:
场景一
开放 tcp 10-22/80 端口 开放 icmp 其他未被允许的端口禁止访问
存在的问题: 本机无法访问本机; 本机无法访问其他主机场景二
ftp: 默认被动模式(服务器产生随机端口告诉客户端, 客户端主动连接这个端口拉取数据) vsftpd: 使 ftp 支持主动模式(客户端产生随机端口通知服务器, 服务器主动连接这个端口发送数据)场景三
允许外网访问: web http -> 80/tcp; https -> 443/tcp mail smtp -> 25/tcp; smtps -> 465/tcp pop3 -> 110/tcp; pop3s -> 995/tcp imap -> 143/tcp
内部使用: file nfs -> 123/udp samba -> 137/138/139/445/tcp ftp -> 20/21/tcp remote ssh -> 22/tcp sql mysql -> 3306/tcp oracle -> 1521/tcp场景四
nat 转发场景五
防CC攻击
iptables -L -F -A -D # list flush append delete
# 场景一
iptables -I INPUT -p tcp --dport 80 -j ACCEPT # 允许 tcp 80 端口
iptables -I INPUT -p tcp --dport 10:22 -j ACCEPT # 允许 tcp 10-22 端口
iptables -I INPUT -p icmp -j ACCEPT # 允许 icmp
iptables -A INPUT -j REJECT # 添加一条规则, 不允许所有
# 优化场景一
iptables -I INPUT -i lo -j ACCEPT # 允许本机访问
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许访问外网
iptables -I INPUT -p tcp --dport 80 -s 10.10.188.233 -j ACCEPT # 只允许固定ip访问80
# 场景二
vi /etc/vsftpd/vsftpd.conf # 使用 vsftpd 开启 ftp 主动模式
port_enable=yes
connect_from_port_20=YES
iptables -I INPUT -p tcp --dport 21 -j ACCEPT
vi /etc/vsftpd/vsftpd.conf # 建议使用 ftp 被动模式
pasv_min_port=50000
pasv_max_port=60000
iptables -I INPUT -p tcp --dport 21 -j ACCEPT
iptables -I INPUT -p tcp --dport 50000:60000 -j ACCEPT
# 还可以使用 iptables 模块追踪来自动开发对应的端口
# 场景三
iptables -I INPUT -i lo -j ACCEPT # 允许本机访问
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许访问外网
iptables -I INPUT -s 10.10.155.0/24 -j ACCEPT # 允许内网访问
iptables -I INPUT -p tcp -m multiport --dports 80,1723 -j ACCEPT # 允许端口, 80 -> http, 1723 -> vpn
iptables -A INPUT -j REJECT # 添加一条规则, 不允许所有
iptables-save # 保存设置到配置文件
# 场景四
iptables -t nat -L # 查看 nat 配置
iptables -t nat -A POST_ROUTING -s 10.10.177.0/24 -j SNAT --to 10.10.188.232 # SNAT
vi /etc/sysconfig/network # 配置网关
iptables -t nat -A POST_ROUTING -d 10.10.188.232 -p tcp --dport 80 -j DNAT --to 10.10.177.232:80 # DNAT
#场景五
iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT # 限制并发连接访问数
iptables -I INPUT -m limit --limit 3/hour --limit-burst 10 -j ACCEPT # limit模块; --limit-burst 默认为5
防火墙的备份和还原,如果不保存,计算机重启后所有规则会丢失。
iptables-save > /etc/sysconfig/iptables iptables-save > firewall.bak iptables-restore < firewall.bak