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的报文直接放行
示例:如何实现下图的要求
在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链
- 实现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分类
-
firewalld配置
firewall-cmd --get-services 查看预定义服务列表
/usr/lib/firewalld/services/*.xml预定义服务的配置
三种配置方法
firewall-config (firewall-config包)图形工具
firewall-cmd (firewalld包)命令行工具
/etc/firewalld 配置文件,一般不建议 - firewall-cmd 命令选项
--get-zones列出所有可用区域
--get-default-zone查询默认区域
--set-default-zone=<ZONE>设置默认区域
--get-active-zones列出当前正使用的区域
--add-source=<CIDR>[--zone=<ZONE>]添加源地址的流量到指定区域,如果无--zone= 选项,使用默认区域
--remove-source=<CIDR> [--zone=<ZONE>]从指定区域中删除源地址的流量,如果无--zone= 选项,使用默认区域
--add-interface=<INTERFACE>[--zone=<ZONE>]添加来自于指定接口的流量到特定区域,如果无--zone= 选项,使用默认区域
--change-interface=<INTERFACE>[--zone=<ZONE>]改变指定接口至新的区域,如果无--zone= 选项,使用默认区域
--list-all [--zone=<ZONE>]列出指定区域的所有配置信息,包括接口,源地址,端口,服务等,如果无--zone= 选项,使用默认区域
--add-service=<SERVICE> [--zone=<ZONE>]允许服务的流量通过,如果无--zone= 选项,使用默认区域
--add-port=<PORT/PROTOCOL>[--zone=<ZONE>] 允许指定端口和协议的流量,如果无--zone= 选项,使用默认区域
--remove-service=<SERVICE> [--zone=<ZONE>]从区域中删除指定服务,禁止该服务流量,如果无--zone= 选项,使用默认区域
--remove-port=<PORT/PROTOCOL>[--zone=<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 选项可以存盘。但不能生效,要输入此条命令才能生效