2018-07-31 linux防火墙 2

1、 保存防火墙规则

使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限,也就是关机重启后规则就会消失,保存方法如下

centos 7中的操作
iptables -A INPUT -s 172.18.21.106 -p tcp -m multiport --dports 80,22,21 -j REJECT   ---设置一条防火墙规则
iptables -vnL
iptables-save > /app/iptablerules   ---将规则保存到文件中
iptables -F   ---清空防火墙规则
iptables -vnL 
iptables-restore < iptablerules  ---重新载入预存规则文件中规则,-n, --noflush:不清除原有规则 -t, --test:仅分析生成规则集,但不提交
iptables -vnL
centos6中的操作
iptables -A INPUT -s 172.18.21.107 -p tcp -m multiport --dports 80,22,21 -j REJECT  ---设置规则
iptables -vnL
service iptables save
cat /etc/sysconfig/iptables   ---执行上面命令的时候实际上是将规则保存到此文件中
iptables -F 
iptables -vnL
service iptables restart   ---重启服务就可以了
iptables -vnL

开机自动重载规则文件中的规则:
(1) 用脚本保存各iptables命令,脚本中有很多iptables命令定义的规则;让此脚本开机后自动运行
/etc/rc.d/rc.local文件中添加脚本路径
/PATH/TO/SOME_SCRIPT_FILE
(2) 用规则文件保存各规则,开机时自动载入此规则文件中的规则
/etc/rc.d/rc.local文件添加
iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
(3)自定义Unit File,进行iptables-restore
(4)cenots7中/etc/rc.d/rc.local别忘记加执行权限

2、网络防火墙

iptables/netfilter网络防火墙:保护某一个网段的局域网的所有主机,而不是只保护本机的一台主机。
(1) 充当网关
(2) 使用filter表的FORWARD链
注意的问题:
(1) 请求-响应报文均会经由FORWARD链,要注意规则的方向性
(2) 如果要启用conntrack机制,建议将双方向的状态为ESTABLISHED的报文直接放行
示例:如何实现下图的要求


2018-07-31 linux防火墙 2_第1张图片
image.png
在a上的操作
ip route add default via 192.168.74.21  在a上只有一个网卡,并将网关指向b的内网ip
在c上的操作
ip route add default via 172.18.21.107 在c上同一只有一个网卡,并将网关指向b的外网ip
在b上操作
echo 1 > /proc/sys/net/ipv4/ip_forward   ---启动路由功能
此时在a上测试
ping 172.18.21.7  ---发现可以ping通
在c上也可以ping通a
ping 192.168.74.100
在b上设置防火墙规则
iptables -A FORWARD -s 192.168.74.0/24 -d 172.18.0.0/16 -p icmp --icmp-type 8 -j ACCEPT ---来自内网的icmp请求包是允许的
iptables -A FORWARD -s 172.18.0.0/16 -d 192.168.74.0/24 -p icmp --icmp-type 0 -j ACCEPT  ---来自外网的icmp回应包是允许的 
iptables -A FORWARD -j REJECT  ---其他都是拒绝的
在a上和c上互相ping对方进行测试
在b上也可以用状态的方式定义防火墙规则
iptables -A  FORWARD  -s 192.168.74.0/24 -d 172.18.0.0/16 -p icmp -m state --state NEW -j ACCEPT ---表示从内网到外网新的icmp请求是允许的
iptables -A FORWARD  -m state --state ESTABLISHED -j ACCEPT ---已经建立的双方向的连接也是被允许的,这样建立icmp连接请求后,从外网回来的包也是被允许的 
iptables -A FORWARD -j REJECT

在b上如何设置能够实现内网可以访问外部网络的httpd、ssh、ftp服务,而外部网络不可以访问内部网络

iptables -A FORWARD -s 192.168.74.0/24 -p tcp -m multiport --dports 80,22,21 -j ACCEPT  
modprobe nf_conntrack_ftp   ---加载这个模块
iptables -  A FORWARD  -m state --state ESTABLISHED,RELATED -j ACCEPT  --表示已经建立连接的和相关的请求都是被允许的,ftp的数据端口和命令端口是相关联的
iptables -A FORWARD -j REJECT

总结:icmp的请求包为NEW的连接,回应包属于已经建立的连接,并不是一来一回才算NEW连接,只要请求包能发出去说明已经建立新的连接了,回来的包就属于ESTABLISHED状态。
一个路由表里只能指向一个网关的ip地址,路由器可以充当网关,提供转发功能

3、NAT

  • NAT: network address translation
    NAT表中包含的链:PREROUTING,INPUT,OUTPUT,POSTROUTING
    请求报文:修改源/目标IP,由定义如何修改
    响应报文:修改源/目标IP,根据跟踪机制自动实现
    本地网络中的主机一般使用的是私有地址,外部网络使用的是公有地址,私有地址和公有地址是不可以互相通讯的,为了实现通讯,可以将本地网络的主机ip转化为公有地址的外网ip
    SNAT:source NAT POSTROUTING, INPUT
    让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装
    请求报文:修改源IP
    DNAT:destination NAT PREROUTING, OUTPUT
    把本地网络中的主机上的某服务开放给外部网络访问(发布服务和端口映射),但隐藏真实IP
    请求报文:修改目标IP
    PNAT: port nat,端口和IP都进行修改
    SNAT是修改POSTROUTING链
    DNAT修改的是PREROUTING链


    2018-07-31 linux防火墙 2_第2张图片
    image.png
  • 实现SNAT
在a上操作
ip  route add default via 192.168.74.21
在c上的操作
ip route del default via 172.18.21.107   
在b上的操做
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING  -s 192.168.74.0/24 -j SNAT --to-source 172.18.21.107   ---把本地主机的这个网段的私有地址转化为172.18.21.107这个公网地址,这样就可以访问c了
测试
在a上的操作
ping 172.18.21.7
在c上抓包
tcpdump -i ens38 -nn icmp  --可以看到地址是来自172.18.21.107的而不是来自己a,说明根据ip地址判断用户是不准确的,可能通过nat地址转换过了
  • MASQUERADE:动态IP,如拨号网络
    如果NAT和外网连接是拨号网络,那么和外网连接的网卡的公网ip地址是不固定的,可以修改上面的命令实现伪装,转化为任意的公网ip地址
iptables -t nat -R POSTROUTING 1 -s 192.168.74.0/24 -j MASQUERADE  ---将私网地址转化为任意的公网地址
  • 实现DNAT
修改a上的httpd端口为8080
开启httpd服务
在b上的操作,设置DNAT
iptables -t nat -A PREROUTING -d 172.18.21.107 -p tcp --dport 80 -j DNAT --to-destination 192.168.74.100:8080  ---访问目标地址为172.18.21.107的tcp的80端口就将目标地址和端口转换为192.168.74.100的8080端口
在c上测试
curl 172.18.21.107
  • 实现转发REDIRECT
    REDIRECT:
    NAT表
    可用于:PREROUTING OUTPUT 自定义链
    通过改变目标IP和端口,将接受的包转发至不同地址
    --to-ports port[-port]
    示例:
需要在本机设置iptables -t nat -A PREROUTING -d 192.168.74.100 -p tcp --dport 9527 -j REDIRECT --to-ports 80   ---表示访问本机的tcp的9527端口就把它转发到本机的tcp的80端口

总结:SNAT是源网络地址转换,DNAT是目标网络地址转化,NAT服务器上有两个IP地址,一个是连接内网的,一个是连接外网的,并不一定非得有两个网卡,可以一个网卡绑定多个ip地址,SNAT是内网访问外网时,NAT将内网的ip转化为和外网同网段的ip,这样内网就可以访问外网了,测试时是用curl 172.18.21.7,直接去和外网的某个主机连接,因为是源地址转化,所以在外网的主机上看到的ip地址是经过nat转化后的ip地址;DNAT是外网访问内网的某个服务时,nat将目标地址转化为内网主机上的ip地址和端口号,访问时外网的主机访问的是nat的外网的ip,然后经过nat转换,而不是直接去访问内网的主机,这个和SNAT不同,SNAT是内网直接去访问外网的主机,中间经过nat的转换。DNAT只能转换成为一个内网的主机的ip和端口号,而不能转换为多个,lvs可以根据内部的调度算法实现转换为多个服务器的ip地址和端口。

4、firewalld服务

  • firewalld是CentOS 7.0新推出的管理netfilter的工具
    firewalld是配置和监控防火墙规则的系统守护进程。可以实现iptables,ip6tables,ebtables的功能
    firewalld服务由firewalld包提供
    firewalld支持划分区域zone,每个zone可以设置独立的防火墙规则
    归入zone顺序:
    先根据数据包中源地址,将其纳为某个zone
    纳为网络接口所属zone
    纳入默认zone,默认为public zone,管理员可以改为其它zone
    网卡默认属于public zone,lo网络接口属于trusted zone
  • firewalld zone分类


    2018-07-31 linux防火墙 2_第3张图片
    image.png
  • firewalld配置
    firewall-cmd --get-services 查看预定义服务列表
    /usr/lib/firewalld/services/*.xml预定义服务的配置
    三种配置方法
    firewall-config (firewall-config包)图形工具


    2018-07-31 linux防火墙 2_第4张图片
    image.png

    firewall-cmd (firewalld包)命令行工具
    /etc/firewalld 配置文件,一般不建议

  • firewall-cmd 命令选项
--get-zones列出所有可用区域
--get-default-zone查询默认区域
--set-default-zone=设置默认区域
--get-active-zones列出当前正使用的区域
--add-source=[--zone=]添加源地址的流量到指定区域,如果无--zone= 选项,使用默认区域
--remove-source= [--zone=]从指定区域中删除源地址的流量,如果无--zone= 选项,使用默认区域
--add-interface=[--zone=]添加来自于指定接口的流量到特定区域,如果无--zone= 选项,使用默认区域
--change-interface=[--zone=]改变指定接口至新的区域,如果无--zone= 选项,使用默认区域
--list-all [--zone=]列出指定区域的所有配置信息,包括接口,源地址,端口,服务等,如果无--zone= 选项,使用默认区域
--add-service= [--zone=]允许服务的流量通过,如果无--zone= 选项,使用默认区域
--add-port=[--zone=] 允许指定端口和协议的流量,如果无--zone= 选项,使用默认区域
--remove-service= [--zone=]从区域中删除指定服务,禁止该服务流量,如果无--zone= 选项,使用默认区域
--remove-port=[--zone=]从区域中删除指定端口和协议,禁止该端口的流量,如果无--zone= 选项,使用默认区域
--reload删除当前运行时配置,加载存盘的配置

firewall-cmd 命令示例

查看默认zone
firewall-cmd --get-default-zone
将默认zone设为dmz
firewall-cmd --set-default-zone=dmz
在internalzone中增加源地址192.168.0.0/24的永久规则
firewall-cmd--permanent --zone=internal --add-source=192.168.0.0/24
在internalzone中增加协议mysql的永久规则
firewall-cmd--permanent --zone=internal --add-service=mysql
加载新规则以生效
firewall-cmd --reload

实验:配置firewalld

systemctl mask iptables   ---屏蔽iptables,start也启动不起来了,避免管理员误操作
systemctl mask ip6tables  
systemctl status firewalld
systemctl enable firewalld
systemctl start firewalld  --启动firewalld服务
firewall-cmd --get-default-zone
firewall-cmd --set-default-zone public
firewall-cmd --permanent --zone=public --list-all
firewall-cmd --permanent --zone=public --add-port 8080/tcp   ---添加tcp的8080端口到public的zone,把httpd的端口修改为8080,这样别人就可以访问我主机上的httpd服务了
firewall-cmd --reload    ---注意加上 --permanent 选项可以存盘。但不能生效,要输入此条命令才能生效

你可能感兴趣的:(2018-07-31 linux防火墙 2)