title: “iptables 简介 ”
tag: interview
iptables 是运行在用户空间的应用软件,通过管制 Linux 内核 netfilter 模块,来管理网络数据包的解决和转发。通常 iptables 须要内核模块反对能力运行,此处相应的内核模块通常是 Xtables。netfilter/iptables 组成 Linux 平台下的包过滤防火墙,能够代替低廉的商业防火墙解决方案,实现封包过滤、封包重定向和网络地址转换(NAT)等性能。
Iptables 和 netfilter 的关系是一个很容易让人搞不清的问题。很多的晓得 iptables 却不晓得 netfilter。其实 iptables 只是 Linux 防火墙的管理工具而已,位于 /sbin/iptables。真正实现防火墙性能的是 netfilter,它是 Linux 内核中实现包过滤的内部结构。
iptables 架构
iptables、ip6tables 等都应用 Xtables 框架。存在“表(tables)”、“链(chain)”和“规定(rules)”三个层面。
表指的是不同类型的数据包解决流程,每个表中又能够存在多个“链”,零碎依照预订的规定将数据包通过某个内建链。
例如将从本机收回的数据通过 OUTPUT 链。在“链”中能够存在若干“规定”,这些规定会被逐个进行匹配,如果匹配,能够执行相应的动作,如批改数据包,或者跳转。跳转能够间接承受该数据包或回绝该数据包,也能够跳转到其余链持续进行匹配,或者从以后链返回调用者链。当链中所有规定都执行完依然没有跳转时,将依据该链的默认策略(“policy”)执行对应动作;如果也没有默认动作,则是返回调用者链。
规定
规定(rules)其实就是网络管理员预约义的条件,规定个别的定义为“如果数据包头合乎这样的条件,就这样解决这个数据包”。规定存储在内核空间的信息 包过滤表中,这些规定别离指定了源地址、目标地址、传输协定(如 TCP、UDP、ICMP)和服务类型(如 HTTP、FTP 和 SMTP)等。当数据包与规定匹配时,iptables 就依据规定所定义的办法来解决这些数据包。理论工作中,配置防火墙的次要工作就是增加、批改和删除这些规定。
ACCEPT:接管数据包。
DROP:抛弃数据包。
REDIRECT:重定向、映射、通明代理。
SNAT:源地址转换。
DNAT:指标地址转换。
MASQUERADE:IP 假装(NAT),用于 ADSL。
LOG:日志记录。
SEMARK : 增加 SEMARK 标记以供网域内强制访问控制(MAC)。
一条规定无奈独自失效,它先须要被退出到规定表和规定链中。大多数的 Linux 发型版中,个别是四表五链的构造。
规定链
规定链(chains)是数据包流传的门路,每一条链其实就是泛滥规定中的一个查看清单,每一条链中能够有一条或数条规定。当一个数据包达到一个链时,iptables 就会从链中第一条规定开始查看,看该数据包是否满足规定所定义的条件。如果满足,零碎就会依据 该条规定所定义的办法解决该数据包;否则 iptables 将持续查看下一条规定,如果该数据包不合乎链中任一条规定,iptables 就会依据该链事后定 义的默认策略来解决数据包。
INPUT 链:解决输出数据包。
OUTPUT 链:解决输入数据包。
FORWARD 链:解决转发数据包。
PREROUTING 链:用于指标地址转换(DNAT)。
POSTOUTING 链:用于源地址转换(SNAT)。
规定链之间的先后顺序是 RREROUTING -> INPUT —> FORWARD -> OUTPUT -> POSTROUTING
规定表
依照业务规定别离是 filter 表负责进行数据包过滤,nat 负责进行地址转换操作,raw 表负责异样解决,mangle 表负责数据处理。他们之前的先后顺序是 raw -> mangle -> nat -> filter。
- filter 表
filter 表是默认的表,如果不指明表则应用此表。其通常用于过滤数据包。其中的内建链包含:
INPUT,输出链。发往本机的数据包通过此链。
OUTPUT,输入链。从本机收回的数据包通过此链。
FORWARD,转发链。本机转发的数据包通过此链。 - nat 表
nat 表如其名,用于地址转换操作。其中的内建链包含:
PREROUTING,路由前链,在解决路由规定前通过此链,通常用于目标地址转换(DNAT)。
POSTROUTING,路由后链,实现路由规定后通过此链,通常用于源地址转换(SNAT)。
OUTPUT,输入链,相似 PREROUTING,然而解决本机收回的数据包。 - mangle 表
mangle 表用于解决数据包。其和 nat 表的次要区别在于,nat 表偏重连贯而 mangle 表偏重每一个数据包。其中内建链列表如下:
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING - raw 表
raw 表用于解决异样,有如下两个内建链:
PREROUTING
OUTPUT
iptables 传输数据包的过程:
- 当一个数据包进入网卡时,它首先进入 PREROUTING 链,内核依据数据包目标 IP 判断是否须要转送进来。
- 如果数据包就是进入本机的,它就会沿着图向下挪动,达到 INPUT 链。数据包到了 INPUT 链后,任何过程都会收到它。本机上运行的程序能够发送数据包,这些数据包会通过 OUTPUT 链,而后达到 POSTROUTING 链输入。
- 如果数据包是要转发进来的,且内核容许转发,数据包就会如图所示向右挪动,通过 FORWARD 链,而后达到 POSTROUTING 链输入。
iptables 实例
清空以后的所有规定和计数
iptables -F # 清空所有的防火墙规定
iptables -X # 删除用户自定义的空链
iptables -Z # 清空计数
配置容许 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 示意承受这样的申请
容许本地回环地址能够失常应用
iptables -A INPUT -i lo -j ACCEPT
#本地圆环地址就是那个 127.0.0.1,是本机上应用的, 它进与出都设置为容许
iptables -A OUTPUT -o lo -j ACCEPT
设置默认的规定
iptables -P INPUT DROP # 配置默认的不让进
iptables -P FORWARD DROP # 默认的不容许转发
iptables -P OUTPUT ACCEPT # 默认的能够进来
配置白名单
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 端口
开启相应的服务端口
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 # 曾经建设的连贯得让它进来
保留规定到配置文件中
cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak # 任何改变之前先备份,请放弃这一优良的习惯
iptables-save > /etc/sysconfig/iptables
cat /etc/sysconfig/iptables
列出已设置的规定
# iptables -L 示例
iptables -L [-t 表名] [链名]
#
iptables -L -t nat # 列出 nat 下面的所有规定
# ^ -t 参数指定,必须是 raw,nat,filter,mangle 中的一个
iptables -L -t nat --line-numbers # 规定带编号
iptables -L INPUT
iptables -L -nv # 查看,这个列表看起来更具体
革除已有规定
iptables -F INPUT # 清空指定链 INPUT 下面的所有规定
iptables -X INPUT # 删除指定的链,这个链必须没有被其它任何规定援用,而且这条上必须没有任何规定。# 如果没有指定链名,则会删除该表中所有非内置的链。iptables -Z INPUT # 把指定链,或者表中的所有链上的所有计数器清零。
删除已增加的规定
# 增加一条规定
iptables -A INPUT -s 192.168.1.5 -j DROP
将所有 iptables 以序号标记显示,执行:iptables -L -n --line-numbers
比方要删除 INPUT 里序号为 8 的规定,执行:iptables -D INPUT 8
凋谢指定的端口
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 #禁止其余未容许的规定拜访
屏蔽 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 的命令是
指定数据包进来的网络接口
只对 OUTPUT,FORWARD,POSTROUTING 三个链起作用。
iptables -A FORWARD -o eth0
查看已增加的规定
iptables -L -n -v
Chain INPUT (policy DROP 48106 packets, 2690K bytes)
pkts bytes target prot opt in out source destination
5075 589K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
191K 90M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
1499K 133M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
4364K 6351M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
6256 327K ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 3382K packets, 1819M bytes)
pkts bytes target prot opt in out source destination
5075 589K ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
启动网络转发规定
公网 210.14.67.7 让内网 192.168.188.0/24 上网
iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127
端口映射
本机的 2222 端口映射到内网 虚拟机的 22 端口
iptables -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222 -j DNAT --to-dest 192.168.188.115:22
字符串匹配
比方,咱们要过滤所有 TCP 连贯中的字符串 test,一旦呈现它咱们就终止这个连贯,咱们能够这么做:
iptables -A INPUT -p tcp -m string --algo kmp --string "test" -j REJECT --reject-with tcp-reset
iptables -L
# Chain INPUT (policy ACCEPT)
# target prot opt source destination
# REJECT tcp -- anywhere anywhere STRING match "test" ALGO name kmp TO 65535 reject-with tcp-reset
#
# Chain FORWARD (policy ACCEPT)
# target prot opt source destination
#
# Chain OUTPUT (policy ACCEPT)
# target prot opt source destination
自定义链
其实 iptables 中的自定义链曾经够用了。然而咱们为什么还要自定义链呢?当链上的规定足够多的时候,就不容易治理了。这个时候咱们能够自定义分类,将不同的规定放在不同的链中。
1. 创立自定义链
# 在 filter 表上创立一个自定义的链 IN_WEB.
iptables -t filter -N IN_WEB
2. 在自定义链上设置规定
# 在 filter 表中的 IN_WEB 链上创立一个规定,对原地址为 192.168.1.1 这个的连贯进行阻止。iptables -t filter -A IN_WEB -s 192.168.1.1 -j REJECT
3. 这时候自定义链的规定还不能应用,必须借助于默认链来是实现。
当然,自定义链在哪里创立,应该被哪调默认的链援用,取决于利用场景,比如说要匹配入站报文,所以能够在 INPUT 链中援用
# 咱们在 INPUT 链中增加了一些规定,拜访本机 80 端口的 tcp 报文将会被这条规定匹配到。-j IN_WEB 示意:拜访 80 端口的 tcp 报文将由自定义链“IN_WEB”中的规定解决,没错,在之前的例子中 -j 示意动作,当咱们将动作替换成自定义链时,就示意被以后规定匹配到的报文将交由对应的自定义链中的规定解决,具体怎么解决,取决于自定义链中的规定。当 IN_WEB 被 INPUT 援用后,援用计数将会加 1.
iptables -A INPUT -p tcp --dport 80 -j IN_WEB
3. 重命名自定义链
iptables -E IN_WEB WEB
4. 删除自定义链
iptables -X WEB
## 更多技术分享浏览我的博客:https://thierryzhou.github.io