防火墙的分类
systemctl stop firewalld.service
:service iptables stop
关闭本机的防火墙并不意味者将防火墙禁用了,只是禁用系统默认的防火墙设置,自己可以再重新配置防火墙策略。
主机防火墙:服务范围为当前主机
网络防火墙:服务范围为防火墙一侧的局域网
硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一个部分功能基于软件 实现,Checkpoint,NetScreen
软件防火墙:运行于通用硬件平台之上的防火墙的应用软件 网络层防火墙:OSI下面第三层
iptables的基本认识
内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、FORWARD、 PREROUTING、POSTROUTING),而这五个hook function向用户开放,用户可以通过一 个命令工具(iptables)向其写入规则
五个内置链chain的顺序:
当有客户端有数据通过本机时先经过FORWARD过滤,在通过路由,如果是访问自己的http服务的数据就转到http前的input防火墙,输出数据时在经过output过滤;如果不是访问本机的http服务的数据就直接转发,通通forword过滤,转发到其他服务器上去的。
五个内置链chain
INPUT (本机服务前的防火墙)
OUTPUT (本机服务后的防火墙)
FORWARD (通过转发数据的防火墙过滤)
PREROUTING (进入本机前的防火墙过滤)
POSTROUTING (输出本机后的防火墙过滤)
iptables由四个表和五个链以及一些规则组成
四个表table:filter、nat、mangle、raw
filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包
nat表:network address translation 地址转换规则表
mangle:修改数据标记位规则表
Raw:关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度
iptables规则
内建处理动作:ACCEPT, DROP ,REJECT ,SNAT ,DNAT MASQUERADE, MARK,LOG…
链chain:
内置链:每个内置链对应于一个钩子函数
自定义链:用于对内置链进行扩展或补充,可实现更灵活的规则组织管理机制;只 有Hook钩子调用自定义链时,才生效
iptables规则添加时考量点
要实现哪种功能:判断添加在哪张表上
报文流经的路径:判断添加在哪个链上
报文的流向:判断源和目的
匹配规则:业务需要
链上规则的次序,即为检查的次序,因此隐含一定的法则
同类规则(访问同一应用),匹配范围小的放上面
不同类规则(访问不同应用),匹配到报文频率较大的放上面
将那些可由一条规则描述的多个规则合并为一个
设置默认策略
实验环境准备:
Centos7:
systemctl stop firewalld.service
systemctl disable firewalld. service
Centos6:
service iptables stop;
chkconfig iptables off
1、链管理:
-N:new, 自定义一条新的规则链
-X:delete,删除自定义的空的规则链
-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
ACCEPT:接受
DROP:丢弃
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除
2、查看:防火墙 (IP tables –vnl)
-L:list, 列出指定鏈上的所有规则,本选项须置后
-n:numberic,以数字格式显示地址和端口号
-v:verbose,详细信息 -vv 更详细 -x:exactly,显示计数器结果的精确值,而非单位转换后的易读值
–line-numbers:显示防火墙有几条规则并带有序列号
常用组合:
–vnL
–vvnxL
–line-numbers
-S selected,以iptables-save 命令格式显示链上规则
3、规则管理:
-A:append,追加
-I:insert, 插入,要指明插入至的规则编号,默认插入到第一条
-D:delete,删除防火墙策略
(1) 指明规则序号
(2) 指明规则本身
-R:replace,替换指定链上的指定规则编号
-F:flush,清空所有的防火墙策略
-Z:zero,将接收的报文信息清零
iptables的每条规则都有两个计数器
(1) 匹配到的报文的个数
(2) 匹配到的所有报文的大小之和
chain:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
简单示例 (增,删,查,改 的执行)
iptables -t filter -A INPUT -s 192.168.60.4 -j DROP (在本机设置词条策略的意思是:只要是192.168.60.4的主机访问自己都被drop丢弃 :-t filter :意思是在filter表上添加的策略; 可以不用写,因为默认的设置 ; -A INPUT 代表从远程的主机发送数据包 -j drop;如何处理远程主机发送过来数据包)
iptables -nvL (查看防火墙策略的列表)
iptables -nvL –line (查看防火墙策略列表,但是添加了序列号)
iptables -A INPUT -s 192.168.60.4 -j DROP (追加一条防火墙策略)
iptables -A INPUT -s 192.168.60.0/24 -j ACCEPT (可以写网段;意思是:整个网段都可以访问)
iptables -I INPUT -s 192.168.60.4 -j DROP (插入一条防火墙策略,不添加序列号指定默认插入到第一行)
iptables -I INPUT 2 -s 192.168.60.8 -j DROP (指定插入到第2条防火墙策略,自己就成为第二条了)
iptables -D INPUT 1 (删除防火墙策略列表中的第一条)
原本是ACCEPT允许的可以通过-R 来修改原本的选线
iptables -R INPUT 2 -s 192.168.60.4 -j REJECT (-R 修改第二项防火墙策略原本的选项)
组和使用:
iptables -A INPUT -s 192.168.60.4 -j DROP
iptables -A INPUT -s 192.168.60.0/24 -j ACCEPT
(192.168.60.0/24整个网段都允许访问,但只拒绝192.168.60.4的主机的访问;此策略的顺序不可颠倒)
如果规则1和规则2都不匹配自己的防火墙策略;则会执行他的默认规则,如下图
2 扩展匹配条件的策略:(man iptables-extensions:查看iptables的扩展用法只在centos7上)
iptables -A INPUT -s 192.168.60.4 -p icmp -j DROP (只要是来自192.168.60.4的icmp协议的数据就拒绝,icmp协议就是ping包,在192.168.60.4上ping 本机就会ping不通 ;-p 后面跟的是)
iptables -A INPUT -s 192.168.60.4 -d 192.168.60.20 -p tcp -j DROP (-d 后面跟的是目标地址;只要是tcp协议的就拒绝;ssh 也属于tcp协议所以会拒绝ssh的连接)
tcp协议的扩展选项 ;
rpm -ql iptables;(此命令还可以查看扩展的协议模块)
–source-port, –sport port[:port]:匹配报文源端口,可为端口范围
–destination-port,–dport port[:port]:匹配报文目标端口,可为范围
iptables -A INPUT -s 192.168.60.4 -p tcp –dport 445 -j REJECT
iptables -A INPUT -s 192.168.60.4 -p tcp –dport 139 -j REJECT
(上面的两条为拒绝tcp 的目标端口445和139端口的访问;及拒绝smb的访问因为smb服务使用的就是445和139两个端口号;拒绝目标端口及本机文smb服务器;60.4主机访问本机的目标端口号 被拒绝)
1、multiport扩展
拒绝多个服务的多个端口的访问:(如:http;ftp;vsftp等服务一起都拒绝)
iptables -A INPUT -p tcp -m multiport –dport 21,80,445 -j REJECT
–dport 表示的是目标端口的意思;如果在本机输入此条防火墙策略,就表示其他主机无法连接本机的21,80,445,端口所对应的服务;但本机可以连接其他主机的这些服务则不会受限制。
iptables -A INPUT -p tcp –syn -j REJECT (拒绝tcp/ip协议的syn=1的第一次握手,自然就连不到本机上了;新建的连接是不行的,已经连接上的继续连接)
iptables -I INPUT -p tcp -m multiport –dports 22, 80,139,445 -j ACCEPT (允许http,smb,ssh的访问)
iptables -I INPUT -p udp -m multiport –dports 137,138 -j ACCEPT (因为smb服务头udp协议的端口)
iptables -A INPUT -j REJECT (拒绝所有的访问)
(总的实现目标:拒绝所有的外部访问只允许访问本机smb和http服务)
type/code
0/0 echo-reply icmp应答 (对本机出去的请求)
8/0 echo-request icmp请求 (对来的请求)
iptables -A INPUT -p icmp –icmp-type 8 -j REJECT (本机能够ping通其它主机,而其他主机ping不同本机)
iptables -A INPUT -p icmp –icmp-type 0 -j REJECT (正好和上面相反,本机ping不同其他主机而其他主机都可以ping通本主机)
(在tcp/ip协议中通过控制目标端口和源端口来控制上述的控制实现)
2、iprange扩展
指明连续的(但一般不是整个网络)ip地址范围
[!] –src-range from[-to] 源IP地址范围
[!] –dst-range from[-to] 目标IP地址范围
iptables -A INPUT -d 192.168.60.2 -p tcp –dport 80 -m iprange –src-range 172.16.1.5-172.16.1.10 -j DROP
(意思 :从172.16.1.5-172.16.1.10这个网段访问本机的192.168.60.2 的http服务被抛弃)
-m iprange :想使用连续的地址段必须添加此模块。
3、mac扩展 (通过MAC地址来控制更加精准)
指明源MAC地址 适用于:PREROUTING, FORWARD,INPUT chains
[!] –mac-source XX:XX:XX:XX:XX:XX
iptables -A INPUT -s 172.16.0.100 -m mac –mac-source 00:50:56:12:34:56 -j ACCEPT
-m mac –mac-source 00:50:56:12:34:56 :此为源地址MAC地址
-s 172.16.0.100 : 源地址
他们是并且的意思必须满足连个条件才被拒绝:既IP地址为:172.16.0.100且MAC地址为00:50:56:12:34:56
4、string扩展
对报文中的应用层数据做字符串模式匹配检测 (匹配到字符:包含某一特定的字符就可以拒绝)
–algo {bm|kmp}:字符串匹配检测算法
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
–from offset 开始偏移
–to offset 结束偏移
示例:本机上有http的goole网站;拒绝其他机器访问本机的goole网页,其他网站可以正常访问:
思路;此属于应用层的限制,应该设置在output上,当本机输出带有goole的字符则给他截断:
iptables -A OUTPUT -m string –algo bm –string “goole” -j REJECT
(由于对于源和目标主机没有限定,所以是外面的所有主机都是限定的)
5、time扩展
根据将报文到达的时间与指定的时间范围进行匹配
–kerneltz:内核时区,不建议使用,CentOS7系统默认为UTC
注意: centos6 不支持kerneltz ,–localtz指定本地时区(默认)
–timestart hh:mm[:ss] 时间
–timestop hh:mm[:ss]
[!] –monthdays day[,day…] 每个月的几号
[!] –weekdays day[,day…] 星期几
示例:
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp –dport 80 -m time –timestart 14:30 –timestop 18:30 –weekdays Sat,Sun –kerneltz -j DROP
(时间限定:每周的6,7 14:30—18:30从源地址172.16.0.0/16访问目标主机 172.16.100.10 的80端口被拒绝)
6、connlimit扩展
根据每客户端IP做并发连接数数量匹配
–connlimit-upto n:连接的数量小于等于n时匹配
–connlimit-above n:连接的数量大于n时匹配
iptables -A INPUT -d 172.16.100.10 -p tcp –dport 22 -m connlimit –connlimit-above 2 -j REJECT
(外面的所有主机对目标主机172.16.100.10 访问22端口被限制连接的数量最大为两个,多余的被抛弃)
7、limit扩展
基于收发报文的速率做匹配
–limit rate[/second|/minute|/hour|/day]
–limit-burst number
iptables -I INPUT -d 172.16.100.10 -p icmp –icmp-type 8 -m limit –limit 10/minute –limit-burst 5 -j ACCEPT(外面的所有主机对目标主机172.16.100.10访问ping的请求,前5次不限制之后被限制每分钟10次)
iptables -I INPUT 2 -p icmp -j REJECT (此两条配合使用,不满足上述条件的ping都会被拒绝;如果不添加此条规则,则当不满足上述条件的话会执行默认的规则还是会ping通的;所以要添加此规则)
8、state扩展
状态有如下几种:
NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因 此,将其识别为第一次发出的请求 (第一次访问我包:双方通信的第一个报文)
ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之 前期间内所进行的通信状态(不是第一次访问我的包)
RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中通21端口发起命令请求;但要通过其他随机端口来传送数据。
INVALID:无效的连接,如flag标记不正确
UNTRACKED:未进行追踪的连接,如raw表中关闭追踪
示例:
iptables -A INPUT -p tcp –dport 80 -m state –state NEW -j ACCEPT (新发起的连接接受)
iptables -I INPUT 1 -m state –state ESTABLISHED -j ACCEPT (已经连接的请求接受;但新发起的连接不接受了;此条规则没有定义端口和类型所以对任何服务都有效)
已经追踪到的并记录下来的连接信息库
/proc/net/nf_conntrack
调整连接记录功能所能够容纳的最大连接数量
/proc/sys/net/nf_conntrack_max
echo 1000000 > /proc/sys/net/nf_conntrack_max (临时调整)
echo net.nf_conntrack_max=2000000 >> /etc/sysctl.conf (永久修改)
sysctl -p (让修改的配置文件生效)
设置的连接数量不能是过大,否则会对服务器的资源消耗过大
不同的协议的连接追踪时长
/proc/sys/net/netfilter/ (此处是查看的)
降低 nf_conntrack timeout时间
vi /etc/sysctl.conf (此处是修改的)
net.netfilter.nf_conntrack_tcp_timeout_established = 300 net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120 net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60 net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
sysctl -p (让修改的配置文件生效)
iptables -t nat -L -n
注意:CentOS7 需要加载模块: modprobe nf_conntrack 才能监控连接状态。
开放被动模式的ftp服务 (vsftp服务分为主动模式和被动模式;主动模式的端口号是不变的,但被动模式下的端口号是随机的,所以防火墙的设置不同)
(1) 装载ftp连接追踪的专用模块: 跟踪模块路径:/lib/modules/kernelversion/kernel/net/netfilter
vim /etc/sysconfig/iptables-config 配置文件
IPTABLES_MODULES=“nf_conntrack_ftp”
modproble nf_conntrack_ftp (ftp连接追踪的专有模块;默认是没有加载的)
(2) 放行请求报文:
命令连接:NEW, ESTABLISHED
数据连接:RELATED, ESTABLISHED
iptables –I INPUT -d LocalIP -p tcp -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -d LocalIP -p tcp –dport 21 -m state –state NEW -j ACCEPT
(3) 放行响应报文:
iptables -I OUTPUT -s LocalIP -p tcp -m state –state ESTABLISHED -j ACCEPT
开放被动模式的ftp服务示例
yum install vsftpd
systemctl start vsftpd
modprobe nf_conntrack_ftp (加载ftp追踪功能的专有模块)
iptables -F (清除原有的规则)
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT (允许已经建立的连接和新发起的但与已有连接相关联的连接)启用此功能必须加载相对应的模块。
iptables -A INPUT -p tcp –dport 21 -m state –state NEW -j ACCEPT (新链接的21端口都允许)
iptables -vnL
iptables日志:
LOG: 当满足设定的规则条件后 ,将日志记录在/var/log/messages系统日志中
–log-level level 级别: emerg, alert, crit, error, warning, notice, info or debug
–log-prefix prefix 日志前缀,用于区别不同的日志,最多29个字符
示例:
iptables -I INPUT -s 10.0.1.0/24 -p tcp -m multiport –dports 80,21,22,23 -m state –state NEW -j LOG –log-prefix “new connections: ” (当从源地址10.0.1.0/24发起的tcp的80,21,22,23端口的请求并且是新发起的请求就记录日志里并加上关键字“new connections: “)
iptables内部端口的连接:iptables -A INPUT -i lo -j ACCEPT(都被允许)
当服务器内部有多个应用时,每个应用需要转发到其他应用的端口号上时就需要允许其内部的连接
iptables规则的有效期限:
使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限
保存规则至指定的文件 CentOS 6
service iptables save
执行上面的命令后就会将规则覆盖保存至/etc/sysconfig/iptables文件中
service iptables restart
会自动从/etc/sysconfig/iptables 重新载入规则
实现开机自启:
将iptables设为开机自启,就会自动加载保存的防火墙规则
chkconfig iptables on
CentOS 7 可用下面方法保存规则
iptables-save > /etc/iptables (路径及文件名可以自定义)
iptables-restore < /etc/iptables (还原防火墙的规则)
-n, –noflush:不清除原有规则
-t, –test:仅分析生成规则集,但不提交
开机自动重载规则文件中的规则 (在centos7上)
/etc/rc.d/rc.local在开机自动加载执行命令脚本的文件里添加:
iptables-restore < /etc/iptables (开机时就会自动还原保存的防火墙规则,但前提时在重启机器前需要保存修改过后的防火墙规则)
自定义链来实现规则
-N:new, 自定义一条新的规则链 (iptables -N WEB)
-X:delete,删除自定义的空的规则链 (iptables -X WEB)
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除
首先新建一个自定义的链:
iptables -N WEB (创建一个WEB链)
在自定义的链里添加防火墙规则:
iptables -A WEB -p tcp -m multiport –dports 80,443 -j ACCEPT (只允许访问本机的http,https)
最后将自定义的链关联到本机的链上去才能让其生效
iptables -I INPUT -s 192.168.60.0/24 -j WEB(当192.168.60.0/24 访问本机时,交给WEB链来决定规则)
删除自定义链的顺序:
首先删除input的关连:
iptables -D INPUT 1
再次删除WEB链上的规则:
iptables -D WEB 1
最后删除自定义的WEB链:
iptables -X WEB
小结:1 .如果有多条防火墙规则,生效的顺序为从第一条开始一次向下执行。如果两条策略有冲突,就会执行在前面的那一条防火墙规则。
2 . 添加防火墙策略应该是精确的范围小的写在前面,范围大的防火墙规则写在后面。
实验:网络防火墙
实验要求:内部主机可以访问外部网络,外部主机不能访问内部网络
实验结构:三台主机:一台内部网络的主机;一台充当路由器防火墙的主机;一台外部网络的主机
具体实验步骤:
1 在充当路由器的虚拟机上:
添加两块网卡在不同网段:并配置让其生效:(例如:10网段和11网段)
配置两块网卡的IP地址:IP地址为内网和外网两个网段的网关192.168.52.2和192.168.56.2两个网关
2 . 在充当内部主机的虚拟机上设一块网卡:让其在10网段并配置让其生效(要在网卡的配置文件上添加网关)主机:192.168.56.5 网关:192.168.56.2
3 . 在充当外部主机的虚拟机上设一块网卡:让其在11网段上并配置让其生效(要在网卡的配置文件上添加网关)主机:192.168.52.8 网关:192.168.52.2
实验环境搭好了:现在内部应该可以ping通外部网络 (都是在路由防火墙上添加的规则)
4 :要实现内部网络访问外部网络的限制;访问外网的youku 禁止;但访问magedu.com允许
在路由器防火墙上添加规则:
iptables -I FORWARD -m string –algo bm –string “youku.com” -j REJECT (拒绝通向优酷的转发)
(使用forward链是因为服务不是访问自己的而是通过自己转发的)
5 ,要实现在某个时间段也不可以访问外部的所有网站:
iptables -A FORWARD -m time –timestart 14:30 –timestop 18:30 –weekdays 1,3,5 -j DROP
(注意此时间为格林尼治时间需要自己做加减法,因为此模块内核定义的就是格林尼治时间)
6 .实现内部网络可以访问外部网络,外部网络不能访问内部网络:
思路:如果是从B发向A的回应包是允许的,如果是B主动的发起请求A则给与拒绝。
iptables -A FORWARD -j REJECT(拒绝所有的访问:既A到B和B到A的所有数据放在最后)
iptables -I FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT (插入一条规则,只要是已经建立连接的和建立连接相关的连接都允许)
iptables -I FORWARD 2 -s 192.168.60.0/24 -d 10.0.0.0/16 -m state –state NEW -j ACCEPT(在定义内网的源地址发起的新请求都是允许的,没有定义的按照第一条规则都应该是拒绝的)
7 .现在内部有一个服务器希望能够被外部访问,仅限内部的某一台服务器;(在第六题的基础上)
iptables -I FORWARD 2 -d 192.168.60.4 -m state –state NEW -j ACCEPT(加在上面的第二条,源地址不定义,目标地址为内网段的某一台主机,新建的所有连接都允许;也可以指定确定的服务端口)
上述实验实现的条件是在基于内网和外网都是公网IP地址的前提下;一般不会用到
实验从私网地址(局域网)去访问公网地址:(NAT技术)
局域网访问公网的过程:
当A主机通过中间设备发送请求到B;由于A是私网地址,在公网里没有路由解析不到私有地址则无法到达B
但通过NAT技术,当A的请求到达中间防火墙转换成公网地址,发送到B去,B收到请求返回数据到防火墙处使用NAT技术再将公网地址替换成私网地址,转发到A处。
此处有一个问题,当有多个私网地址去访问公网时由于中间的NAT只有一个公网地址就无法同时转发多个地址了,这时可以申请一段公网地址池,来供私网地址来使用,但是如果私网地址过多的话,地址池内的公网地址不多就又会造成拥堵;
这时会采用通过端口号来实现多个私网地址使用一个公网地址来访问外网,IP地址是相同的但使用的端口号是不同的。端口也要跟着转发(此技术为PAT)PATT+NAT可以实现多个私网地址转化成一个公网地址来访问外网的。
这种方式局域网可以访问互联网;但互联网无法访问局域网
SNAT
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT –to-source ExtIP
(ExtIP :外网地址 LocalNET:私网地址)
示例:
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j SNAT – -to-source 172.18.1.6
(如果是来自私网的10.0.1.0/24的这个网段就做转换,转换成172.18.1.6这个公网的IP地址来访问外网)
在上面的环境下实现SNAT:
搭建环境在上面的1,2,3 步骤来实现:(在外网的地址配过网关现在不需要网关了,去掉也可以访问)
iptables -t nat -A POSTROUTING -s 192.168.52.2 -j SNAT – -to-source 192.168.60.2
(-s 192.168.52.2:此为内部网的主机IP,source 192.168.60.2:此为实验环境下外网在路由器上设的网关IP地址路由器eth1的地址)
当内网访问外网时经过中间的 防火墙通过SNAT技术将本网段转换成;外网的网关,然后再访问外网是不需要网关的,在同一网段通过广播的方式就可以到达了。
DNAT
iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp –dport PORT -j DNAT –to-destination InterSeverIP[:PORT]
iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp –dport 22 -j DNAT –todestination 10.0.1.22
(当外网-s 0/0不限地址访问本机的防火墙上的唯一一个公网IP时172.18.100.6 -p tcp –dport 22的22端口时就给他转发到10.0.1.22 内网的地址上去)
在上面的环境下实现SNAT:
搭建环境在上面的1,2,3 步骤来实现:(下面的规则再防火墙主机上添加)
iptables -t nat -A PREROUTING -D 192.168.52.2 -p tcp –dport 22-j destination 192.168.56.5 22
(192.168.52.2 :当访问防火墙的外网IP也就是实验环境的路由的外网IP网关22端口时,就给他转发到内网主机的22端口192.168.56.5 22)
ssh 192.168.52.2(此IP为外网的网关地址) 就会连接到指定的内网192.168.56.5的主机上去
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/101905