netfilter是主要的工作模块,位于内核中,在网络层的五个位置(就是防火墙四表五链中的五链)注册了一些函数,用来抓取数据包,将数据包的信息拿出来匹配各个链位置在对应表中的规则:匹配之后,进行相应的处理ACCEPT,DROP等等
iptables的作用是为包过滤机制的实现提供规则,通过各种不同的规则,告诉netfilter对来自某些源,前往某些目的或具有某些协议特征的数据包应该如何处理,为了更加方便的组织和管理防火墙规则,iptables采用了表和链的分层结构
其中,每个规则表相当于内核空间的一个容器,根据规则集的不同用途划分为默认的四个表,在每个表容器内又包括不同的规则链,根据处理数据包的不同时机划分为五种链
表的作用:容纳各种规则链
表名 | 意义 |
---|---|
filter | 过滤数据包(filter是默认的表,在使用iptables命令进行配置规则的时候,不特指其他的表就会默认filter) |
nat | 用来修改数据包的ip地址,端口号等信息 |
mangle | 用来修改数据包的服务类型、生命周期,或者设置mark标记实现流量整形等高级应用 |
raw | 决定数据包是否被状态跟踪机制处理 |
链名 | 意义 |
---|---|
INPUT | 当收到访问防火墙本机地址的数据包时,应用此链中的规则 |
FORWORD | 需要防火墙转发数据包时应用此规则链中的规则 |
OUTPUT | 当防火墙本机向外发送数据包时,应用此链中的规则 |
PREROUTING | 在对数据包做路由选择之前,应用此链中的规则 |
POSTROUTING | 在对数据包做路由选择之后,应用此链中的规则 |
raw–>mangle–>nat–>filter
入站: PREROUTING–>INPUT
转发: PREROUTING–>FORWORD–>POSTROUTING
出战: OUTPUT–>POSTROUTING
iptables 【-t 表名】 管理选项{【链名】【匹配条件】 【-j 控制类型】
注意事项:
参数 | 意义 | 用法 |
---|---|---|
-A | 在指定链末尾追加一条 | iptables -A INPUT |
-I | 在指定链中插入一条新的,未指定序号默认作为第一条 | iptables -I INPUT |
-R | 修改、替换某一条规则 | iptables -t nat -R INPUT |
-D | 删除 | iptables -t nat -D INPUT |
-L | 列出所有规则条目 | iptables -L -t nat |
-F | 清除所有规则 | iptables -F |
-P | 为指定的链设置默认规则 | iptables -P为清空所有默认策略,不是ACCEPT就是DROP |
-n | 以数字形式显示地址、端口等信息 | iptables -L -n’,iptables -nL |
-n --line-number | 显示规则的序号 | iptables -L -n --line-number -t nat |
控制类型 | 含义 |
---|---|
ACCEPT | 允许通过 |
DROP | 直接丢弃,不给出任何回应 |
REJECT | 拒绝通过,必要时给出提示 |
LOG | 记录日志信息,然后传给下一条规则继续匹配 |
查看规则列表
[root@localhost ~]# iptables -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
2 ACCEPT all -- anywhere anywhere
3 INPUT_direct all -- anywhere anywhere
4 INPUT_ZONES_SOURCE all -- anywhere anywhere
5 INPUT_ZONES all -- anywhere anywhere
6 DROP all -- anywhere anywhere ctstate INVALID
7 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
允许所有数据包访问自己
[root@localhost ~]# iptables -I INPUT -j ACCEPT
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere
允许来自192.168.200.0网段的数据包访问本机
[root@localhost ~]# iptables -t filter -A INPUT -s 192.168.100.0/24 -j ACCEPT
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT all -- 192.168.200.0/24 anywhere
通用匹配也称为常规匹配,这种匹配方式可以独立使用,不依赖于其他条件或扩展模块。常见的通用匹配包括协议匹配、地址匹配、网络接口匹配。
[root@localhost ~]#iptables-I INPUT -picmp-j DROP
[root@localhost ~]#iptables-AFORWARD! -p icmp-jACCEPT //感叹号”!”表示取反
拒绝192.168.100.200主机的icmp协议
[root@localhost ~]# iptables -I INPUT -s 192.168.100.200 -p icmp -j REJECT
[root@localhost ~]# iptables -A INPUT -i ens33 -s 192.168.100.0/24 -j DROP
以指定的协议匹配作为前提条件,相当于子条件,因此无法独立使用, 其对应的功能由 iptables 在需要时自动(隐含)载入内核。常见的隐含匹配包括端口匹配、 TCP 标记匹配、ICMP 类型匹配。
开放22为目标端口
[root@localhost ~]# iptables -I INPUT -p tcp -dport 22 -j ACCEPT
。ICMP 类型使用字符串或数字代码表示,如 “Echo-Request”(代码为 8)、“Echo-Reply”(代码为 0)、“Destination-Unreachable”(代 码为 3),分别对应 ICMP 协议的请求、回显、目标不可达
[root@localhost ~]#iptables-AINPUT-p icmp --icmp-type 8-j DROP
[root@localhost ~]#iptables-AINPUT-p icmp --icmp-type 0-jACCEPT
[root@localhost ~]#iptables-AINPUT-p icmp --icmp-type 3-jACCEPT
这种匹配方式要求有额外的内核模块提供支持,必须手动以“-m 模块名称”的形式调用 相应的模块,然后方可设置匹配条件。
常见的显式匹配包括多端口匹配、IP 范围匹配、MAC 地址匹配、状态匹配。
允许本机开放 25、80、110、143 端口,以便提供电子邮件服务
[root@localhost ~]#iptables-AINPUT-p tcp-m multiport--dport 25,80,110,143-jACCEPT
禁止转发源 IP 地址位于 192.168.4.21 与 192.168.4.28 之间的 TCP
数据包
[root@localhost ~]# iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28-jDROP
根据 MAC 地址封锁主机
[root@localhost ~]#iptables-AINPUT-m mac--mac-source00:0c:29:c0:55:3f -j DROP
禁止转发与正常 TCP 连接无关的非--syn 请求数据包
[root@localhost ~]#iptables-AFORWARD-m state--stateNEW -p tcp! --syn -j DROP
验证SNAT和DNAT是否能实现防火墙功能
VMware中三台虚拟机
内网web服务器:192.168.100.100
防火墙:192.168.100.100,12.0.0.1(双网卡)
外网服务器:12.0.0.2(CentOS7.6系统)
内网ip地址转换为外网ip地址
[root@localhost network-scripts]# vim /etc/sysctl.conf //设置路由转发功能
net.ipv4.ip_forward=1 //添加路由转发的功能
[root@localhost network-scripts]# sysctl -p //直接设置启动生效
net.ipv4.ip_forward = 1
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.100.100 -o ens36 -j SNAT --to-source 12.0.0.1
外网的IP地址和内网的IP地址做端口映射
[root@localhost network-scripts]# vim /etc/sysctl.conf //设置路由转发功能
net.ipv4.ip_forward=1 //添加路由转发的功能
[root@localhost network-scripts]# sysctl -p //直接设置启动生效
net.ipv4.ip_forward = 1
[root@localhost ~]# iptables -t nat -I PREROUTING -d 12.0.0.1 -i ens36 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.100
双网卡的配置在之前已经写过,可以参考之前的博客
yum -y install httpd ## 安装httpd服务
systemctl restart httpd ##启动web服务
iptables -F ##清空防火墙规则
iptables -t nat -F ##清空防火墙nat规则
iptables -t nat -L ##查看防火墙nat规则
cat /var/log/httpd/access_log ##查看日志,看地址转换
yum -y install httpd
systemctl restart httpd
iptables -F
iptables -t nat -F
iptables -t nat -L
cat /var/log/httpd/access_log