文章目录

  • 一、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表即可。

centos配置iptables限制访问速度和连接数量_iptables

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模式

centos配置iptables限制访问速度和连接数量_tepwrapper_02


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主机上

centos配置iptables限制访问速度和连接数量_tepwrapper_03

#我们在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主机

centos配置iptables限制访问速度和连接数量_IP_04


tset3主机

centos配置iptables限制访问速度和连接数量_firewalld_05

#我们再次回到test1,在test1的允许文件里加入test2主机的ip
[root@xiaobai-test1] vim /etc/hosts.allow   #允许访问的文件
sshd:192.168.202.131

centos配置iptables限制访问速度和连接数量_iptables_06

#我们到test2主机上
[root@xiaobai-test2] ssh xiaobai-test1 
[root@xiaobai-test1] exit
logout
Connection to xiaobai-test1 closed.
[root@xiaobai-test2]

centos配置iptables限制访问速度和连接数量_iptables_07