一. 概念
iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的安全框中,这个全框才是真正的防火墙,这个框架的名字叫netfilter
netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间,iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架
数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则
二. 表结构
不同功能的规则,我们可以放置在不同的表中进行管理,而iptables已经为我们定义了4种表
-
filter表:负责过滤功能,防火墙;内核模块:iptables_filter -
nat表:network address translation,网络地址转换功能;内核模块:iptable_nat -
mangle表:拆解报文,做出修改,并重新封装 的功能;iptable_mangle -
raw表:关闭nat表上启用的连接追踪机制;iptable_raw
三. 安装配置
3.1 安装
# 安装软件
sudo apt-get install iptables
# 安装软件的配置文件,这个不一定能安装成功
sudo apt-get install iptables-services3.2 配置策略【可以不配置,自定义规则】
编辑配置文件
vi /etc/iptables.rules添加如下内容
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# 常用端口
#-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 59.109.149.221 -p tcp -m tcp --dport 8080 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 7080 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 7180 -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#允许loopback!(不然会导致DNS无法正常关闭等问题)
-A OUTPUT -o lo -p all -j ACCEPT
-A INPUT -i lo -p all -j ACCEPT
# 允许SSH连接
# The --dport 端口号要与 /etc/ssh/sshd_config 中的Port参数相同
-A INPUT -p tcp --dport 22 -j ACCEPT
-A OUTPUT -p tcp --sport 22 -j ACCEPT
#允许icmp包通过,也就是允许ping
-I INPUT -p icmp --icmp-type echo-request -j ACCEPT
-A INPUT -p ICMP --icmp-type timestamp-request -j DROP
-A INPUT -p ICMP --icmp-type timestamp-reply -j DROP
-A INPUT -p ICMP --icmp-type time-exceeded -j DROP
-A INPUT -p icmp --icmp-type 8 -s 0/0 -j DROP
-A OUTPUT -p ICMP --icmp-type time-exceeded -j DROP
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A INPUT -p tcp -m tcp --dport 8080 -j DROP
COMMIT
############################使配置生效
iptables-restore < /etc/iptables.rules四. 规则
iptables的规则无非增删改查,但是在学习之前,还需要了解字段含义以及如何使用ping命令
使用指定的网卡去ping指定ip地址
# [interface] 是指要使用的网卡的名称,例如 eth0
# [ip address] 是要 ping 的目标 IP 地址
ping -I [interface] [ip address]查看接收到的 ping 命令数据包来自哪个IP地址
apt-get install tcpdump随后开启检测
# [interface] 是指要监视的网络接口的名称,例如 eth0
sudo tcpdump -i [interface] icmp4.1 字段含义
-
pkts:对应规则匹配到的报文的个数 -
bytes:对应匹配到的报文包的大小总和 -
target:规则对应的target,往往表示规则对应的”动作”,即规则匹配成功后需要采取的措施 -
prot:表示规则对应的协议,是否只针对某些协议应用此规则。 -
opt:表示规则对应的选项。 -
in:表示数据包由哪个接口(网卡)流入,即从哪个网卡来。 -
out:表示数据包将由哪个接口(网卡)流出,即到哪个网卡去。 -
source:表示规则对应的源头地址,可以是一个IP,也可以是一个网段。 -
destination:表示规则对应的目标地址。可以是一个IP,也可以是一个网段。
4.2 查询
查看表的所有规则,其中-t表示指定表的名称,-L表示列出全部
sudo iptables -t filter -L
sudo iptables -t raw -L
sudo iptables -t mangle -L
sudo iptables -t nat -L如果要展示具体的表中的某个链规则,可以在-L后追加具体的链名称
sudo iptables -t filter -L INPUT展示具体的表中的某个链的具体规则,再添加-v参数
sudo iptables -t filter -vL INPUT将ip地址做出解析,可直接将源地址和目的地址展示,添加-n参数
sudo iptables -t filter -nvL INPUT可以对当前规则执行编号,添加--line参数
sudo iptables --line -t filter -nvL INPUT4.3 增加
增添规则
先使用同一网段一台机器(10.250.143.29)连通测试机(10.250.143.175),发现网络可联通

随后在测试机上添加拦截规则,规则含义是报文源地址为10.250.143.29时,报文则被DROP(丢弃),查看对应的表,发现规则已经被添加进去
iptables -t filter -I INPUT -s 10.250.143.29 -j DROP
-
-t选项指定了要操作的表,此处指定了操作filter表 -
-I选项,即insert,指明将”规则”插入至哪个链中,默认插入第一个位置 -
-s选项,即source,指明”匹配条件”中的”源地址” -
-j选项,即judge,指明当”匹配条件”被满足时,在iptables所对应的为动作target,上例中指定的动作为DROP
再去测试连通性,发现网络不通

再次查看规则表,发现七个数据包被拦截,总计588 bytes,能和上述对应

追加规则
如果要在尾部添加规则,则使用- A选项,此时表示报文源地址为10.250.143.29时,报文则被ACCEPT(接受)。虽然此时第一条为丢弃语句,第二条为接受语句,但是iptables按照顺序执行匹配,当前依旧无法接收到数据包
iptables -t filter -A INPUT -s 10.250.143.29 -j ACCEPT
在指定位置插入
可以在INPUT后写入数字来指定的位置插入我们的规则,如下图即可发现在第一行插入了规则
iptables -t filter -I INPUT 1 -s 10.250.143.29 -j ACCEPT
4.4 删除
删除filter表中INPUT中的一条规则,有两种办法,下图为当前规则表

按照编号删除
假设我们要删除编号为1的规则
iptables -t filter -D INPUT 1具体的匹配条件与动作删除
假设我们按照源地址和动作规则来删除
iptables -t filter -D INPUT -s 10.250.143.29 -j ACCEPT清除整个表
-F参数表示flush刷新,请勿随便清空链或者表中的规则
iptables -t filter -F4.5 修改
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PSE8dmXc-1676449102468)(C:\Users\29973\AppData\Roaming\Typora\typora-user-images\image-20230215160849850.png)] iptables 文件修改 iptables修改数据包内容_linux_09](https://s2.51cto.com/images/blog/202403/19031236_65f8922403a135393.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
所谓修改,就是将某条规则中的动作进行改动,比如将上图中的accept改为reject,要注意以下几点
- 最重要的:使用
-s指定对应规则中原本的源地址,否则修改的规则中的源地址会自动变为0.0.0.0/0,即那么所有IP的请求都被拒绝了 - 一定要指定规则的序号
iptables -t filter -R INPUT 1 -s 10.250.143.29 -j REJECT我们修改完如下图,
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sy9Zb5el-1676449102469)(C:\Users\29973\AppData\Roaming\Typora\typora-user-images\image-20230215160817802.png)] iptables 文件修改 iptables修改数据包内容_linux_10](https://s2.51cto.com/images/blog/202403/19031236_65f892241cc6155135.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
此时我们再去测试连通,会直接展示不可达
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nfNU0wTd-1676449102470)(C:\Users\29973\AppData\Roaming\Typora\typora-user-images\image-20230215160931775.png)] iptables 文件修改 iptables修改数据包内容_linux_11](https://s2.51cto.com/images/blog/202403/19031236_65f892242fa2874155.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
4.6 保存
我们防火墙所做出的修改都是临时的,为了防止这种情况的发生,我们需要将规则保存
ubuntu 20.04仿佛没有网上说的配置文件,那么我们需要自定义配置文件,并且将其设置为开机自启
首先,创建我们的配置文件
vi /etc/iptables.rules此后,写完命令,我们执行保存配合重定向,即可将我们当前的规则保存在配置文件中
iptables-save > /etc/iptables.rules我们同时也可以从配置文件中来加载规则
iptables-restore < /etc/iptables.rules但是我们每次开机来加载配置文件很麻烦,所以我们要设置该配置文件开机自动生效
第一步:赋予启动文件的修改权限
sudo chmod 777 /lib/systemd/system/rc-local.service第二步:然后设置该 rc-local 服务开机启动
systemctl enable /lib/systemd/system/rc-local.service第三步:创建脚本文件
sudo vi /etc/rc.local第四步:添加如下内容
#!/bin/sh
iptables-restore < /etc/iptables.rules
exit 0第五步:这个超级重要:对rc.local赋予执行权限,否则没有权限无法运行
sudo chmod 777 /etc/rc.local到此位置,开机配置文件即可生效
















