网络安全
firewalld防火墙
防火墙这个词连不懂技术的都知道,但懂技术的你们能说得出来防火墙到底有哪些功能吗?
: 包过滤, NAT, 包标记。
firwalld介绍
什么是firewalld?
: 我们前面都学习过了iptablesiptables是自2.4内核以来,linux自带的防火墙软件。但在centos7里,又出
现了一个叫firewalld的防火墙软件,它和iptables一样都是通过内核的netfilter来实现的。也就是说iptables
firewalld都是用于维护规则,只不过使用方式有所不同。在centos7iptables,firewalld都可以使用,但不
要用混乱了。
firewalldiptables的区别图
环境准备:
概念一: zone
1, 两台都先清空iptables规则,并停止iptables服务(Server端可以不用做这一步,直接做第2)
# iptables -F
# iptables -F -t nat
# iptables -F -t mangle
# iptables -F -t raw
# systemctl stop iptables
# systemctl disable iptables
2,Server端安装firewalld相关软件包,并启动服务
Server# yum install firewalld firewall-config
Server# systemctl restart firewalld
Server# systemctl enable firewalld
Zone 简单来说就是防火墙方案,就是一套规则集,你可以配置多套规则集,按需求切换使用
查看现在有哪些zone
# firewall-cmd --get-zones
work drop internal external trusted home dmz public block
drop:拒绝所有外部连接请求。
block:拒绝所有外部连接,允许内部发起的连接。
public:适用公共环境,拒绝所有外部连接请求,但指定外部连接可以进入。
external:特别适用路由器启用了伪装功能的外部网。拒绝所有外部连接请求,只能接收经过选择的连接。
dmz:用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过选择的连接。
(受限制的公共连接可以进入)。
work:适用于工作网络环境,概念和workgoup一样,也是指定的外部连接允许用于工作区。
home:类似家庭组,用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连
接。
internal:用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。仅仅接受经过选择的连接
trusted:可接受所有的网络连接。
# firewall-cmd --get-default-zone --查看当前使用的zone
public
# firewall-cmd --set-default-zone=work
# firewall-cmd --set-default-zone=public --修改当前使用的zone
概念二: port
常见服务端口回顾:
http: tcp/80
https: tcp/443
ftp: tcp/21 主动(tcp/20) 被动(指定随机端口范围)
dns: tcp/53(用于主从DNS传数据), udp/53(用于客户端向DNS服务器查询)
samba: tcp/139,tcp/445
邮件: smtp:tcp/25, pop3: 110, imap:143
mysql: tcp/3306
nfs: 111,2049,还有几个随机端口(需要固定后才能使用iptables控制)
rsync: tcp/873,tcp/22
yum: 本地(不受防火墙控制)http远程(与http一样), ftp远程(ftp一样)
......
概念三: service
实例: 一台vsftp服务器,允许客户端使用主动或被动方式访问,其它访问都拒绝
# firewall-cmd --list-all --查看当前使用的zone的规则
# firewall-cmd --zone=work --list-all --指定查看work这个zone的规则
注意:只要没有使用--zone=指定的,都代表默认zone
port 表示端口
# firewall-cmd --add-port=80/tcp --允许tcp80端口进来的通迅
# firewall-cmd --remove-port=80/tcp --删除上面的规则
# firewall-cmd --add-port=3000-3005/tcp --允许tcp3000-3005端口进来的通迅
# firewall-cmd --remove-port=3000-3005/tcp --删除上面的规则
service 表示服务
# firewall-cmd --add-service=http --允许http服务进来的通迅(不用管它是什么端口,只记住服务就好
)
# firewall-cmd --remove-service=http
# firewall-cmd --add-service=ftp --允许ftp服务进来的通迅(无论主动还是被动都可以,这样就把
iptables的写法简单化了)
# firewall-cmd --remove-service=ftp
iptables的做法
client -------------------------> server
192.168.72.128 192.168.72.129
服务器端准备:
# yum install vsftpd -y
# vim /etc/vsftpd/vsftpd.conf --直接在配置文件最后加上这两句就可以
pasv_min_port=3000
pasv_max_port=3005
# systemctl restart vsftpd
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
客户端测试方法:
1,命令连接测试,能成功连接上就表示命令端口连接没问题
# ftp 192.168.72.129(服务器的ip)
2,数据传输测试,用上面的命令登录成功后,在客户端使用passive指令转换你的主动和被动模式,
(服务器端不用转换,因为服务器端默认就是主动和被动都支持的)
然后使用ls指令能看到里面的pub子目录就表示数据传输OK了(因为默认是登录到服务器的/var/ftp/目录,里面有一
pub子目录)
主动模式:
   client server
n     m 21 20 端口:n,m代表不同的随机端口
----------------->
<-----------------
<-------------------------------------------
-------------------------------------------->
# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
# iptables -A INPUT -p tcp --dport 20 -j ACCEPT
被动模式:
   client server
n     m 21 3000:3005 端口:3000-3005与前面准备工作的配置一致
----------------->
<-----------------
-------------------------------------------->
问题: 把主动和被动的规则合到一起,怎么写?
小结:
1. firewalld控制效率高,控制不太精细。iptables相对复杂,但控制精细。
2. --add-service= 后接服务名(不是软件名:vsftp,nginx)
课后练习:
1. firewalld实现samba包过滤
2. firewalld实现nfs包过滤
概念四: rich-rule
<--------------------------------------------
# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
# iptables -A INPUT -p tcp --dport 3000:3005 -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 3000:3005 -j ACCEPT
# iptables -A INPUT -p tcp -m multiport --dport 20,21,3000:3005 -j ACCEPT
# iptables -A OUTPUT -p tcp -m multiport --sport 20,21,3000:3005 -j ACCEPT
firewalld的做法
client -------------------------> server
192.168.72.129
firewalld的做法非常简单,你可以不知道ftp使用的是什么端口,你也可以不用知道主动和被动是什么原理,只要记
得服务名叫ftp就行(注意是服务名,不是软件包vsftp)
# firewall-cmd --add-service=ftp
rich-rule 复杂规则
# firewall-cmd --add-rich-rule="rule family="ipv4" source address=192.168.72.128
service name="ssh" accept"
下面两条合起来实现允许所有人访问我的http,drop192.168.72.128的访问我的http的包
# firewall-cmd --add-service=http
# firewall-cmd --add-rich-rule="rule family="ipv4" source address=192.168.72.128
service name="http" drop"
下面这条表示允许192.168.72.128访问http,但每分钟内只允许两个连接(测试时可能有点不精确)
概念五: runtimepermanent
概念六: panic模式
概念七: 图形配置模式
实例: SNAT
# firewall-cmd --add-rich-rule="rule family="ipv4" source address=192.168.72.128
service name="http" limit value=2/m accept"
下面实现ssh的小控制:只允许192.168.72.128ssh连接,但1分钟只能连一个(测试时可能有点不精确)
# firewall-cmd --remove-service=ssh
# firewall-cmd --add-rich-rule="rule family="ipv4" source address=192.168.72.128
service name=ssh limit value=1/m accept"
需要更多了解,可以参考man firewalld.richlanguage
runtime模式规则立即生效,重启服务规则就没了
permanent模式 规则不立即生效,重启服务规则就生效了
上面加端口或加服务规则,是立即生效,但重启不生效(可以使用firewall-cmd --reload来装载保存的规则)
# firewall-cmd --permanent --add-service=ftp --加了一个--permanent参数后,立即不生效,需
reload后才能生效
实际写规则时,建议直接写(不加--permanent参数),所有规则写完,测试完成后,再使用# firewall-cmd --
runtime-to-permanent全部转成permanent规则
# firewall-cmd --panic-on
# firewall-cmd --panic-off
# firewall-config
参考文档: LARTC-zh_CN.GB2312.pdf 里的第五章节
当在一台linux机器上要访问一个目标ip时,回顾并记住linux网络的四步:
1,如果本机有目标ip,则会直接访问本地;如果本地没有目标ip,则看第2
2,用route -n查看路由,如果路由条目里包含了目标ip的网段,则数据包就会从对应路由条目后面的网卡出去
3,如果没有对应网段的路由条目,则全部都走网关
4,如果网关也没有,则报错:网络不可达
不做SNAT数据包走向分析过程:
SIP:192.168.100.128 DIP:192.168.72.129
通过网关到达路由器
SIP: 192.168.100.128 DIP:192.168.72.129
通过路由到达外网服务器,返回
SIP: 192.168.72.129 DIP:192.168.100.128
SNAT数据包走向分析过程:
SIP:192.168.100.128 DIP:192.168.72.129
通过网关到达路由器,做SNAT
SIP:192.168.72.128 DIP:192.168.72.129
通过路由到达外网服务器,返回
SIP192.168.72.129 DIP192.168.72.128
回到路由器后,会自动DNAT
SIP192.168.72.129 DIP192.168.100.128
三台虚拟机,两个网段来模拟(vmnet1网络模拟内网,vmnet2网络模拟公网)
内网用户 双网卡机器  外网服务器
(其实就是模拟一个路由器)
192.168.100.128 -------192.168.100.2   eth1 (vmnet1)
    网关指向
打开ip_forward
     192.168.72.128  eth0 (vmnet2)   192.168.72.129
iptables的做法回顾
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 192.168.72.128
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
实例: DNAT
DNAT数据包走向分析过程:
SIP: 192.168.72.129 DIP:192.168.72.128
到达路由器(堡垒机 ),做DNAT
SIP: 192.168.72.129 DIP: 192.168.100.128
通过路由,到达内网服务器,返回
SIP192.168.100.128 DIP192.168.72.129
通过网关,回到路由器,自动SNAT
SIP192.168.72.128 DIP192.168.72.129
实例: DNAT+DNPT
firewalld的做法
# firewall-cmd --add-masquerade 不用指从哪个网卡出了
# firewall-cmd --remove-masquerade 删除的写法
内网web服务器   双网卡机器 外网客户
(其实就是模拟一个路由器)
192.168.100.128 -------->192.168.100.2  eth1
    网关指向
打开ip_forward
     192.168.72.128 eth0   192.168.72.129
iptablesDNAT做法
# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.100.128
firewalldDNAT做法
# firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.100.128
隧道
问题: 一家公司假设有两个分部,深圳与北京。两个分部的员工在各自己的局域网办公,如果深圳的员工和北京的
员工要通过网络安全传输数据,怎么做?
答案:
1. 使用gpg2通过非对称加密和数字签名来实现(太麻烦了)
2. 使用SSL来实现(可以,但需要搭建VPN
3. 将两个分部的网络通过在公网建立虚链路来连接(可以,也就是网对网VPN
隧道介绍
什么是隧道(tunnel)?
: 是一种通迅协议。就是一种在物理网络上建立虚链路的方式。通俗点说,就像在公路上开辟了一条你的专
用车道,当然这是一条虚拟的车道,你可以看作就像是物理上有这么一条车道,走什么车你说了算。用隧道
的好处就是你可以对其加密,就可以变成专用的加密链路了(也就是VPN; 缺点就用隧道协议会造成传输数
据包的额外开销
内网web服务器(8000端口) 双网卡机器 外网客户
(其实就是模拟一个路由器)
192.168.100.128 -------->192.168.100.2  eth1
    网关指向
打开ip_forward
     192.168.72.129    eth0     192.168.72.129
iptables的做法
在中间的双网卡机器上做DNAT
# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination
192.168.100.128
在内网web服务器上做DNPT
# iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j REDIRECT --to 8000
firewalld的做法
# firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.100.128:toport=8000
参考文档: LARTC-zh_CN.GB2312.pdf 里的第五章节
实验:net-to-net 隧道通迅
实验准备:
问题:准备好上面四台机器后,不做隧道如何实现左右两边内网的通讯?
答案: 把深圳内网和北京内网互指网关就可以了。但实际环境中这样互指网关不太现实,所以通过建立虚链路,然
后在虚链路里走路由来实现。
   192.168.72.128192.168.72.129
      深圳外网   北京外网
   192.168.100.2   192.168.101.3
深圳内网机器    北京内网机器
192.168.100.6 192.168.101.5
网关指向192.168.100.2网关指向192.168.101.3
需要准备4台虚拟机,三个网段:
1,192.168.100.0/24深圳内网 vmnet1
2,192.168.72.0/24公网   vmnet2
3,192.168.101.0/24北京内网 vmnet8
当在一台linux机器上要访问一个目标ip时,回顾并记住linux网络的四步:
1,如果本机有目标ip,则会直接访问本地;如果本地没有目标ip,则看第2
2,用route -n查看路由,如果路由条目里包含了目标ip的网段,则数据包就会从对应路由条目后面的网卡出去
3,如果没有对应网段的路由条目,则全部都走网关
4,如果网关也没有,则报错:网络不可达
实验步骤:
1. 两台外网服务器上打开ip_forward,并装载ip_gre隧道模块
2. 两台外网服务器上增加隧道网卡,并启动网卡
3. 两台外网服务器上配置隧道IP使之通讯(打通隧道)
4. 两台外网服务器上指定走隧道的路由(让隧道两头的内网能通过隧道通讯)
5. 两边内网连通测试
补充:
1, 先在深圳和北京两台VPN服务器上打开ip_forword,并装载ip_gre隧道模块
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
szvpn# modprobe ip_gre --加载此隧道模块
szvpn# lsmod |grep gre --确认有此隧道模块
ip_gre         153410
bjvpn# modprobe ip_gre
bjvpn# lsmod |grep gre
ip_gre         153410
2, 两台VPN服务器上增加隧道网卡,并启动网卡
szvpn# ip tunnel add tun0 mode gre remote 192.168.72.129 local 192.168.72.128   --
加一个tun0接口,隧道模式为gre,由本端的192.168.72.128和对端的192.168.72.129这个物理连接上建立
szvpn# ip link set tun0 up --或者使用ifconfig tun0 up
bjvpn# ip tunnel add tun0 mode gre remote 192.168.72.128 local 192.168.72.129
bjvpn# ifconfig tun0 up
3, 两台外网服务器上配置隧道IP使之通讯(打通隧道)
szvpn# ip addr add 192.168.105.3 peer 192.168.105.4 dev tun0
--给本地的tun0授于IP192.168.105.3,对端为192.168.105.4;完成后ifconfig就能看到tun0IP(这两个
ip是用于tunnel的点对点连接用的,定义的ip只要满足能通迅,并且不和其它网卡路由冲突就行)
bjvpn# ip addr add 192.168.105.4 peer 192.168.105.3 dev tun0
4, 两台外网服务器上指定走隧道的路由(让隧道两头的内网能通过隧道通讯)
szvpn# ip route add 192.168.101.0/24 dev tun0 --或者使用route add -net
192.168.101.0/24 dev tun0
bjvpn# ip route add 192.168.100.0/24 dev tun0
5, 两头内网连接测试:
北京内网机器和深圳内网机器的两个内网IP可以互相ping通了,并且可以使用traceroute 命令接IP,查看确实走了
tunnel
思考:
测试完后,删除tunnel的方法 ip tunnel del tun0
如果做的实验有问题,可以用ip tunnel del tun0命令删除后,重新再做
上面架构做好后,深圳内网用户192.168.100.6ping不通192.168.72.129(北京vpn外网IP),但反过来(就是北京
vpn可以ping通深圳内网用户)却可以ping