Linux防火墙
概述
Linux防火墙功能是由内核实现的,在2.4版及以后的内核中,包过滤机制是netfilter
,管理工具是iptables
。
netfilter
是Linux内核中的包过滤防火墙功能体系,称为Linux防火墙的内核态
。
iptables
是用来管理防火强墙的命令工具,为防火墙体系提供过滤规则,决定如何过滤或处理到达防火墙主机的数据包,称为Linux防火墙的用户态。
iptables的规则表、链结构
规则链
在iptables中有5中默认的规则链,其作用在于对数据包进行过滤和处理,根据处理的时机不同,各种规则被组织在不同的链中。
INPUT:处理入站数据包
OUTPUT:处理出站数据包
FORWARD:处理转发数据包
POSTROUTING:在进行路由选择后处理数据包
PREROUTING:在进行路由选择前处理数据包
规则表
在iptables中有4中默认的规则表,它们具有某一类相似用途的防火墙规则,按照不同处理时机区分不同的规则链以后,被归置到不同的表中,规则表是规则链的集合。
raw表:确定是否对该数据包进行状态跟踪
mangle表:为数据包设置标记
nat表:修改数据中的源、目标IP地址或端口
fiter表:确定是否过滤该数据包
数据包的过滤匹配流程
在一个主机传递数据到另一个主机时,首先会根据规则表的优先级
,在路由选择前进行数据包的跟踪,打上标记,然后查看路由表进行路由选择,确定是要到达本机的数据包还是要进行路由转发
。
如果是到达本机的数据,它会进入经过mangle表的INPUT链
继续打上标记,然后根据filter表中的INPUT链
中的规则进行数据过滤,之后再经过路由选择,根据规则表的优先级,进行数据发送,然后POSTROUTING链
将数据传送到对方主机上。
如果是进行路由转发的数据,则会经过FORWARD链
进行数据转发。
iptables语法格式
语法格式如图
常见数据包的处理方式
设置规则内容
-A:在链尾追加新的规则
-I:在指定位置插入一条新的规则
-R:修改、替换指定位置或内容的规则
-P:设置指定链的默认策略
查卡规则内容
-L:列表查看各条规则信息
–line-numbers:查看规则信息时显示规则的行号
-n:以数字形式显示IP地址、端口信息
-v:显示详细信息
清除规则
-D:清除指定位置或内容的规则
-F:清空规则链的所有规则
自定义规则
-N:新建一条规则链
-X:删除自定义的规则链
例1:
在filter表的INPUT链增加一条规则,只要是TCP协议的数据包都接收
[root@localhost ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT
在INPUT链插入一条规则,只要是udp协议的数据包都接收
[root@localhost ~]# iptables -I INPUT -p udp -j ACCEPT
在INPUT链插入一条规则,只要是icmp协议的数据包都接收,并且将该规则设置为第二条
[root@localhost ~]# iptables -I INPUT 2 -p icmp -j ACCEPT
将默认规则设为DROP
[root@localhost ~]# iptables -P INPUT DROP
查看规则链
[root@localhost ~]# iptables -L INPUT --line-numbers
删除规则链
[root@localhost ~]# iptables -D INPUT 2
新建规则链
在filter表中新建shengxia
链
[root@localhost ~]# iptables -t filter -N shengxia
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain shengxia (0 references)
target prot opt source destination
给新建的规则链设置规则
给shengxia这个链设置一个规则,只要是icmp数据包都drop掉
[root@localhost ~]# iptables -t filter -A shengxia -p icmp -j DROP
[root@localhost ~]# iptables -L -t filter
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain shengxia (0 references)
target prot opt source destination
DROP icmp -- anywhere anywhere
使用新建规则链
将进入filter表的icmp数据包都转到shengxia这个链进行处理
[root@localhost ~]# iptables -t filter -I INPUT -p icmp -j shengxia
[root@localhost ~]# iptables -L -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
4 240 shengxia icmp -- any any anywhere anywhere
295 29207 ACCEPT udp -- any any anywhere anywhere
3283 214K ACCEPT tcp -- any any anywhere anywhere
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 25 packets, 2204 bytes)
pkts bytes target prot opt in out source destination
Chain shengxia (1 references)
pkts bytes target prot opt in out source destination
4 240 DROP icmp -- any any anywhere anywhere
记录日志
打开日志服务,记录日志位置
[root@@localhost ~]# vim /etc/rsyslog.conf
添加日志规则
[root@localhost ~]# iptables -I INPUT -p icmp -j LOG --log-prefix "shengxia" --log-level 4
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
LOG icmp -- anywhere anywhere LOG level warning prefix "shengxia"
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
另一台主机ping,即可看到日志
[root@localhost ~]# tail -f /var/log/sctest.log
Aug 3 00:39:16 elk-node1 kernel: shengxiaIN=ens35 OUT= MAC=00:0c:29:04:07:e4:00:0c:29:13:a8:73:08:00 SRC=192.168.111.160 DST=192.168.111.254 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=42723 DF PROTO=ICMP TYPE=8 CODE=0 ID=15597 SEQ=1
Aug 3 00:39:17 elk-node1 kernel: shengxiaIN=ens35 OUT= MAC=00:0c:29:04:07:e4:00:0c:29:13:a8:73:08:00 SRC=192.168.111.160 DST=192.168.111.254 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=43194 DF PROTO=ICMP TYPE=8 CODE=0 ID=15597 SEQ=2
Aug 3 00:39:18 elk-node1 kernel: shengxiaIN=ens35 OUT= MAC=00:0c:29:04:07:e4:00:0c:29:13:a8:73:08:00 SRC=192.168.111.160 DST=192.168.111.254 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=43810 DF PROTO=ICMP TYPE=8 CODE=0 ID=15597 SEQ=3
例2
编写
脚本实现以下功能
允许192.168.40.0/24的网段访问本机的web、ftp、ssh、mysql
允许访问本机的dns服务–53udp
禁止其它电脑ping主机,主机可以ping其它电脑
默认的INPUT链规则设置为DROP
禁止192.168.40.90/24主机访问本机的2233端口
#!/bin/bash
#允许192.168.40.0/24的网段访问本机的web、ftp、ssh、mysql
iptables -A INPUT -s 192.168.40.0/24 -p tcp -m multiport --dport 80,21,22,3306 -j ACCEPT
#允许访问本机的dns服务--53 udp
iptables -I INPUT -p udp --dport 53 -j ACCEPT
#禁止其它电脑ping主机(别的主机发送请求报文),主机可以ping其它电脑(接收响应报文)
iptables -I INPUT -p icmp --icmp-type Echo-Request -j DROP
#默认的INPUT链规则设置为DROP
iptables -P INPUT DROP
#禁止192.168.40.90/24主机访问本机的2233端口
iptables -I INPUT -s 192.168.40.90/24 -p tcp --dport 2233 -j DROP
#允许192.168.1.0网段访问本机23端口
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 23
#允许192.168.1.12-192.168.1.200访问本机8080端口
iptables -A INPUT -s iprange --src-range 192.168.1.12-192.168.1.200 -p tcp --dport 8080 -j ACCEPT
#允许192.168.1.20访问3306端口
iptables -A INPUT -s 192.168.1.20 -p tcp --dport 3306 -j ACCEPT
#允许访问本机的80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
SNAT实验
先放两张图看一下使用SNAT和没有使用SNAT的区别
从图中明显看出,如果没有使用SNAT策略,局域网的主机是无法跟外网进行通信的,所以这就是SNAT的好处,将源IP地址进行转化,使得局域网主机共享单个公网IP接入Internet。
SNAT实验网络拓扑图
在进行一个实验时,首先要规划好网络拓扑图,保证实验的顺利进行。
实验环境和步骤
1.准备好两台虚拟机,一台做PC机,一台做Linux网关服务器
(这里准备两台虚拟机,Centos7-firewalld做网关服务器)
2.给虚拟机添加网卡,配置好IP地址、网关、域名服务器
根据网络拓扑图,先给Linux网关服务器进行配置,整个实验在桥接模式下进行,所以如果是校园网联网的情况下可能实验不成功。
先进入IP配置所在目录
cd /etc/sysconfig/network-scripts/
将ifcfg-ens33文件复制一份,我这里新加的另一块网卡名时ifcfg-ens35,所以执行下面命令
cp ifcfg-ens33 ifcfg-ens35
给Linux网关服务器配置IP地址、网关、域名
ifcfg-ens33网卡
BOOTPROTO="none"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.1.147
PREFIX="24"
GATEWAY=192.168.1.1
DNS1=114.114.114.114
ifcfg-ens35网卡
BOOTPROTO="none"
NAME="35"
DEVICE="ens35"
ONBOOT="yes"
IPADDR=192.168.50.254
PREFIX="24"
给PC机配置IP地址、网关、域名
BOOTPROTO="none"
DEFROUTE="yes"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.50.1
PREFIX="24"
GATEWAY=192.168.50.254
DNS1=114.114.114.114
3.网关服务器开启路由转发功能
3种方法
1./sbin/sysctl -w net.ipv4.ip_forward=1
2.echo 1 > /proc/sys/net/ipv4/ip_forward
3.修改/etc/sysctl.conf,设置net.ipv4.ip_forward=1
4.关闭防火墙和selinux功能
关闭防火墙
service firewalld stop --> 临时关闭
systemctl disable firewalld -->永久关闭
关闭selinux功能
setenforce 0
5.网关服务添加SNAT策略
#使用脚本实现,方便后续修改
#清除防火墙规则
#!/bin/bash
iptables -F
iptables -t nat -F
#添加SNAT策略
iptables -t nat -A POSTROUTING -s 192.168.50.0/24 -o ens33 -j SNAT --to-source 192.168.1.147
#开启路由功能
echo 1 > /proc/sys/net/ipv4/ipv4_forward
6.测试验证
用PC机ping百度,如果能ping通,则说明实验成功
DNAT实验网络拓扑图
步骤和SNAT实验差不多,需要注意的是用三台虚拟机,一台做发布内网的web服务器,一台做网关服务器,一台做客户机。
其中,发布内网的web服务器使用仅主机模式,方便显示效果,网关服务器中的一个网卡用桥接
,一个网卡用仅主机
当Windows客户端直接访问web服务器时,显示如下,注意IP地址为192.168.111.160:8080
添加DNAT策略访问内网服务器
#!/bin/bash
echo 1 >/proc/sys/net/ipv4/ip_forward
service firewalld stop
iptables -F
iptables -t nat -F
iptables -t nat -A PREROUTING -d 192.168.2.96 -i ens33 -p tcp --dport 8080 -j DNAT --to-destination 192.168.111.160
浏览器直接访问 192.168.2.96:8080
就可以实现DNAT策略访问web服务器啦!!!
也可以将端口转换一下,比如默认端口80 --->8080
iptables -t nat -A PREROUTING -d 192.168.2.96 -i ens33 -p tcp --dport 80 -j DNAT --to-destination 192.168.111.160:8080