1. linux防火墙基础
1.1 防火墙概念
在计算机科学领域中,防火墙(Firewall)是一个架设在互联网与企业内网之间的信息安全系统,根据企业预定的策略来监控往来的传输。
防火墙可能是一台专属的网络设备或是运行于主机上来检查各个网络接口上的网络传输。它是目前最重要的一种网络防护设备,从专业角度来说,防火墙是位于两个(或多个)网络间,实行网络间访问或控制的一组组件集合之硬件或软件。
1.2 功能
防火墙最基本的功能就是隔离网络,通过将网络划分成不同的区域(通常情况下称为ZONE),制定出不同区域之间的访问控制策略来控制不同信任程度区域间传送的数据流。防火墙工作与主机和网络的边缘。
1.3 PTABLES实现方式
Linux系统的防火墙功能是由内核实现的,包过滤防火墙工作在TCP/IP的网络层,防火墙不属于应用程序,集成与内核空间,没有进程。
链名必须大写
主机防火墙:报文进入内核, 经Input检测进入用户空间,经Output检测从用户出去 。报文仅访问主机本身
forward转发:访问的是外部服务器,通过farword转发。
源地址转换:SNAT,将客户端ip转换成外网ip
目标地址转换:DNAT,将外网ip转化为客户端ip(私网)
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) |
1.4 数据包匹配的流程:
分析数据报文进入本机后应用了哪些表规则以及链规则;
filter表的规则,filter表决定是否放行数据包通过,如果通过,则必须经由INPUT链流入数据包(内核—input—用户空间),INPUT链是处理入站数据的,如果没问题,继续放行到用户空间,再经由OUTPUT链将数据包流出。
nat表的规则,nat表主要实现转发功能,数据包先经由PREROUTING链进行路由选择,选择好路线后再经由FORWARD链转发数据,然后再进行一个路由选择,最后由POSTROUTING链流出数据。
1.5 添加规则时的考量点
1)要实现什么功能:添加在哪个表上;
2)报文流经的路径:添加在哪个链上。
1.6 规则表之间的优先级
策略应用优先级:raw,mangle,nat,filter;
策略常用优先级:filter,nat,mangle,raw。
入站数据流向:来自外界的数据包到达防火墙,首先被PREROUTING规则链处理(是否被修改地址),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目的地址是防火墙本机,那么内核将其传递给INPUT链处理,通过以后再交给上次的应用程序进行响应。
转发数据流向:来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后进行路由选择,如果数据包的目标地址是其他外部地址,则内核将其传递给FORWALD链进行处理,然后再交给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
出站数据流向:防火墙本身向外部地址发送数据包,首先被OUTPUT规则链处理,之后进行路由选择,然后交给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
规则链内部各防火墙规则之间的优先顺序
依次按第1条规则、第2条规则、第3条规则、·····的顺序进行处理,找到一条能够匹配的数据包规则,则不再继续检查后面的规则(使用LOG记录日志的规则例外)如果找不到规则,就按照规则链的默认策略进行处理。
2. 链管理和设置iptables规则
2.1 语法格式
iptables [ -t 表名] 命令选项 [ 链名] [ 条件匹配] [ -j 目标动作或者跳转]
iptables:运行在内核空间上,帮助调用防火墙,用户用来操作防火墙的工具。
2.2 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 | 查看规则列表时,同步显示规则在链中的顺序号 |
2.3 匹配条件
选项 | 作用 |
-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 | 地址伪装 |
自定义链 | 自由定义链中的规则进行匹配 |
2.4 添加及输入规则
#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链中插入一条防火墙规则,作为链中的第二条规则
2.5 查看规则表
iptables -L INPUT --line-numbers
查看filter 表INPUT链中所有规则,同时显示各条规则的顺序号
iptables -nvL
-L 选项放在最后,否则会将vn当成链名。查看filter表各链中所有规则的详细信息,同时以数字形式显示地址和端口号
2.6 删除、清空规则
iptables-D INPUT 2
删除filter 表INPUT 链中的第二条规则
iptables -F
不指定表名时,默认情况filter表
iptables -t nat -F
清空nat 表中各链的所有规则
2.7 设置规则链的默认策略
iptables -t filter -P FORWARD DROP
将filter 表中FORWARD 规则的默认策略设为DROP
iptables -p OUTPUT ACCEPT
将filter 表中OUTPUT规则的默认策略设为ACCEPT
获得iptables 相关选项的帮助信息
iptables -p icmp -h
查看iptables 命令中关于icmp协议的帮助信息
2.8 条件匹配
流入、流出接口(-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协议数据包\
2.9 动作匹配
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
2.10 显示匹配的使用选项及功能:
显式匹配的选项特别多,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都应该拒绝
3. filter表实例详解
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
此时又能访问了
4. nat表
nat主要实现内外网的转换,现在以实例来详解nat表。
现以三台终端192.168.16.4、192.168.16.5、192.168.16.6来做实验,.4用作客户机(内网),.5用作防火墙主机,.6用作服务端主机(外网)。
以课件主机为例布置终端。防火墙主机.5配置两块网卡进行内外网转化,两块网卡必须与相指向的终端通网段。因此将.4客户机网卡改为vmnet4,.6服务机网卡改为vmnet6,防火墙相应的两块网卡改为相同网段。
4.1 设置各终端ip
.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 使其生效。
4.2 对forword操作
#.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