关于后端:IPTables架构及使用


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。

  1. filter表
    filter表是默认的表,如果不指明表则应用此表。其通常用于过滤数据包。其中的内建链包含:
    INPUT,输出链。发往本机的数据包通过此链。
    OUTPUT,输入链。从本机收回的数据包通过此链。
    FORWARD,转发链。本机转发的数据包通过此链。
  2. nat表
    nat表如其名,用于地址转换操作。其中的内建链包含:
    PREROUTING,路由前链,在解决路由规定前通过此链,通常用于目标地址转换(DNAT)。
    POSTROUTING,路由后链,实现路由规定后通过此链,通常用于源地址转换(SNAT)。
    OUTPUT,输入链,相似PREROUTING,然而解决本机收回的数据包。
  3. mangle表
    mangle表用于解决数据包。其和nat表的次要区别在于,nat表偏重连贯而mangle表偏重每一个数据包。其中内建链列表如下:
    PREROUTING
    INPUT
    FORWARD
    OUTPUT
    POSTROUTING
  4. raw表
    raw表用于解决异样,有如下两个内建链:
    PREROUTING
    OUTPUT

iptables传输数据包的过程:

  1. 当一个数据包进入网卡时,它首先进入PREROUTING链,内核依据数据包目标IP判断是否须要转送进来。
  2. 如果数据包就是进入本机的,它就会沿着图向下挪动,达到INPUT链。数据包到了INPUT链后,任何过程都会收到它。本机上运行的程序能够发送数据包,这些数据包会通过OUTPUT链,而后达到POSTROUTING链输入。
  3. 如果数据包是要转发进来的,且内核容许转发,数据包就会如图所示向右挪动,通过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

【腾讯云】轻量 2核2G4M,首年65元

阿里云限时活动-云数据库 RDS MySQL  1核2G配置 1.88/月 速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据