最近一段时间用到了不少网络的知识,设计到防火墙的配置,数据包的路由等等。在此过程中主要使用到了linux自带的iptables
来完成一些功能,同样是迷迷糊糊的。以下为学习iptables的一些笔记,以备以后复习。
一、防火墙知识
通过对linux内核防火墙的配置便能够完成上面描述的防护功能。llinux防火墙的配置用iptables工具来配置完成。
1、什么是iptables?
iptables是netfilter项目的一部分,用于配置linux内核防火墙的命令。iptables用于配置ipv4ip6tables用于配置ipv6。
2、iptables解决什么问题?
iptables可以检测、修改、转发、重定向和丢弃ipv4的数据包。
二、iptables如何匹配
1、匹配条件:
过滤ipv4数据包的代码已经内置于内核中,并且按照不同的目的被组织成表(tables)的集合。表由一组预先定义的链(chains)组成,链包含遍历顺序规则。每一条规则包含一个谓词的潜在匹配和相应的动作(目标),如果谓词为真,该动作会被执行。也就是说条件匹配。
iptables是用户工具,用于允许用户使用链和规则。数据在iptables中的流向如下图:
2、处理动作:
处理动作在iptables中被称为target,动作分为基本动作和扩展动作。以下为常用的动作。
ACCEPT
:允许数据包通过
DROP
:直接丢失数据包,不给任何的回应信息
REJECT
:拒绝数据包,会给请求方发送一个拒绝的信息
SNAT
:源地址转换,解决网内用户用同一个公网地址上网的问题
MASQUERAADE
:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上
DNAT
:目标地址转换
REDIRECT
:在本机做端口映射
LOG
:在/var/log/message文件中记录日志信息,然后将数据包传递给下一条规则,就是对数据除记录外不做任何其他的操作
三、iptables内容
1、表(tables)
iptables
包含5张表:
raw
用于配置数据包,raw中数据包不会被系统跟踪。
filter
是用于存放所有与防火墙相关操作的默认表
nat
用于网络地址转换(例如:端口转发)
mangle
用于对特定数据包的修改
security
用于强制访问控制网络规则(例如SElinux)
大部分情况下仅需要使用filter和nat。其他表用于更为复杂的情况,包括多路由和路由判定等
规则表的先后顺序:raw
-> mangle
-> nat
->filter
2、链(chains)
表由链组成,链是一些按顺序排列的规则的列表。默认的filter包括INPUT
、OUTPUT
和FORWARD
3条内建的链,这3条链作用于数据包的过滤过程中的不同时间点,如下:
5种链的描述:
默认情况,任何链中都没有规则,需要自己加入。
规则链在不同的数据场景下先后的顺序是不一样的:
数据入站:PREROUTING
->INPUT
数据出站:OUTPUT
->POSTROUTING
转发顺序:PREROUTING
->FORWARD
->POSTROUTING
3、规则(rules)
数据包的过滤基于规则。规则由一个目标(数据包匹配所有条件后的动作)和很多匹配(导致该规则可以应用的数据包所满足的条件)指定。一个规则的典型匹配事项是数据包进入的端口(网卡适配器)、数据包的类型(ICMP
,tcp
,或者udp
)和数据包的目的端口。
管理和设置iptables规则
1) iptables规则表
2) parameter含义
3) command含义
参数 | 含义 |
---|---|
-A | 在指定链的末尾添加(append)一条新的规则 |
-D | 删除(delete)指定链中的某一条规则,可以按规则序号和内容删除 |
-I | 在指定链中插入(insert)一条新的规则,默认在第一行添加 |
-R | 修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换 |
-L | 列出(list)指定链中所有的规则进行查看 |
-E | 重命名用户定义的链,不改变链本身 |
-F | 清空(flush) |
-N | 新建(new-chain)一条用户自己定义的规则链 |
-X | 删除指定表中用户自定义的规则链(delete-chain) |
-P | 设置指定链的默认策略(policy) |
-Z | 将所有表的所有链的字节和数据包计数器清零 |
-n | 使用数字形式(numeric)显示输出结果 |
-v | 查看规则表详细信息(verbose)的信息 |
-V | 查看版本(version) |
四、iptables规则
目标使用-j或者–jump 选项指定。目标可以是用户定义的链(例如,如果条件匹配,跳转到之后的用户定义的链,继续处理)、一个内置的特定的目标或者一个目标扩展。
内置目标是ACCEPT
、DROP
、QUEUE
和RETURN
,目标扩展是REJECT
和LOG
。如果目标是内置目标,数据包的命运会立刻被决定并且在当前表的数据包的处理过程会停止。如果目标是用户定义的链,并且数据包成功穿过第二条链,目标将移动到原始链中的下一个规则。目标扩展可以被终止或者不终止。
1、数据过滤的规则示例
数据过滤的规则使用的是filter
表,filter
表中3条链INPUT
,OUTPUT
,FORWARD
分别对应的是对于主机来说进入适配器的数据,出适配器的数据和转发的数据。
1)空当前的所有规则和计数
iptables -F # 清空所有的防火墙规则
iptables -X # 删除用户自定义的空链
iptables -Z # 清空计数
2) 配置允许ssh端口连接
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
# 22为你的ssh端口, -s 192.168.1.0/24表示允许这个网段的机器来连接,其它网段的ip地址是登陆不了你的机器的。 -j ACCEPT表示接受这样的请求
3)允许本地回环地址可以正常使用
iptables -A INPUT -i lo -j ACCEPT
#本地圆环地址就是那个127.0.0.1,是本机上使用的,它进与出都设置为允许
iptables -A OUTPUT -o lo -j ACCEPT
4)设置默认的规则
iptables -P INPUT DROP # 配置默认的不让进
iptables -P FORWARD DROP # 默认的不允许转发
iptables -P OUTPUT ACCEPT # 默认的可以出去
5)配置白名单
iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT # 允许机房内网机器可以访问
iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT # 允许机房内网机器可以访问
iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允许183.121.3.7访问本机的3380端口
6)开启相应的服务端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 开启80端口,因为web对外都是这个端口
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT # 允许被ping
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已经建立的连接得让它进来
7)保存规则到配置文件中
cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak # 任何改动之前先备份,请保持这一优秀的习惯
iptables-save > /etc/sysconfig/iptables
cat /etc/sysconfig/iptables
8)清除已有规则
iptables -F INPUT # 清空指定链 INPUT 上面的所有规则
iptables -X INPUT # 删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。
# 如果没有指定链名,则会删除该表中所有非内置的链。
iptables -Z INPUT # 把指定链,或者表中的所有链上的所有计数器清零。
9)开放指定的端口
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已建立的或相关连的通行
iptables -A OUTPUT -j ACCEPT #允许所有本机向外的访问
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许访问22端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许访问80端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT #允许ftp服务的21端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT #允许FTP服务的20端口
iptables -A INPUT -j reject #禁止其他未允许的规则访问
iptables -A FORWARD -j REJECT #禁止其他未允许的规则访问
10)屏蔽IP
iptables -A INPUT -p tcp -m tcp -s 192.168.0.8 -j DROP # 屏蔽恶意主机(比如,192.168.0.8
iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP #封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 123.45.6.0/24 -j DROP #封IP段即从123.45.6.1到123.45.6.254的命令是
11)指定数据包出去的网络接口
只对 OUTPUT
,FORWARD
,POSTROUTING
三个链起作用。
iptables -A FORWARD -o eth0
2、数据转发的规则示例
nat
是网络地址转换的缩写。
局域网内的封包数据的传送流程:
- 先经过
nat
表的PREROUTING
链; - 经又路由判断确定这个封包是否要进入本机,若不进入本机,则进行下一步的流程;
- 再经过
filter
表的FORWARD
链; - 通过nat表的POSTROUTING链,最后传送出去
nat
主机的关键的流程在第1,4步骤,也就是nat表的两条重要的链:PREROUTING
和POSTROUTING
,这两条链分别修改数据包的源ip地址和目的ip地址。又被分别称为SNAT
和DNAT
。
1) SNAT(源地址转换)
能够让多个内网机器通过一个外网的ip地址上网,解决了ip资源匮乏的问题,如下图:
需要将内网ip192.168.10.10
转换为111.196.211.212
, iptables可以配置为下:
iptables -t nat -A POSTROUTING -s 192.168.10.10 -o eth0 -j SNAT --to-source 111.196.211.212
若外网的ip地址不稳定,是动态变化的话,需要使用MASQUEREAD
,能够自动的寻找外网地址并改为当前正确的外网ip地址。
iptables -t nat -A POSTROUTING -s 192.168.10.10/24 -j MASQUEREAD
2) DNAT(目的地址转换)
能够让外网用户访问内网不同的ip地址(相当于SANT的反向代理),同样的示例如下:
由上图所知:目标地址192.168.10.6
在路由转换前就是61.240.149.149
,需要在网关上运行iptables的命令,将地址进行转换,命令如下:
iptables -t nat -A PREROUTING -i eth0 -s 61.240.149.149 -d 61.240.149.149 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.6:80
表示网卡eth0
传入,将80端口的数据导向到内网192.168.10.6
机器的80
端口上。
3) 数据包端口映射
将80端口的数据转递到8080端口,这种方法常用在ssh端口的转递上。
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
3、删除已经存在的规则
1)方法一
语法:iptables -D chain rulenum [options]
,表示删除(-D)链(chains[INPUT/OUTPUT/FORWARD])上编号(rulenum)的规则,使用iptables -L INPUT –line-numbers
来显示INPUT
链上的规则且附带行号,然后iptables -D INPUT 4
删除第四行的规则。
2)方法二
iptables -L INPUT –line-numbers
显示filter
表(默认)的INPUT
链上的规则,且每一个规则上都有行号,如下:
num target prot opt source destination
1 REJECT tcp — anywhere anywhere tcp dpt:microsoft-ds reject-with icmp-port-unreachable
2 REJECT tcp — anywhere anywhere tcp dpt:135 reject-with icmp-port-unreachable
3 REJECT tcp — anywhere anywhere tcp dpt:netbios-ssn reject-with icmp-port-unreachable
4 REJECT udp — anywhere anywhere udp dpt:microsoft-ds reject-with icmp-port-unreachable
5 REJECT udp — anywhere anywhere udp dpt:135 reject-with icmp-port-unreachable
根据行号删除对应的规则即可:
iptables -D INPUT 4
,表示删除行号为4
的规则
五、启停iptables
保存iptables规则:service iptables save
,它能把规则自动保存在/etc/sysconfig/iptables
中。
查看状态:service iptables status
重启:service iptables restart
启动:service iptables start
停止:service iptables stop
永久关闭:chkconfig iptables off
永久关闭后启用:chkconfig iptables on
六、调试防火墙相关的一些方式
1、查看iptables规则
iptables -L
- v:显示详细信息,包括每条规则的匹配包数量和匹配的字节数
- x:在v的基础上,禁止自动单位换算(K,M)
- n:只显示ip地址和端口号,不将ip解析为域名
2、查看路由表
netstat -rn
3、查看nat路由表
iptables -S -t nat
参考链接:
https://wangchujiang.com/linux-command/c/iptables.html
https://wiki.archlinux.org/index.php/iptables_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
https://man.linuxde.net/iptables
https://www.zsythink.net/archives/1199
https://wiki.archlinux.org/index.php/iptables_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)