防火墙(firewalld与iptables)

防火墙是整个数据包进入主机前的第一道关卡。防火墙主要通过Netfilter与TCPwrappers两个机制来管理的。 
1)Netfilter:数据包过滤机制 
2)TCP Wrappers:程序管理机制 
关于数据包过滤机制有两个软件:firewalld与iptables 
关于两者的不同介绍如下: 

这里写图片描述
2 iptables通过控制端口来控制服务,而firewalld则是通过控制协议来控制端口 
我们这里先对firewalld做实验。Iptables和firewalld只能开一个。 
在学习之前先对iptables firewalld 内核之间的关系有一个了解。 
这里写图片描述

(一) 
(1)firewalld

安装:
[root@route ~]# yum install firewalld
[root@route ~]# systemctl start firewalld
[root@route ~]# systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: active (running) since 日 2017-12-03 21:12:02 EST; 49s ago
 Main PID: 2362 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─2362 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

1203 21:12:02 route systemd[1]: Started firewalld - dynamic firewall daemon.
1203 21:12:45 route systemd[1]: Started firewalld - dynamic firewall daemon.
[root@route ~]# systemctl enable firewalld
[root@route ~]# firewall-cmd --state 
running    ##查看火墙状态
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

(2)firewalld的图形化管理:

root@route ~]# firewall-config &
  • 1
  • 2

这里写图片描述

其中左下角是软件管理的域,有以下几种: 
这里写图片描述

Configuration有临时设定(runtime)和永久(permanent)设定两种,临时设定reload后会恢复原状态,而永久不会。 
每个域后由管理的服务,端口等等: 
这里写图片描述 
这里注意,public为火墙默认的域。 
(3)firewall的命令行接口配置防火墙 
Firewalld-cmd是命令,firewalld-config是图形。 
查看活跃区域,默认区域,所有区域:

这里写图片描述

更改默认区域

这里写图片描述

测试:将默认区域改为publilc,测试:本来public只允许sshh和dhcpv6-client,现在我们用ftp测试。 
安装vsftpd和lftp,并开启: 
在ftp服务端: 
这里写图片描述

这里写图片描述 
在ftp客户端: 
这里写图片描述 
测试结果:ftp客户端访问被拒绝。 
注意:用firewall-cmd –list-all 显示的就是默认区域的接口(interfaces),源(sources),服务(services)端口(ports)伪装开关(masquerade)(转发接口)Forward-ports 。

列出服务: 
这里写图片描述

这里写图片描述
此时可以更改服务相关配置,服务的配置文件都是.xml结尾: 
这里写图片描述
‘ 
–将来源IP172.25.254.250设置为trust 
这里写图片描述

删除: 
这里写图片描述

–将eth0添加到trusted中,注意:得先将eth0从public中删除: 
这里写图片描述

这里写图片描述

–实验:下面时对接口做的工作,现在初始情况是:eth0与eth1处在public域中,现在假设eth0为外网开放接口,eth1为内网开放接口,现在将eth1加入trusted中,内部网络可以访问。 
先将eth1加入到trusted中: 
这里写图片描述

然后在trusted中加入http服务:

这里写图片描述

publlic域默认为ssh连接与dhcpv6-client所以eth0并不具有连网功能: 
eth0:172.25.254.136 
这里写图片描述
eth1:172.25.254.236,注意:现实生活中通常是两个不同的网段。 
这里写图片描述

—实验:我们可以将来源ip为172.25.254.79的所有包拒绝: 
这里写图片描述

此时未生效,需要加载,有两种方式: 
这里写图片描述

这里写图片描述
注意:若此时179主机通过ssh连接上了服务端,若用complete,则会中断现有连接,若使用–reload,则不会中断现有连接。

(4)firewalld的direct-rules

这里写图片描述


firewall-cmd –-direct –get-all-rules   ##列出规则
firewall-cmd –-direct –add-rule ipv4 filter INPUT 0 ! -s 172.25.254.79 -p tcp –dport 80 -j ACCEPT   ##添加规则
firewall-cmd –-direct –remove-rule ipv4 filter INPUT 0 ! -s 172.25.254.79 -p tcp –dport 80 -j ACCEPT   ##删除规则
  • 1
  • 2
  • 3
  • 4

比如:不让79主机访问80端口的请求响应: 
这里写图片描述

这里写图片描述

(5)端口转发与地址伪装:

在防火墙服务器上将伪装打开: 
这里写图片描述

当79端口登陆主机时,将79伪装 
这里写图片描述

当访问本机22端口时,将其转到236这个主机上: 
这里写图片描述

测试查看;用79主机ssh连接136主机: 
这里写图片描述

登陆的是236主机: 
这里写图片描述

查看登陆者,登陆者是136。79主机被伪装起来了 
这里写图片描述

(二)iptables 
首先得保持一个纯净的环境,将firewalld关闭。安装iptables 
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

(1)理论基础:当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或进行转发。

(2)iptables实现防火墙功能的原理是:在数据包经过内核的过程中有五处关键地方,分别是PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,称为钩子函数,iptables这款用户空间的软件可以在这5处地方写规则,对经过的数据包进行处理,规则一般的定义为“如果数据包头符合这样的条件,就这样处理数据包”。 
iptables中定义有表,分别表示提供的功能,有filter表(实现包过滤)、nat表(实现网络地址转换)、mangle表(实现包修改)、raw表(实现数据跟踪),这些表具有一定的优先级:raw–>mangle–>nat–>filter 
下面是数据包流向图: 
这里写图片描述
数据包先经过PREOUTING,由该链确定数据包的走向:

1 目的地址是本地,则发送到INPUT,让INPUT决定是否接收下来送到用户空间,流程为①--->②;

2 若满足PREROUTING的nat表上的转发规则,则发送给FORWARD,然后再经过POSTROUTING发送出去,流程为: ①--->③--->④--->⑥
3 主机发送数据包时,流程则是⑤--->⑥
  • 1
  • 2
  • 3
  • 4
  • 5

(3)iptables的规则书写:

基本语法:iptables [-t 表] [操作命令] [][规则匹配器][-j 目标动作]
  • 1

iptables 
[-t filter] 
[-AI INPUT,OUTPUT,FORWARD] 
[-io interface] 
[-p tcp,udp.icmp,all] 
[-s ip/nerwork] 
[–sport ports] 
[-d ip/network] 
[–dport ports] 
[-j ACCEPT DROP REJECT REDIRECT MASQUERADE LOG 
DNAT SNAT MIRROR QUEUE RETURN MARK]

常用操作命令: 
-A 在指定链尾部添加规则 
-D 删除匹配的规则 
-R 替换匹配的规则 
-I 在指定位置插入规则

例:iptables -I INPUT 1 –dport 80 -j ACCEPT

(将规则插入到filter表INPUT链中的第一位上) 
-L/S 列出指定链或所有链的规则 
-F 删除指定链或所有链的规则 
-N 创建用户自定义链

例:iptables -N allowed 
-X 删除指定的用户自定义链 
-P 为指定链设置默认规则策略,对自定义链不起作用

例:iptables -P OUTPUT DROP 
-Z 将指定链或所有链的计数器清零 
-E 更改自定义链的名称

例:iptables -E allowed disallowed 
-n ip地址和端口号以数字方式显示

例:iptables -Ln 
常见规则匹配器 说明 
-p tcp|udp|icmp|all 匹配协议,all会匹配所有协议 
-s addr[/mask] 匹配源地址 
-d addr[/mask] 匹配目标地址 
–sport port1[:port2] 匹配源端口(可指定连续的端口) 
–dport port1[:port2] 匹配目的端口(可指定连续的端口) 
-o interface

匹配出口网卡,只适用FORWARD、POSTROUTING、OUTPUT。

例:iptables -A FORWARD -o eth0 
-i interface

匹配入口网卡,只使用PREROUTING、INPUT、FORWARD。 
–icmp-type 匹配icmp类型(使用iptables -p icmp -h可查看可用的ICMP类型) 
–tcp-flags mask comp

匹配TCP标记,mask表示检查范围,comp表示匹配mask中的哪些标记。

例:iptables -A FORWARD -p tcp –tcp-flags ALL SYN,ACK -j ACCEPT

(表示匹配SYN和ACK标记的数据包) 
目标动作 说明 
ACCEPT 允许数据包通过 
DROP 丢弃数据包 
REJECT 丢弃数据包,并且将拒绝信息发送给发送方 
SNAT

源地址转换(在nat表上)

例:iptables -t nat -A POSTROUTING -d 192.168.0.102 -j SNAT –to 192.168.0.1 
DNAT

目标地址转换(在nat表上)

例:iptables -t nat -A PREROUTING -d 202.202.202.2 -j DNAT –to-destination 192.168.0.102 
REDIRECT

目标端口转换(在nat表上)

例:iptables -t nat -D PREROUTING -p tcp –dport 8080 -i eth2.2 -j REDIRECT –to 80 
MARK

将数据包打上标记

例:iptables -t mangle -A PREROUTING -s 192.168.1.3 -j MARK –set-mark 60

实验: 
1)显示filter表所有链的规则,默认为filter表这里写图片描述
如上,可以看到filter三条链 
2)查看net表的 
这里写图片描述

3)注意一点:火墙设置的策略好坏会影响到传输速率的快慢,因为火墙规则读取是有先后顺序的。

(4)NAT 
Net Address Trancelate:网络地址转换 
SNAT(源地址转换)是指在数据包从网卡发送出去的时候,把数据包中的源地址部分替换为指定的IP,这样,接收方就认为数据包的来源是被替换的那个IP的主机 
DNAT(目标地址转换),就是指数据包从网卡发送出去的时候,修改数据包中的目的IP,表现为如果你想访问A,可是因为网关做了DNAT,把所有访问A的数据包的目的IP全部修改为B,那么,你实际上访问的是B 
下面我们来模拟以下两个转换: 
1)SNAT: 
实验准备: 
双网卡主机: 
这里写图片描述
单网卡主机: 
IP: 
这里写图片描述

GATEWAY: 
这里写图片描述
注意:这里双网卡主机类似于路由器的功能。所以单网卡主机的网关必须是和本机ip处于同一网段而且是和双网卡主机上的一块网卡IP相同。

接下来我们在单网卡主机上ping网关,检查实验环境:

这里写图片描述

说明双网卡主机网卡来良好。

在进行SNAT之前我们的单网卡主机是不能连接不同网段的172.25.79.250这台主机的 。

我们要用单网卡主机来连不同网段的主机,必须要做SNAT。在双网卡主机上做防火墙规则书写:

iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 172.25.79.136
  • 1

查看火墙规则:

这里写图片描述
这时还有个net表的ip转发功能未开启,将其开启:

[root@route ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0
  • 1
  • 2
[root@route ~]# vim /etc/sysctl.conf 
  • 1

这里写图片描述

[root@route ~]# sysctl -p
net.ipv4.ip_forward = 1
  • 1
  • 2

此时在单网卡主机ping不同网段的主机,发现可以:

这里写图片描述

SNAT:局域网共享一个公网IP接入lnternel, 
好处如下: 
1、保护内网用户安全,因为公网地址总有一些人恶意扫描,而内网地址在公网没有路由所以无法被扫描,能被扫描的只有防火墙这一台,这样就减少了被攻击的可能。 
2、Ipv4地址匮乏,很多公司只有一个ipv4地址,但是却有几百个用户需要上网,这个时候就需要使用SNAT。 
3、省钱,公网地址付费,使用SNAT只需要一个公网ip就可以满足几百人同时上网。

DNAT : 
我们在双网卡主机(route)上书写规则: 
这里写图片描述
从eth1接口经来的数据包我们将其目标地址转为172.25.254.11这台主机上

我们在172.25.254.79主机上测试: 
用ssh连接172.25.254.136: 
这里写图片描述

但是却是登陆的172.25.254.11这台主机: 
这里写图片描述
实现了目的地转换。

DNAT的用途: 
DNAT:向internel发布内网服务器 
在内网中有服务器,如果想让公网用户访问有有两种方法。 
1  配置双网卡,一网卡对内,一网卡对外;一般是高访问量的web服务器,为了避免占用网关的流量才这样做,使用不是很广泛。 
2  内网web服务器,或是ftp服务器,为了用户在公网也可以访问,有不想买公网ip地址,采用DNAT方案。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40658000/article/details/78708375

猜你喜欢

转载自blog.csdn.net/shmily_lsl/article/details/80738842