iptables
centos7开始,系统自带的防火墙是firewalld,但是也支持iptables,
yum -y install iptables.service #下载安装包
iptables常见概念iptables是由netfilter/iptables:ip信息包过滤系统,它实际上由两个netfilter和iptables组成。
netfilter组件也称为内核空间(kemelspace),是内核的一部分,由一些信息包过滤表组成,这些包含内核用来控制信息包过滤处理规则集。
iptables组件是一种工具,也称为用户空间(userspace),它使插入,修改和除去信息包过滤表中的规则变得容易。
三张表介绍:filter负责过滤数据包,包含的规则有input,output,forward。nat则设计到网络地址转换,包括prerouting,postrouting和outputmangle表则主要应用在修改数据包内容上,用来做流量整形的,给数据包打个表示,默认的规则链有:input,output,forward,postrouting,prerouting;
三表五链:
input:匹配目标ip是本机的数据包
output:出口数据包,一般不在此链上做配置
forward:匹配流经本地的数据包
prerouting:用来修改目标地址,用来做DNAT,
postrouting:用来修改源地址用来做SNAT,如内网通过路由器NAT转换功能实现内网pc机通过一个公网ip地址上网。数据包转发两种:
表间的优先顺序:raw->mangle->nat->filter
链间的匹配顺序:
入站数据:PREROUTING,INPUT出战数据:OUTPUT,POSTROUTING
转发数据:PREROUTING FOEWARD POSTROUTING
链内的匹配顺序:自上而下按顺序依次进行检查,找到匹配的规则即停止(LOG选项表示记录相关日志)若在该链内找不到相匹配的规则,则按该链的默认策略处理(未修改的状况下,默认策略为允许)规则的次序非常关键,越严格的规则越靠前,
iptables服务器安装及相关配置方法
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止开启firewall
#安装iptables
yum install -y iptables-services
ls /etc/sysconfig/iptables #主配置文件
systemctl status iptables.service #查看iptables状态
cat /etc/sysconfig/iptables
实战:iptables使用方法
iptables命令的语法格式:
iptables [-t 表名] 管理选项 [链名] [条件匹配] [-j 目标动作或跳转]
注意事项:不指定表名时,默认表示filter表
不指定链名时,默认表示该表内所有链除非设置规则链的缺省策略,否则需要指定匹配条件
-A<链名> append,追加一条规则(放到最后)
iptables -t filter -A input -j DROP #拒绝所有人访问服务器
在filter表的input链里追加一条规则,(作为最后一条规则)匹配所有访问本机ip的数据包,匹配到的丢弃
-i <链表> [规则号码] insert,插入一条规则
iptables -I input -j drop #在filter表的input链里插入一条规则(插入成第一条)自杀
应用场景,在不拔网线的情况下断网
iptables -I input 3 -j drop #在filter表的input链里插入一条规则(插入成第三条)注:
-R num:replays替换、修改第几条规则
iptables -t filter -R input 3..... #修改filter的input链第三条规则
-D<链名><规则号码|具体规则内容> delete 删除一条规则
iptables -L #查看列表默认规则
iptables -D INPUT -s 192.168.0.1 -j DROP #删除input链中的第一条规则按内容查找
-P <链表>:修改默认策略,设置filter表input链的默认规则是drop
iptables -P INPUT DROP #拒绝访问权限drop,默认是ACCEPT
-F<链表> flush,清空规则注:
如果不指定表名,则清空所有规则,
1.-F仅仅是清空链中规则,并不影响-p设置的默认规则,需手动改:
2.-p设置了drop后,使用-p一定要小心,在生产环境中,设置之前最好配置下面两个任务计划,否则容易把自己drop掉,连接不上主机
3.配置crontab
4.
*/15 *** iptables -P INPUT accept*
5.*/15 ***iptables -F
-Z 将封包计数器归零
iptables -Z INPUT
-nvL:n:只显示ip地址和端口号码,不显示域名和服务名称。
v:显示详细信息,包括每条规则的匹配包数量和匹配字节数
x:在v的基础上,禁止自动单位换算。
匹配条件
:流入,流出接口(-i,-o)
来源,目的地址(-s,-d)
协议类型(-p)
来源,目的端口(--sport,--dport)
按照网络接口匹配:
-i<匹配数据进入的网络接口>
-o<匹配数据流出的网络接口>
#此参数主要应用于nat表,例如目标地址转换
-i eth0 #匹配是否从eth0进来**
-i ppp0 #匹配是否从ppp0进来**
-o eth0 #匹配是否从eth0流出**
-o ppp0 #匹配是否从ppp0流出**
按照来源,目的地址匹配
-s<匹配来源地址>可以是ip,网段,域名,也可以为空(任何地址)
-d<匹配目的地址>可以是ip,网段,域名,也可以为空(任何地址)
-s 192.168.0.1 #匹配来自192.168.0.1的数据包**
-s 192.168.1.0/24 #匹配来自192.168.1.0/24的网段-**
-s 192.168.0.0/24 #匹配来自192.168.0.0/24的网段**
-d 202.106.0.20 #匹配去往202.106.0.20的数据包**
-d www.baidu.com #匹配去往域名www.baidu.com的数据包
按照协议类型匹配
-p <匹配协议类型>可以是个别端口,也可以是端口范围
-p tcp
-p udp
-p icmp
按来源,目的端口匹配
--sport<匹配源端口>
--dport<匹配目的端口>
注:--sport和--dport必须配合-p参数使用
匹配网路中目的端口是53的udp协议数据包
-p udp --dport 53
匹配来自10.1.0.0/24去往172.17.0.0/16的所有数据包
-s 10.1.0.0./24 -d 172.17.0.0/16匹配来自192.168.0.1,
去往[www.baidu.com](http://www.baidu.com/)的80端口的TCP协议数据包
-s 192.168.0.1 -d [www.baidu.com](http://www.baidu.com/) -p tcp --dport 80
-j MASQUERADE伪装
动态源地址转换(动态ip的情况下使用)
iptables -t nat-A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
#将源地址是192.168.0.0/24的数据包进行地址伪装,转换成eth0上的ip地址,eth0为路由器外网出口ip地址
**附加模块:
**按包状态匹配(state)
**-m state --state 状态new:有别于tcp的syn,如果我们发送一个流的初始化包,状态就会在output链里被设置为new,当我们收到回应的包时,状态就会在PREROUTING链里被设置为ESTABLISHED。如果第一个包不是本地产生的,那就会在PREROUTING链里被设置为new状态。
ESTABLISHED:连接态
RELATED:衍生态,与conntrack关联(FTP)
invalid:不能被识别属于哪个连接或者没有任何状态。
iptbales -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
按来源mac匹配(mac)
-m mac --mac-source MAC 匹配某个MAC地址
iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
阻断来自某MAC地址的数据包,通过本机按包速率匹配(limit)
iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s -j ACCEPT
iptables -A FORWARD -d 192.168.0.1 -j DROP
注:limit英语上看是限制的意思,但实际上只是一定速率去匹配而已,要想限制的话后面要跟上一条DROP
多端口匹配(multiport)
-m multtiport <--sports|--dports|--ports> 端口1[端口2,端口3]
一次性匹配多个端口。可以区分源端口,目的端口或不指定端口。
iptables -A INPUT -p tcp -m multiport --dports 21.22.25.80,110 -j ACCEPT
注意:必须与-p参数一起使用。
必须要执行保存命令
service iptables save
实例1:使用iptables防火墙保护公司web服务器
iptables -A INPUT -i lo -j ACCEPT #放行回环口所有数据
iptables -A INPUT -p tcp -m multiport --dports 22,80 -j ACCEPT
#首先放行22端口
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #状态
iptables -P INPUT DROP #唯一一种不同-j指定动作的情况,指定默认策略
iptables -nvL #查看默认策略,详细信息
yum install -y httpd
systemctl start httpd.service
netstat -tlunp | grep httpd
curl -I 192.168.137.130#没有放行
vim /etc/sysconfig/iptables #编辑配置文件
删掉icmp-host的两行策略:
:wq
service iptables reload
iptables -D INPUT 5 #删除策略
实例2:使用iptables搭建路由器,通过snat使用内网机器上网。
弄清网络拓扑,此时需要两个网卡,添加虚拟网卡
需求:把64的端口映射到63的80端口,客户端访问192.168.1.63:80即可访问192.168.2.2:80的内容
端口映射:DNAT
家庭路由:SNAT
ifconfig ens35 192.168.2.1/24
yum install -y httpd
systemctl start httpd
netstat -tlunp|grep 80
cd /var/www/html/
ls
cd ..
ls#cgi-bin html
cd html
echo "this is cuegod " > index.html
systemctl restart httpd
iptables -t nat -A PREROUTING -d 192.168.0.63 -p tcp --dport 80 -j DNAT --to 192.168.2.10
#-t 指定链 -d指定目的地址 -p 指定协议 dport 指定端口 -j 指定动作 --to指定去处iptables -t nat -nvL#查看策略
实例3:限制某些ip地址访问服务器
我们把哪怕只修改一条规则也要进行所有规则的重新载入的模式称为静态防火墙
动态防火墙;任何规则的变更都不需要对整个防火墙规则列表进行重新加载,只需要将变更部分保存并更新到运行中的iptables即可。
firewalled提供了一个daemon和service,还有命令行和图形界面配置工具。区域:过滤规则集合。
zone
一个zone就是一套过滤规则,数据包必须要经过某个zone才能入站或出站。不同zone中规则粒度粗细,安全强度都不尽相同。可以把zone看作是一个个出站或入站必须经过的安检门,有的严格,有的宽松,有的检查细致,有的检查粗略。
firewalld将网卡对应不同的区域,block,dmz,drop,external,home,internal,public,trusted,work.
在centos7系统中,默认区域被设置为public
drop(丢弃)
public(公共)
block(限制)
external(外部)特别是为路由器用了伪装功能的外部网,您不能信任来自网络的其他计算,不能相信他们不会对您的计算机造成危害,只能接受经过选择的连接。
dmz(非军事区)
work (工作)
home(家庭)
trusted(信任区)
服务:在/usr/bin/firewalld/services/目录中,还保存了另外一类配置文件,每个文件对应一项具体的网络服务,如ssh服务等。与之对应的配置文件中记录了各项服务所使用的tcp/udp端口,在最新版本的firewalld中默认定义了70多种服务供我们使用
当默认提供的服务不够用或者需要自定义某项服务的端口时我们需要将service配置文件放置在/etc/firewalld/services/目录中,
/etc/firewalld/ 存放修改过的配置(优先查找)
/usr/lib/firewalld/默认配置
修改配置的话只需要将/user/lib/firewalld中的配置文件复制到/etc/firewalld中修改,恢复的话直接删除/etc/firewalld中的配置就可以了
比如:ssh服务默认运行在22端口,如果你的ssh服务运行在220端口(不是默认)此时需要放行220端口,就需要把/usr/lib/firewalld/ssh.xml文件拷贝到/etc/firewalld/services/目录下,修改文件端口为220.
systemctl firewall-cmd --get-services #查看firewalled默认支持的服务
firewall-cmd --list-services #查看运行的服务
firewall-cmd --version #查看版本
firewall-cmd --get-zone-of-interface=eth0 #查看接口在哪个区域
firewall-cmd --panic-on #拒绝所有包紧急模式
firewall-cmd --panic-off #取消拒绝状态
firewall-cmd --query-panic #查看是否被拒绝
firewall-cmd --zone=public--add--interface=eth0
#将接口添加到区域,默认接口堵在public,永久生效再加上--permanent然后reload防火墙
firewall-cmd --zone=dmz --add-port=8080/tcp #加入端口到区域
打开一个服务,类似于将端口可视化,服务需要在配置文件中添加,/etc/firewalld目录下有services文件夹
firewall-cmd --zone=work --add-service=smtp#把smtp服务在work域中放行
firewall-cmd --zone=work --remove-service=smtp#把smtp服务在work域中移除
firewall-cmd --zone=work --list all#查看区域中开了哪些服务
firewall-cmd --get-actice-zones#查看哪个区域是活动的
firewall-cmd --get-zone-of-interface=<interface>#根据接口获取区域
firewalld-cmd [--zone=<zone>] -add-interface=<interface>#将接口增加到区域
firewall-cmd [--zone=<zone>] --change-interface=<interface>#修改接口所属区域
firewall-cmd[--zone=<zone>] --remove-inteface=<interface>#从区域中删除一个接口
firewall-cmd [--zone=<zone>] --query-interface=<interface>#查询区域中是否包含某接口
firewall-cmd [--zone=<zone>] --list-services#列举区域中启用的服务
firewall-cmd --query-panic#查询应急模式
ll /usr/lib/firewalld/services/#查看系统本身已经内置了的一些常用的服务防火墙规则
cp /usr/lib/firewalld/services/http.xml /etc/firewalld/servives/#将防火墙规则当做服务管理
ls /etc/firewalld/zones/#改zones的配置文件
vim public.xml
<service name="http"/>#复制xml文件,加入服务
<service name="ssh">
:wq
firewall-cmd --reload #重新加载firewall
#改配置文件
指定ip访问ssh端口
#修改/etc/firewalld/zones/
#rule字段中要限制ip和使用的服务
<source address="192.168.23.1"/>
firewalle-cmd --reload
添加自定义服务举例:添加8080端口为新的service
添加新的文件8080.xml
cat /etc/firewalld/service/8080.xml
复制其他服务.xml
<service><short>8080 test</short>
<description>此处为文字说明</description>
<port protocol="tcp" port='8080'/>
</service>
编辑public.xml文件,加入相应的server
<service name="8080">
:wq
实例4:使用DNAT功能把内网服务器端口映射到路由器外网,selinux概述,状态切换
snat
firewall-cmd --premanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to--source 公网ip
dnat
firewall-cmd --premanent --direct --passthrough ipv4 -t nat -A PREROUTING -d 173.16.16.1 -P tcp--dport 2346 -j DNAT --to-destination 192.168.10.2:22