在计算机科学领域中,防火墙(Firewall)是一个架设在互联网与企业内网之间的信息安全系统,根据企业预约的策略来监控往来的传输。html
防火墙多是一台专属的网络设备或是运行于主机上来检查各个网络接口上的网络传输。它是目前最重要的一种网络防御设备,从专业角度来讲,防火墙是位于两个(或多个)网络间,实行网络间访问或控制的一组组件集合之硬件或软件。python
防火墙最基本的功能就是隔离网络,经过将网络划分红不一样的区域(一般状况下称为ZONE),制定出不一样区域之间的访问控制策略来控制不一样信任程度区域间传送的数据流。防火墙工做与主机和网络的边缘。linux
Linux系统的防火墙功能是由内核实现的,包过滤防火墙工做在TCP/IP的网络层,防火墙不属于应用程序,集成与内核空间,没有进程。web
链名必须大写算法
主机防火墙:报文进入内核, 经Input检测进入用户空间,经Output检测从用户出去 。报文仅访问主机自己shell
forward转发:访问的是外部服务器,经过farword转发。vim
源地址转换:SNAT,将客户端ip转换成外网ipwindows
目标地址转换:DNAT,将外网ip转化为客户端ip(私网)centos
Prerouting: 进行DNAT转换浏览器
Postrouting:进行SNAT转换
iptables有四表五链,表决定了数据报文处理的方式,链决定了数据报文流经的位置。
规则表(功能)
名称 |
包含链 |
做用 |
filter |
INPUT,OUTPUT,FORWARD |
过滤,防火墙 |
nat |
PREROUTING,POSTROUTING,INPUT,OUTPUT |
网络地址转换,转发 |
mangle |
OUTPUT,PREROUTING |
肯定是否对该数据包进行状态跟踪,封装 |
raw |
INPUT,OUTPUT,FORWARLD,PREROUTING,POSTROUTING |
关闭nat表上启用的链接追踪功能 |
规则链(内置):
名称 |
做用 |
input |
当收到访问防火墙本机的数据包时(入站),应用此链中的规则 |
output |
当防火墙向外发送数据包时(出站),应用此链中的规则 |
forward |
收到须要经过防火墙发送给其余地址的数据包时,应用此链中的规则(中转) |
prerouting |
在进行路由选择前处理数据包(判断目标主机)应用此链(snet) |
postrouting |
在进行路由选择后处理数据包(判断经由哪一接口送往下一跳)应用此链(dnet) |
分析数据报文进入本机后应用了哪些表规则以及链规则;
filter表的规则,filter表决定是否放行数据包经过,若是经过,则必须经由INPUT链流入数据包(内核—input—用户空间),INPUT链是处理入站数据的,若是没问题,继续放行到用户空间,再经由OUTPUT链将数据包流出。
nat表的规则,nat表主要实现转发功能,数据包先经由PREROUTING链进行路由选择,选择好路线后再经由FORWARD链转发数据,而后再进行一个路由选择,最后由POSTROUTING链流出数据。
1)要实现什么功能:添加在哪一个表上;
2)报文流经的路径:添加在哪一个链上。
策略应用优先级:raw,mangle,nat,filter;
策略经常使用优先级:filter,nat,mangle,raw。
入站数据流向:来自外界的数据包到达防火墙,首先被PREROUTING规则链处理(是否被修改地址),以后会进行路由选择(判断该数据包应该发往何处),若是数据包的目的地址是防火墙本机,那么内核将其传递给INPUT链处理,经过之后再交给上次的应用程序进行响应。
转发数据流向:来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,以后进行路由选择,若是数据包的目标地址是其余外部地址,则内核将其传递给FORWALD链进行处理,而后再交给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
出站数据流向:防火墙自己向外部地址发送数据包,首先被OUTPUT规则链处理,以后进行路由选择,而后交给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
规则链内部各防火墙规则之间的优先顺序
依次按第1条规则、第2条规则、第3条规则、·····的顺序进行处理,找到一条可以匹配的数据包规则,则再也不继续检查后面的规则(使用LOG记录日志的规则例外)若是找不到规则,就按照规则链的默认策略进行处理。
iptables [ -t 表名] 命令选项 [ 链名] [ 条件匹配] [ -j 目标动做或者跳转]
iptables:运行在内核空间上,帮助调用防火墙,用户用来操做防火墙的工具。
选项 |
功能及特色 |
-A |
append,在指定链的末尾添加一条新规则 |
-D |
delete,删除指定链中的某一条规则,按规则序号或内容肯定要删除的规则 |
-I |
insert,在指定链中插入一条新规则,若未指定位置,则默认在链的开头插入 |
-R |
修改、替换指定链的一条新规则,按规则序号或内容肯定要替换的规则 |
-L |
list,列出指定链中的全部规则进行查看,若未指定链名,则列出表中全部链的内容 |
-F |
清空指定链中的全部规则,若未指定链名,则清空表中全部链的内容 |
-N |
新建一条用户自定义的规则链 |
-X |
删除表中用户自定义的规则链 |
-P |
设置指定链的默认策略 |
-n |
number,使用数字形式显示输出结果,如显示主机的ip而不是主机名 |
-v |
verbose,查看规则列表时显示详细的信息 |
-V |
查看iptables命令工具的版本信息 |
-h |
查看命令帮助信息 |
-t |
table(表)指定要 查看的表 |
-line-numbers |
查看规则列表时,同步显示规则在链中的顺序号 |
选项 |
做用 |
-s |
source,检查报文中源ip地址是否符合此处指定的地址范围 |
-d |
destination,检查报文中ip地址是否符合此处指定的地址范围 |
-p |
protocol,检查报文中的协议 |
-i |
input-interface,数据报文的流入接口:仅能用于PREROUTING、INPUT、FORWARD链上 |
-o |
out-interface,数据报文的流出接口:仅能用于POSTROUTING、OUTPUT、FORWARD链上 |
-j target |
jump至指定的target |
ACCEPET |
接受 |
DROP |
丢弃 |
RAJECT |
拒绝 |
RETUEN |
返回调用链 |
LOG |
记录日志 |
MARK |
作防火墙标志 |
REDIRECT |
端口重定向 |
DNAT |
目标地址转换 |
SNAT |
源地址转换 |
MASOUERADE |
地址假装 |
自定义链 |
自由定义链中的规则进行匹配 |
#iptables -t filter -A INPUT -p tcp -j ACCEPT
在filter表的INPUT链的末尾添加一条防火墙规则
iptables -l INPUT -p udp -j ACCEPT
在filter 表的INPUT链中插入一条防火墙规则
iptables -l INPUT 2 -p icmp -j ACCEPT
在filter 表的INPUT链中插入一条防火墙规则,做为链中的第二条规则
iptables -L INPUT --line-numbers
查看filter 表INPUT链中全部规则,同时显示各条规则的顺序号
iptables -nvL
-L 选项放在最后,不然会将vn当成链名。查看filter表各链中全部规则的详细信息,同时以数字形式显示地址和端口号
iptables-D INPUT 2
删除filter 表INPUT 链中的第二条规则
iptables -F
不指定表名时,默认状况filter表
iptables -t nat -F
清空nat 表中各链的全部规则
iptables -t filter -P FORWARD DROP
将filter 表中FORWARD 规则的默认策略设为DROP
iptables -p OUTPUT ACCEPT
将filter 表中OUTPUT规则的默认策略设为ACCEPT
得到iptables 相关选项的帮助信息
iptables -p icmp -h
查看iptables 命令中关于icmp协议的帮助信息
流入、流出接口(-i 、-o)
来源、目的地址(-s 、-d)
协议类型(-p)
源端口、目的端口(–sport 、–dport)
端口匹配
-p udp --dport 53
匹配网络中目的端口是53的udp协议数据包
地址匹配
拒绝转发来自192.168.1.11主机数据,容许转发来自192.168.0.0/24网段的数据
iptables -A FORWARD -s 192.168.1.11 -j REJECT
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
端口和地址联合匹配
-s 192.168.0.1 -d www.abc.com -p tcp --dport 80
匹配来自192.168.0.1,去往www.abc.com的80端口的tcp协议数据包\
ACCEPT DROP SNAT DNAT MASQUERADE
-j ACCEPT 经过,容许数据包经过本链而不拦截它
iptables -A INPUT -j ACCEPT
容许全部访问本机IP的数据包经过
-j 丢弃、阻止数据包经过本链而丢弃它
iptables -A FORWARD -s 192.168.80.39 -j DROP
阻止来源地址为192.168.80.39的数据包经过本机
-j SNAT --to IP[:端口-端口] 源地址转换,SNAT支持转换为单IP,也支持转换到IP地址池
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1
将内网192.168.0.0/24的源地址修改成1.1.1.1
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10
同上、修改为一个地址池里的IP
-j DNAT --to IP [-IP][:端口-端口] 目的地址转换,DNAT支持转换为单IP,也支持转换到IP地址池
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 192.168.0.1
把从ppp0 进来的要访问的tcp/80的数据包目的地址改成192.168.0.1
显式匹配的选项特别多,man iptables-extensions查看具体用法
multiport(多端口)
–sport
–dports
iprange(ip范围)
time(时间范围)
string(字符串) #对报文中的应用层数据作字符串模式匹配检测(经过算法实现)
connlimit(链接限制)
limit(速率限制)
state(状态) #追踪本机上的请求和响应之间的数据报文的状态。状态有五种
–state state NEW:新链接请求
–state state ESTABLISHED:已创建的链接
–state state INVALID:没法识别的链接
–state state RELATED:相关联的链接,当前链接是一个新请求,但附属于某个已存在的链接
–state state UNTRACKED:未追踪的链接
提示:
对于进入的状态为ESTABLISHED都应该放行
对于出去的状态为ESTABLISHED都应该放行
严格检查进入的状态为NEW的链接
全部状态为INVALIED都应该拒绝
1> 查看防火墙状态
[root@localhost ~]# systemctl status firewalld #centos6及之前版本用service firewalld status [root@localhost ~]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2019-05-10 17:10:14 CST; 58min ago Docs: man:firewalld(1) Main PID: 670 (firewalld) CGroup: /system.slice/firewalld.service └─670 /usr/bin/python -Es /usr/sbin/firewalld --nofork –nopid
2> 查看防火墙链与规则
[root@localhost ~]# iptables -L -n #以数字结果显示 ………. #链与规则 Chain IN_public (2 references) target prot opt source destination IN_public_log all -- 0.0.0.0/0 0.0.0.0/0 IN_public_deny all -- 0.0.0.0/0 0.0.0.0/0 IN_public_allow all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3> 清空规则
[root@localhost ~]# iptables -F ……. Chain IN_public (0 references) target prot opt source destination
4> 删除自定义链
[root@localhost ~]# iptables -X [root@localhost ~]# iptables -L -n Chain INPUT (policy ACCEPT) #默认的三条链 target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
5> 查看指定表的链(若是不指定表,则默认为filter表)
[root@localhost ~]# iptables -t filter -L -n #指定查看filter表
Chain INPUT (policy ACCEPT) #任何报文都容许进入
target prot opt source destination
Chain FORWARD (policy ACCEPT) #任何报文都容许转换
target prot opt source destination
Chain OUTPUT (policy ACCEPT) #任何报文都容许出去
target prot opt source destination
6> 设置规则(黑名单、白名单)
[root@localhost ~]# iptables -P INPUT DROP #不容许任何输入规则,次操做会一同将链接终端断开
#转至主机操做 [root@localhost ~]#iptables -L Chain INPUT (policy DROP) Chain FORWARD (policy ACCEPT) Chain OUTPUT (policy ACCEPT) [root@localhost ~]# iptables -P OUTPUT DROP [root@localhost ~]#iptables -L Chain INPUT (policy DROP) Chain FORWARD (policy ACCEPT) Chain OUTPUT (policy DROP) #不容许任何输入输出 #从黑名单设置白名单,让远程终端能链接主机 #先设置INPUT链 [root@localhost ~]#iptables -t filter -A INPUT -s 192.168.16.1 -d 192.168.16.4 -j ACCEPT # 指定filter表 input链上追加 源地址 目标地址 指定target为accept [root@localhost ~]#iptables -L -n Chain INPUT (policy DROP) target port opt source destination ACCEPT all -- 192.168.16.1 192.168.16.4 #目标经过,白名单 任何协议 原地址 目标地址 #再设置OUTPUT链 [root@localhost ~]#iptables -t filter -I OUTPUT -s 192.168.16.4 -d 192.168.16.1 -j ACCEPT #i插入。返回报文,ip源与目标改变 Chain INPUT (policy DROP) target port opt source destination ACCEPT all -- 192.168.16.1 192.168.16.4 Chain OUTPUT (policy DROP) target port opt source destination ACCEPT all -- 192.168.16.4 192.168.16.1 #执行完操做远程xshell就能连上了
只设置了192.168.16.4为白名单与主机通讯,与其余终端没法通讯,如与192.168.16.5没法通讯
[root@localhost ~]# ping 192.168.16.5 PING 192.168.16.5 (192.168.16.5) 56(84) bytes of data. ping: sendmsg: Operation not permitted
因为设置的端口为all,接受全部协议,所以在windows的浏览器是能够访问192.168.16.4的。

如今将全部修改的规则改回来,以便链接xshell和各终端通讯
[root@localhost ~]#iptables -P INPUT ACCEPT [root@localhost ~]#iptables -P OUTPUT ACCEPT [root@localhost ~]#iptables -F Last login: Fri May 10 19:01:39 2019 from 192.168.16.1 [root@localhost ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
7> 设置httpd协议没法访问的规则
[root@localhost ~]# iptabels -A INPUT -s 192.168.16.1 -d 192.168.16.4 -p tcp --dport 80 -j REJECT #拒绝 基于目标80端口和tcp协议的原地址.1访问目标地址.4
8> 清空规则,再试验可以访问192.168..16网段的全部目标主机
[root@localhost ~]# iptables -F [root@localhost ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@localhost ~]# iptables -A INPUT -d 192.168.16.0/24 -p tcp --dport 80 -j ACCEPT [root@localhost ~]# iptables -t filter -A OUTPUT -s 192.168.16.4 -d 192.168.16.0/24 -p tcp --sport 80 -j ACCEPT [root@localhost ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 192.168.16.0/24 tcp dpt:80 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 192.168.16.4 192.168.16.0/24 tcp spt:80
此时又能访问了
nat主要实现内外网的转换,如今以实例来详解nat表。
现以三台终端192.168.16.四、192.168.16.五、192.168.16.6来作实验,.4用做客户机(内网),.5用做防火墙主机,.6用做服务端主机(外网)。
以课件主机为例布置终端。防火墙主机.5配置两块网卡进行内外网转化,两块网卡必须与相指向的终端通网段。所以将.4客户机网卡改成vmnet4,.6服务机网卡改成vmnet6,防火墙相应的两块网卡改成相同网段。
.4客户机:vmnet4,192.168.100.2 255.255.255.0 192.168.100.1
.5防火墙主机: ens33:vmnet4,192.168.100.1,做为网关地址 ens37:vmnet6,172.168.16.1,做为网关地址
.6 服务机:vmnet6,172.168.16.2 255.255.255.0 172.168.16.1 注意:各网卡ip不要与物理主机冲突。
#.4:
vim/etc/sysconfig/network-scripts/-fcff-ens33 BOOTPROTER=static IPADDR=192.168.16.2 NATMASK=255.255.255.0 GATE=192.168.16.1 #.5两块网卡均无网关 vim /etc/sysconfig/network-scripts/ifcfg-ens33 BOOTPROTO=static IPADDR=192.168.16.1 NATMASK=255.255.255.0 vim /etc/sysconfig.network-scripts/ifcfg-ens37 BOOTPROTO=static IPADDR=172.168.16.1 NATMASK=255.255.255.0 #.6 :
vim /etc/sysconfig/network-scripts/ifcfg-ens33 BOOTPROTER=static IPADDR=172.168.16.2 NATMASK=255.255.255.0 GATE=172.168.16.1 #配置完成后重启网卡。
配置完成后.4与.6是不通的,须要打开.5的forward的转发功能,该功能由内核参数 /proc/sys/net/ipv4/ip_forward 控制,查看该文件,其值为0则代表还没有开启,须要将其值重定向为1: echo 1 > /proc/sys/net/ipv4/ip_forward 。 此时.4和.6(内网和外网)能够通讯了。 调定的该参数不是永久性的,重启后失效,若要实现重启不失效,须要写入到配置文件 /etc/sysctl.conf 内便可:echo “net.ipv4.ip_forward=1” >> /etc/sysctl.conf ,再执行sysctl -p 使其生效。
#.5:若将forward DROP掉,即防火墙关闭转换功能,内外网不通 [root@local~]#iptables -F #清空nat表 [root@local~]#iptables -X [root@local~]#iptables -P FORWARD DROP #.4: [root@local~]#ping 172.168.16.2 #没法ping通 #.5: [root@local~]#iptables -P FORWARD ACCEPT [root@local~]#iptables -P INPUT DROP [root@local~]#iptables -P OUTPUT DROP
再用.4来ping. 6是能够ping通的,即nat转换与INPUT、OUTPUT链无关,只与FORWORD链有关
恢复
[root@local~]#iptables -p INPUT ACCEPT
[root@local~]#iptables -P PUTPUT ACCEPT
对于内外网,其httpd服务是要启动的(systemctl restart httpd),启动后能够单独用命令curl来查看是否相通:
#.6修改网页httpd首文件 [root@local~]#vim /var/www/html/index.html This is webserver :wq
#.4
[root@local~]#curl 172.168.16.2 This is webserver
#检测.6日志文件 [root@local~]#tail -f /var/log/httpd/access_log 192.168.100.2 - - [11/May/2019:18:11:52 +0000 “HTTP/1.1” 200 18 “_” “curl/7.29.0”
此时内网192.168.16.2能够直接访问外网172.168.16.2,但并不能访问各自的网关地址,现实并非如此,因此要添加策略SNAT和DNAT,在POSTROUTING和PROROUTING链上实现网址转换。
#.5: [root@local~]#iptables -t nat -A POSTROUTING -s 192.168.100.2 -d 172.168.16.2 -p tcp –dport 80 -j SNAT --to-source 172.168.16.1
#凡是基于tcp协议且经过80端口的内网192.168.100.2(源)访问外网172.168.16.2(目标),则进行SNAT转化,用关键字 –to-source指定外网转换地址172.168.16.1 [root@local~]#iptables -t nat -L -n #查看 Chain POSTROUTING(policy ACCEPT) target port opt source destination SNAT tcp -- 192.168.100.2 172.168.16.2 tcp dpt:80 to:172.168.16.1 #.4再次进行访问 [root@loacl~]#curl 172.168.16.2 This is webserver #.6检测日志 [root@local~]#tail -f /var/log/httpd/access_log 172.168.16 .1 - - [11/May/2019:18:22:52 +0000 “HTTP/1.1” 200 18 “_” “curl/7.29.0”
再来作外网访问内网
[root@local~]#iptables -t nat -A PREROUTING -d 172.168.16.1 -p tcp –dport 80 -j DNAT --to-destination 192.168.16.2 #凡是访问172.168.161这个公网地址,而且基于tcp协议、80端口的,进行DNAT转换,转换成192.168.16.2 [root@local~]#iptables -t nat -L -n #查看 Chain PREROUTING(policy ACCEPT) target port opt source destination SNAT tcp -- 0.0.0.0/0 172.168.16.1 tcp dpt:80 to:192.168.100.2 #.6访问 [root@local~]#curl 172.168.16.1 This id client #检测.4日志 [root@local~]#tail -f /var/log/httpd/access_log 172.168.16.2 - - [11/May/2019:18:22:52 +0800 “GET/HTTP/1.1” 200 18 “_” “curl/7.29.0”
访问的是防火墙服务机而不是其httpd服务,检测时将其httpd服务关闭
#.5:
[root@local~]#systemctl stop httpd #.4:
[root@local~]#curl 172.168.16.1