文章目录
- 一、IPtables
- 1、IPtables简介
- 2、四表五链
- 3、安装操作IPtables
- 3.1、IPtables的配置
- 3.2、IPtables的语句格式
- 3.2.1、协议匹配
- 3.2.2、端口匹配
- 3.2.3、修改规则及禁止ping
- 3.3、IPtables拓展操作
- 4、IPtables网络地址转换 NAT模式
- 5、企业级防火墙配置
- 二、Firewalld
- 1、Firewalld简介
- 2、Firewalld相关命令
- 3、Firewalld配置使用
- 三、TCPwrapper访问控制工具
- 1、什么是TCPwrapper
- 2、TCPwrapper的应用
- 2.1、ssh的管理与攻防基于TCPwrapper
一、IPtables
1、IPtables简介
IPtables并不是真正的防火墙,我们可以把他理解为一个客户端的代理,用户是通过iptables这个代理,将用户的安全设定执行到对应的“安全框架”中,这个“安全框架”才是真正的防火墙。这个框架叫做“netfilter”。用户和内核交互的一个工具就是iptables。
- netfilter:内核空间,是真正实现防火墙的功能。
- iptables:用户空间,在/sbin/iptables存在的防火墙,通过iptables提供管理,修改,删除或者插入规则
默认情况下,iptables根据功能和表的定义划分包含三个表,filter,nat,mangle。每个表又包含不同的操作链(chains )。 实际iptables包含四张表和五个链,主要记住filter表即可。
2、四表五链
四表 | 作用 |
raw (用处少) | 追踪数据包 |
mangle | 给数据包打标记 |
nat | 网络地址装换(来源与目标的ip地址和port端口的转换) |
filter | 过滤数据,使用最多的表 |
四表应用顺序:raw>mangle>nat>filter
五链(必须大写) | 作用 |
PREROUTING | 进路由之前数据包 |
INPUT | 过滤进来的数据包(输入) |
FORWARD | 转发 |
OUTPUT | 发出去的数据包 |
POSTROUTING | 路由之后数据包 |
入站:比如访问自身的web服务流量。先PREROUTING(是否改地址),再INPUT(是否允许)到达程序。
转发:经过linux网关的流量.先PREROUTING(是否改地址),然后路由。转发给FORWARD(转发或者丢弃),最后经过POSTROUTING(看看改不改地址。)
出站:源自linux自身的流量,先OUTPUT,再给POSTROUTING(是否改IP)。
3、安装操作IPtables
Centos5/6中自带有IPtables
Centos7中防火墙变成了firewalld
#我用的是Centos7版本的服务器关闭防火墙,Centos7中默认是firewalld
systemctl stop firewalld
systemctl disable firewalld
#安装IPtable防火墙
yum -y install iptables iptables-services
systemctl start iptables
iptables -V
#iptables v1.4.21
#Centos5/6中启动命令
/etc/init.d/iptables start
以下是iptables的一些参数
-L:列出一个链或所有链中的规则信息
-n:以数字形式显示地址、端口等信息
-v:以更详细的方式显示规则信息
–line-numbers:查看规则时,显示规则的序号(方便之处,通过需要删除规则-D INPUT 1
-F:清空所有的规则(-X是清理自定义的链,用的少;-Z清零规则序号)
-D:删除链内指定序号(或内容)的一条规则
-P:为指定的链设置默认规则
-A:在链的末尾追加一条规则
-I:在链的开头(或指定序号)插入一条规则
-t:指定表名
–help查看更多
3.1、IPtables的配置
#IPtables配置文件
/etc/sysconfig/iptables-config
/etc/sysconfig/iptables #记录规则文件
#不写-t 默认使用filter表,指定表名查看规则
IPtables -t nat -L
#默认查看规则
iptables -L
#以数字的形式显示ip和端口与协议
iptables -nL
#显示规则行号
iptables -nL --line
#清空规则:
iptables -F
#清空单独的某一个链里面的规则
iptables -F 链名
#清空单独的某一个表里的,某一个链里面的规则
iptables -t nat -F INPUT
#保存规则:
service iptables save
iptables-save > /etc/sysconfig/iptables
3.2、IPtables的语句格式
iptables -t 表名 动作 [链名] [-p 匹配条件] [-j 控制类型]
-j:控制类型, 通过前面匹配到之后是丢弃还是保留数据包的处理方式:
ACCEPT允许,
REJECT拒绝,
DROP丢弃。 不会给用户返回任何的拒绝消息,不推荐使用。
LOG写日志(log不适用匹配,只是记录一下)
动作:添规则还是删除规则
-p:匹配条件:数据包特征ip,端口等
如果不写-t 默认使用filter表
动作
修改默认规则: -P (大p)
删除规则:-D
修改规则:-R
追加规则: -A 默认追加到链的末尾
插入规则:-I 在链的开头(或指定序号)插入一条规则
iptables -t filter -A INPUT -p tcp -j ACCEPT #filter表INPUT链最后一条添加允许tcp协议访问。
iptables -I INPUT -p udp -j ACCEPT #filter表INPUT链第一行添加允许udp协议访问。
iptables -I INPUT 4 -p icmp -j ACCEPT #插入到第4行
iptables -L #查看规则
iptables -D INPUT 3 #删除第三行
iptables -F #清空所有规则
service iptables save #保存规则
systemctl restart iptables #重启服务
#IPtables规则匹配,如果匹配到则不向下继续匹配。
#否则将一直向下匹配,直到匹配上。
#如果都不匹配,则用默认规则。
注意:如果不保存重启之后规则就不在了。
3.2.1、协议匹配
协议:-p(小p)
tcp #用的最多
udp
icmp #ping的时候用的协议
#使用协议的时候可以不指定端口,使用端口的时候必须指定协议。
案例:
#禁止自己被ping,在filter表的INPUT链插入一个丢弃icmp的规则。
iptables -F
iptables -A INPUT -p icmp -j REJECT #拒绝所有主机通过icmp协议ping
**加-s可以指定某一个ip,也可以指定多个,中间用逗号隔开。**
验证:
ping 192.168.91.136
#PING 192.168.91.136 (192.168.91.136) 56(84) bytes of data.
#From 192.168.91.136 icmp_seq=1 Destination Port Unreachable
#IPtables机器ip为192.168.91.136
3.2.2、端口匹配
端口:
sport #源端口
dport #目标端口
案例:
#拒绝192.168.91.135这台机器通过ssh连接到这台服务器
iptables -I INPUT -s 192.168.91.135 -p tcp --dport 22 -j REJECT
验证:
ssh 192.168.91.136 #在192.168.91.135机器上操作
#ssh: connect to host 192.168.91.136 port 22: Connection refused
案列:
#端口的范围: 拒绝192.168.91.135这台机器通过22端口到80端口的访问,包括22和80端口在内
iptables -I INPUT -s 192.168.246.201 -p tcp --dport 22:80 -j REJECT
验证:
curl -I http://192.168.91.136
#curl: (7) Failed connect to 192.168.91.136:80; Connection refused
ssh root@192.168.91.136
#ssh: connect to host 192.168.91.136 port 22: Connection refused
注意:不加-s就是所有主机
iptables -I INPUT -s 192.168.91.0/24 -j REJECT
#限制源为192.168.91网段的数据包
3.2.3、修改规则及禁止ping
#修改规则
iptables -F
iptables -I INPUT -s 192.168.91.135 -p tcp --dport 22:80 -j REJECT
iptables -nL
#REJECT tcp -- 192.168.91.135 0.0.0.0/0 tcp dpts:22:80 reject-with icmp-port-u
iptables -R INPUT 1 -p tcp --dport 22 -s 192.168.91.135 -j ACCEPT #INPUT后面的1是修改第一条规则
iptables -L
#ACCEPT tcp -- 192.168.91.135 anywhere tcp dpt:ssh
#在192.168.91.136机器上ssh也可以登录
禁止ping策略原则:
#iptables服务器是ping命令发起者或是接受者
-i --in-interface:在INPUT链配置规则中,指定从哪一个网卡接口进入的流量(只能配置在INPUT链上)
-o --out-interface:在OUTPUT链配置规则中,指定从哪一个网卡接口出去的流量(只能配置在OUTPUT链上)
icmp的类型:
0: Echo Reply——回显应答(Ping应答)ping的结果返回。
8: Echo request——回显请求(Ping请求),发出去的请求。
#iptables服务器:ping 别的机器
#自己不能ping别人,但是别人可以ping自己:
192.168.91.136机器
iptables -I OUTPUT -o ens33 -p icmp --icmp-type 8 -j REJECT #ping发出的请求禁止掉了
验证:
ping 192.168.91.135 #将ping请求给禁止掉了。
PING 192.168.91.135 (192.168.91.135) 56(84) bytes of data.
ping: sendmsg: Operation not permitted
#换到192.168.91.135机器
ping 192.168.91.136 #可以ping通
PING 192.168.91.136 (192.168.91.136) 56(84) bytes of data.
64 bytes from 192.168.246.200: icmp_seq=1 ttl=64 time=0.280 ms
#本机可以ping其他机器。其他机器不能ping通本机
iptables -I OUTPUT -o ens33 -p icmp --icmp-type 8 -j ACCEPT #允许自己ping别人
iptables -A INPUT -i ens33 -p icmp --icmp-type 8 -j DROP #将进来的ping请求给丢弃了
iptables -I OUTPUT -o ens33 -p icmp --icmp-type 0 -j REJECT #也可以这样,不给回应icmp包
#192.168.91.136机器
ping 192.168.91.135
PING 192.168.91.135 (192.168.91.135) 56(84) bytes of data.
64 bytes from 192.168.91.135: icmp_seq=1 ttl=64 time=0.491 ms
#192.168.91.135机器
ping 192.168.91.136
PING 192.168.91.136 (192.168.91.136) 56(84) bytes of data.
iptables -A INPUT -p icmp -j DROP #拒绝任何ping协议
3.3、IPtables拓展操作
拓展
iptables -m iprange --help
#1.指定ip范围:
语法:
#-m iprange --src-range
iptables -I INPUT -p tcp --dport 80 -m iprange --src-range 192.168.91.100-192.168.135 -j REJECT
#2.指定多端口范围:一次拒绝多个指定端口
语法:
#-m multiport --sports #源端口
#-m multiport --dports #目的端口
iptables -A INPUT -p tcp -m multiport --dports 22,80 -s 192.168.91.135 -j REJECT
验证:在192.168.91.135机器上
ssh root@192.168.91.136 #不通
#ssh: connect to host 192.168.91.136 port 22: Connection refused
#3.MAC地址匹配
#拒绝MAC地址的匹配:只能匹配源MAC地址
语法:
#-m mac --mac-source
iptables -I INPUT -p icmp -m mac --mac-source 0:0c:29:cd:26:77 -j REJECT #拒绝指定的MAC地址服务通过icmp协议请求到本地
iptables -I INPUT -m mac --mac-source 00:0C:29:64:E3:8D -j REJECT #将指定的MAC地址服务请求全部禁止了
网卡接口:
iptables -I INPUT -i ens33 -j DROP #谁也连不上。
删除:
iptables -D INPUT 3 #通过查看行号,指定行号删除。
保存:
iptables-save > /etc/sysconfig/iptables #方法一
service iptables save #方法二
4、IPtables网络地址转换 NAT模式
1.SNAT:把内网地址转换成公网地址(源地址转换)
一个数据包在经过路由之后(或者说在通过防火墙的过滤之后)才被知道他的源IP是谁,在路由之前只能看到目标IP,如果我看不到你的源IP,那怎么匹配想过滤的数据包并进行源地址转换?
防火墙根本就不能确定你是否是符合匹配条件的IP,所以只能使用POSTROUTING
2.DNAT:要把公网ip换到内网IP 公网ip只有一个,内网ip有多个。(目标地址转换)
如果我不在路由之前就把目标地址转换完成,很显然当数据包到达入口IP之后,他的目的已经达到了,因为他本来的目标IP就是防火墙的对外公网IP,那么数据包还会往里面走吗?
显然不可能了,所以只能使用PREROUTING
企业常用案例功能小结:
1)linux主机防火墙,单机作为防火墙(表filter)。
2)局域网共享上网(表nat postrouting)。
3)外部地址映射为内部地址和端口(表nat prerouting)。
5、企业级防火墙配置
iptables -F
修改默认规则为拒绝(修改前先放行22端口,保证自己能够连上主机)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #放开22号端口
iptables -P INPUT DROP #将默认所有进来的请求设置为全部拒绝掉
、iptables -P FORWARD DROP #将默认所有的转发的规则设置为全部拒绝掉
#注意:修改默认规则: 只能使用ACCEPT和DROP
#iptables -P INPUT ACCEPT 允许
#iptables -P INPUT DROP 拒绝
service iptables save #保存规则
#iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
#或者用下面的方式保存
iptables-save > /etc/sysconfig/iptables
二、Firewalld
1、Firewalld简介
rhel 7:firewall-cmd工具,firewalld服务
Firewalld将网卡对应到不同的区域(zone),通过不同的zone定义了不同的安全等级。
trusted:允许所有流量通过
home/internal:仅允许ssh数据通过
work:仅允许ssh,ipp-client,dhcpv6-client数据通过
public:默认区域,仅允许ssh,dhcpv6-client数据通过
external:仅允许ssh数据通过,通过该区域的数据将会伪装(SNAT/DNAT)
dmz:仅允许ssh数据通过
block:任何传入的网络数据包都将被阻止。拒绝所有流量
drop:拒绝所有流量,没有返回回应消息
2、Firewalld相关命令
#命令相关配置
firewall -cmd --permanent
--permanent #永久生效的配置参数、资源、端口以及服务等信息
1、域zone相关的命令
--get-default-zone #查询默认的区域名称
--set-default-zone=<区域名称> #设置默认的区域
--get-active-zones #显示当前正在使用的区域与网卡名称
--get-zones #显示总共可用的区域
2、services管理的命令
--add-service=<服务名> --zone=<区域> #设置指定区域允许该服务的流量
--remove-service=<服务名> --zone=<区域> #设置指定区域不再允许该服务的流量
3、Port相关命令
--add-port=<端口号/协议> --zone=<区域> #设置指定区域允许该端口的流量
--remove-port=<端口号/协议> --zone=<区域> #设置指定区域不再允许该端口的流量
4、查看所有规则的命令
--list-all --zone=<区域> #显示指定区域的网卡配置参数、资源、端口以及服务等信息
--reload #让“永久生效”的配置规则立即生效,并覆盖当前的配置规则
3、Firewalld配置使用
查看192.168.91.136机器上firewalld默认区域:
firewall-cmd --get-default-zone
#public 默认区域,仅允许ssh,dhcpv6-client数据通过
验证:
#到192.168.91.135机器
curl -I http://192.168.91.136
#curl: (7) Failed connect to 192.168.91.136:80; No route to host
ssh 192.168.91.136
#root@192.168.91.136's password:
更改默认区域
firewall-cmd --set-default-zone=trusted
#success
firewall-cmd --reload
#success
firewall-cmd --get-default-zone
#trusted 默认区域改为了trusted
firewall-cmd --set-default-zone=public
#success
firewall-cmd --reload
#success 默认区域改回了public
向public区域添加服务
firewall-cmd --permanent --add-service=http --zone=public
#success
firewall-cmd --reload
#success
验证:
#在192.168.91.136机器上下载http服务并启动
#在192.168.91.135机器上测试
curl -I http://192.168.91.136
#HTTP/1.1 403 Forbidden
#Date: Sat, 25 Jul 2020 09:01:56 GMT
#Server: Apache/2.4.6 (CentOS)
#Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
#ETag: "1321-5058a1e728280"
#Accept-Ranges: bytes
#Content-Length: 4897
#Content-Type: text/html; charset=UTF-8
drop区域
192.168.91.136机器
firewall-cmd --permanent --add-source=192.168.91.135/24 --zone=drop
#success
firewall-cmd --reload
#success
添加成功到192.168.91.135机器上再次访问
curl -I http://192.168.91.136
#会卡在这里没有回显,访问不通
回到192.168.91.136机器
firewall-cmd --permanent --remove-source=192.168.91.135/24 --zone=drop
#success
firewall-cmd --reload
#success
把192.168.91.135移除drop区域后再次测试
curl -I http://192.168.91.136
#HTTP/1.1 403 Forbidden
#Date: Sat, 25 Jul 2020 09:10:20 GMT
#Server: Apache/2.4.6 (CentOS)
#Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
#ETag: "1321-5058a1e728280"
#Accept-Ranges: bytes
#Content-Length: 4897
#Content-Type: text/html; charset=UTF-8
向192.168.91.136防火墙的public区域以端口方式添加服务
firewall-cmd --permanent --add-port=80/tcp --zone=public
#success
firewall-cmd --permanent --remove-service=http --zone=public
#success 将之前添加的http服务删掉
firewall-cmd --reload
#success
到192.168.91.135机器上访问
curl -I http://192.168.91.136
#HTTP/1.1 403 Forbidden
#Date: Sat, 25 Jul 2020 09:16:03 GMT
#Server: Apache/2.4.6 (CentOS)
#Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
#ETag: "1321-5058a1e728280"
#Accept-Ranges: bytes
#Content-Length: 4897
#Content-Type: text/html; charset=UTF-8
到192.168.91.136机器上把端口匹配也删掉
firewall-cmd --permanent --remove-port=80/tcp --zone=public
#success
firewall-cmd --reload
#success
到192.168.91.135机器上测试
curl -I http://192.168.91.136
#curl: (7) Failed connect to 192.168.91.136:80; No route to host 访问失败
三、TCPwrapper访问控制工具
1、什么是TCPwrapper
- TCPwrapper是一种访问控制工具是操作系统自带的,类似于防火墙(iptables)可以用作访问控制。
- 针对系统进程来做限制的
TCPwrapper有两个配置文件(文件中写入ip或网段)
1./etc/hosts.allow
允许访问的文件(优先)
2./etc/hosts.deny
拒绝访问的文件
TCPwrappers会先查找/etc/hosts.allow
,再查找/etc/hosts.deny
,如果两个配置中有冲突,先匹配中的优先,也就是/etc/hosts.allow
中的配置优先,如果两个配置都没命中,默认放行。TCPwrapper作用范围
TCPwarpper要看该应用是否依赖libwrap.so这个库文件(系统默认自带)。例如tcpwrapper可以控制ssh服务,因为实现ssh协议的sshd程序依赖了libwarp.so库文件。
2、TCPwrapper的应用
准备三台机器关闭防火墙和SELinux,并做解析
192.168.202.130 xiaobai-test1
192.168.202.131 xiaobai-test2
192.168.202.132 xiaobai-test3
确定ssh服务处于开启状态(系统默认开机自启)
#查看某一个程序是否支持tcpwrapper
[root@xiaobai-test1] ldd `which sshd` | grep wrap #查看ssh是否能被tcpwrapper控制
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fcef3b5b000)
[root@xiaobai-test1] ldd `which httpd` | grep wrap #查看http是否支持tcpwrapper
/usr/bin/which: no httpd in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
ldd: missing file arguments
Try `ldd --help' for more information.
#没过滤出来说明不能被tcpwrapper控制
2.1、ssh的管理与攻防基于TCPwrapper
上面三台机器解析已经配置好了,我们还需要一个远程连接工具FinalShell,并以ssh连接
#在test2上测试能否连接test1
[root@xiaobai-test2] ssh xiaobai-test1
[root@xiaobai-test1] exit #退出
logout
Connection to xiaobai-test1 closed.
[root@xiaobai-test2] #退出后我们又回到了test2主机上
#我们在test1主机上修改配置文件
[root@xiaobai-test1] vim /etc/hosts.deny #拒绝访问的文件
sshd:192.168.202.131 #在最后一行写入test2主机的ip
#我们来到test2主机上再次尝试用ssh服务连接
[root@xiaobai-test2] ssh xiaobai-test1
ssh_exchange_identification: read: Connection reset by peer
#我们的访问连接被拒绝了,那我们到test3主机上试试连接
[root@xiaobai-test3] ssh xiaobai-test1
[root@xiaobai-test1] exit
logout
Connection to xiaobai-test1 closed.
[root@xiaobai-test3]
test2主机
tset3主机
#我们再次回到test1,在test1的允许文件里加入test2主机的ip
[root@xiaobai-test1] vim /etc/hosts.allow #允许访问的文件
sshd:192.168.202.131
#我们到test2主机上
[root@xiaobai-test2] ssh xiaobai-test1
[root@xiaobai-test1] exit
logout
Connection to xiaobai-test1 closed.
[root@xiaobai-test2]