iptables 是什么?
在Linux内核中,自带了防火墙模块netfilter,在用户空间用来给用户操作netfilter的规则的工具就是IP tables。这个工具是Linux自带的工具,跟它同类的工具还有nftable,firewalld,ufw等。总之iptables就是Linux默认的防火墙规则操作工具。
iptables 有什么用?
这个条目好像有点多余,上面说了,iptables就是用来给linux系统的防火墙制定规则,起到对网络数据包的过滤,转发,连接跟踪的功能。比如屏蔽某个IP,不让他访问本机;或者让本机能访问,但不能被ping通。
四表五链
图一
iptables按数据包的位置将拦截规则分为五类:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING,每一类就是一个规则链。
按调用顺序将拦截规则分为四类:raw、mangle、nat、filter。他们的规则的优先顺序是raw>mangle>nat>filter
可以这样理解:
raw 字面意思是生的,可以引申为原始数据,通常用于连接追踪(connection tracking)和处理特定类型的数据包。数据包刚进来(输入数据包)或者刚生成(输出数据包)的时候,所以只包括PREROUTING和OUTPUT这两个链。
mangle 字面意思是 碾压机,及时做标记的意思,用于修改数据包的头部信息,如 TTL(Time To Live)字段等。所以包括数据包经过的每个位置,即包括了五个链PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。
nat 全称是 network address Translation,所以它的功能就是网络地址转换,这就涉及源地址和目标地址的修改,输入的时候在PREROUTING链中操作,方便修改源地址,输出的时候在OUTPUT链中操作,方便修改目标地址,转发的时候在POSTROUTING链中操作,方便修改目标地址。我方便记忆就暂时这么理解了。
filter 顾名思义过滤器,起到拦截数据包的作用,包含三个链INPUT、OUTPUT、FORWARD。可以这么理解。数据流向总共有3类,输入,输出,转发。过滤就是对这三类数据的过滤。
实际使用时就是针对某个表的某个表添加、删除、修改规则。
图二
下图是整个四表五链结构及优先级数据进站出站,同一位置不表中规则链的执行顺序图三
iptables 怎么用?
参数格式
iptables -t 表名 操作子命令 规则链 规则 -j 控制类型
filter是默认的表,不写-t 选择表的话,默认是它。j就是jump
常用操作子命令解释
命令 | 效果 |
---|---|
-A | 在指定链末尾追加一条规则 iptables -A INPUT 操作 |
-I(大写的i) | 在指定链中插入一条新的,未指定序号默认作为第一条 iptables -I INPUT 操作 |
-P(大写) | 指定链的默认规则 iptables -P OUTPUT ACCEPT 操作 |
-D | 删除规则, iptables -D 链 规则序号 ;如iptables -t nat -D INPUT 2 操作 |
-R | 修改、替换某一条规则 iptables -t nat -R INPUT 操作 |
-L | 查看 iptables -t nat -L |
-n | 所有字段以数字形式显示(比如任意ip地址是0.0.0.0而不是anywhere,比如显示协议端口号而不是服务名)iptables -L -n,iptables -nL,iptables -vnL (查看常和vL一起使用) |
-v | 查看时显示更详细信息,常跟-L一起使用 |
–line-num | 规则带编号 iptables -t nat -vnL --line-num |
-F | 清除链中所有规则 iptables -F 操作 |
-N | 新加自定义链 |
-X(大写) | 清空自定义链的规则,不影响其他链 iptables -X |
-Z(大写) | 清空链的计数器(匹配到的数据包的大小和总和)iptables -Z |
-S(大写) | 看链的所有规则或者某个链的规则/某个具体规则后面跟编号 |
通用匹配参数(parameter)
通用匹配直接使用,不依赖于其他条件或扩展,包括网络协议、IP地址、网络接口等条件
匹配项 | 参数 |
---|---|
协议匹配 | -p 协议名(tcp,icmp等) |
地址匹配 | -s 源地址 -d 目的地址 |
接口匹配 | -i 入站网卡 -o 出站网卡 |
端口匹配 | –sport 源端口 --dport 目的端口 |
-j的选项(jump)
-j是数据包流向,防火墙规则匹配即停止,即排在前面的规则序号被匹配了,就不会执行下面的规则。
但是对于LOG操作时例外,LOG只是辅助,没有处理数据包
对数据包的操作 | 效果 |
---|---|
-j ACCEPT | 允许数据包通过 |
-j DROP | 直接丢弃数据包,不给出任何回应信息 |
-j REJECT | 拒绝数据包通过,必要时会给数据发送端一个响应信息 |
-j LOG | 在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则 |
-j SNAT | 修改数据包的源地址 |
-j DNAT | 修改数据包的目的地址 |
-j MASQUERADE | 伪装成一个非固定公网IP地址 |
表名和规则链的对应关系
raw: PREROUTING、FORWARD、OUTPUT
mangle: PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
nat: PREROUTING、OUTPUT、POSTROUTING
filter: INPUT、FORWARD、OUTPUT
控制类型
accept(接收)、reject(拒绝并回复)、drop(丢弃不回复)、snat(源地址转换)、dnat(目标地址转化)、pnat(源地址端口转换)、masquerade(动态转换)
添加规则
iptables -t filter -I INPUT -s 10.0.0.29 -p tcp -m multiport --ports 22,80,1884,1883 -j DROP
丢弃来自IP为10.0.0.29 端口为 22,80,1884,1883的数据并且不回复
插入规则
iptables -t filter -A INPUT -s 10.0.0.29 -p tcp -m multiport --ports 22,80,1884,1883 -j DROP
丢弃来自IP为10.0.0.29 端口为 22,80,1884,1883的数据并且不回复
查看规则
iptables -vnL --line-num
v 代表显示详细信息
n 所有字段能以数字显示就以数字形式显示
L 查看规则列表
–line-numbers 显示各条规则在链内的顺序号
删除规则
iptables -t filter -D INPUT 1
删除filter表 input 链第一条规则
iptables -t filter -D INPUT -s 10.0.0.11 -j DROP
删除filter表中,INPUT链上,源地址是10.0.0.11,处理动作是DROP的这条规则
清除规则
清除所有规则
iptables -F
清除某个表链的所有规则
iptables -t filter -F INPUT
清除 filter表input链的所有规则
修改默认策略
iptables -P 链名 默认的策略
iptables -t filter -P INPUT DROP
将filter表input链的默认策略修改为丢弃
实现黑白名单
黑名单
默认策略设置为accept,对目标设置为reject,例如:
iptables -t filter -P INPUT ACCEPT
iptables -t filter -I INPUT -s 10.0.0.11 -j REJECT
将IP地址10.0.0.11拉入黑名单
白名单
先设置本机可以访问,不来本机都连不上,还搞个锤子
iptables -t -filter -I INPUT -s 10.0.0.10 -j ACCEPT
设置默认策略为DROP
iptables -t filter -P INPUT DROP
设置允许访问的IP
iptables -t filter -I INPUT -s 10.0.0.12 -j ACCEPT
实现NAT功能
NAT功能就是网络地址转换,主要用途是局域网多台主机通过一个公网IP上网。出站数据包中内网主机的IP地址(源地址)转换为公网IP,这叫SNAT。入站数据包的公网IP(目标地址也就是局域网的公网IP)转换为内网主机的局域网IP,这叫DNAT。所以局域网主机通过一个公网IP上网包含SNAT和DNAT两种转换。
SNAT
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT --to-source ExtIP
表示访问的地址只要不是内网地址就使用snat的方式将请求报文源地址替换为to-source指定的地址
例如:
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 ! -d 10.0.0.0/24 -j SNAT --to-source 172.18.1.6-172.18.1.9
局域网中10.0.0.0/24网段主机,只要访问的不是10.0.0/24这个网段,就将请求报文源地址替换为172.18.1.6-172.18.1.9
如果公网IP不固定的话,要通过这种方法:
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j MASQUERADE
例如:
iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o eth0 -j MASQUERADE
192.168.0.0/16网段的主机访问外网时,将192.168.0.0/16网段的请求报文源地址都更改为eth0网卡上的公网地址
/16 是子网掩码的另一种写法,表示4段8位的IP地址只有前16位是1,用来表示网络地址,后16位用来表示内网IP地址。与子网掩码255.255.0.0是一样的
DNAT
iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT]
例如:iptables -t nat -I PREROUTING -d 10.0.0.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80
如果本机的公网地址是10.0.0.100,外网的请求报文访问10.0.0.100:80端口时,就将请求报文的目标地址改为192.168.1.100:80
PNAT
除了SNAT和DNAT外,还有种叫作PNAT,也叫做PAT。PNAT(或PAT)通常被看作是SNAT的一个特定形式或变种,其特点不仅在于将内部IP地址转换为公网IP地址,还包括同时更改源端口号。
例如:
iptables -t nat -I PREROUTING -d 10.0.0.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080
外网用户要访问内网的http服务请求的端口是80,而内网的httpd服务工作在非标准的端口8080上, 此时内网的http服务器就需要将发送给本机80端口的数据报文重新重定向至本机的8080端口
理论上讲通过给家里的路由器添加iptables规则,实现PNAT,就可以让家里的电脑当作服务器用。
自定义规则链
创建自定义链
使用 -N 选项可以创建自定义链
iptables -t 表 -N 需要定义的链名
例如:创建一个叫做IN_WEB的自定义链 iptables -t filter -N IN_WEB
实现别的主机不能ping通本机 iptables -t filter -I IN_WEB -p icmp --icmp-type 8/0 -j REJECT
命令解释:
-p icmp: 这指定了协议类型为 ICMP。ICMP 是用于在 IP 主机和路由器之间传递控制消息的协议。
–icmp-type 8/0: 这指定了要匹配的 ICMP 类型和代码。在这种情况下,它是匹配 ICMP 类型 8(即 “echo request”,通常用于 ping 命令)和代码 0(表示没有特定的代码)。
通过 -j 参数来在默认的规则链种引入自定义的规则链 iptables -t filter -I INPUT -j IN_WEB
删除自定义链
通过 -X 参数可以删除定义的自定义链,但是这个自定义链需要没有被引用以及自定义链中没有任何规则。
清空自定义链规则 iptables -F <自定义链名称>
通过 -X 参数来删除自定义链 iptables -X <自定义链名称>
保存规则
如果是Debian或Ubuntu系统安装iptables-persistent,
sudo apt-get install iptables-persistent
它会在系统启动时,从/etc/iptables/rules.v4 和 /etc/iptables/rules.v6分别加载ipv4 和ipv6的iptables 规则
所以,每次我们对iptables进行了任何改动,使用下面的命令,将当前生效的iptables配置,导出到/etc/iptables/rules.v4 和 /etc/iptables/rules.v6即可。
sudo iptables-save > /etc/iptables/rules.v4 //如果添加了ipv4 规则,执行这步
sudo ip6tables-save > /etc/iptables/rules.v6 //如果添加了ipv6规则,执行这步
有些版本是在/etc/iptabls.rules文件中
如果是centos
第一步,在修改iptables配置后,将其导出到某个文件,比如: /etc/iptables.conf 。命令为:iptables-save > /etc/iptables.conf 这一步,每次修改后都要做。
第二步,在/etc/rc.local中添加命令iptables-restore < /etc/iptables.conf。从此之后,每次重启,系统会自动从/etc/iptables.conf恢复对应的iptables配置。这一步只需要做一次。
命令格式参考:https://blog.youkuaiyun.com/2301_79886522/article/details/134693499
规则使用参考:https://www.cnblogs.com/heyongshen/p/17805871.html
保存规则参考:https://www.jianshu.com/p/95913922b630