目录

  • 1 iptables中的“四表五链”概述
  • 1.1 iptables中的“四表”
  • 1.2 iptables中的“五链”
  • 2 iptables命令详解及示例
  • 2.1 iptables命令语法规则
  • 2.2 ACTION动作
  • 2.3 COMMAND命令
  • 2.3.1 规则管理
  • 2.3.2 链管理
  • 2.3.3 查看规则
  • 2.4 匹配条件
  • 2.4.1 通用匹配条件
  • 2.4.2 隐含匹配条件
  • 2.4.3 显式扩展匹配条件
  • 2.5 iptables服务的重启、备份与保存
  • 3 NAT网络地址转换示例
  • 3.1 示例1
  • 3.2 示例2
  • 参考文章



iptables的主要功能是实现对网络数据包进出设备及转发的控制。当数据包需要

进入设备、从设备中流出或者经该设备转发、路由时,都可以使用iptables进行控制。

1 iptables中的“四表五链”概述

1.1 iptables中的“四表”

“四表”是指,iptables的功能——filter, nat, mangle, raw.
(1)filter:过滤,进行包过滤,控制数据包是否允许进出及转发(INPUT、OUTPUT、FORWARD),可以控制的链路有input, forward, output。
(2)nat:控制数据包中网络地址转换,可以控制的链路有prerouting, input, output, postrouting
(3)mangle:修改数据包中的原数据,可以控制的链路有prerouting, input, forward, output, postrouting
(4)raw:控制nat表中连接追踪机制的启用状况,可以控制的链路有prerouting, output
注:在centos7中,还有security表,不过这里不作介绍

1.2 iptables中的“五链”

“五链”是指内核中控制网络的NetFilter定义的五个规则链,分别为:

(1)PREROUTING:路由前,

(2)INPUT:数据包流入口,指当目标地址是自己时,该规则链起作用。

(3)FORWARD:转发,指当源地址和目标地址均不是自己时,该规则链起作用。

(4)OUTPUT:数据包出口,指当源地址是自己时,该规则链起作用。

(5)POSTROUTING:路由后,

iptables目的地址变成域名了 iptables 地址转换_网络


iptables目的地址变成域名了 iptables 地址转换_linux_02

2 iptables命令详解及示例

本文的环境如下:
操作系统:CentOS7.3
Linux系统的ip地址:192.168.1.254和172.16.1.254.

2.1 iptables命令语法规则

(1)语法:iptables [-t table] COMMAND [chain] CRETIRIA -j ACTION
(2)讲解

  • -t table,是指操作的表,filter、nat、mangle或raw, 默认使用filter
  • COMMAND,子命令,定义对规则的管理
  • chain, 指明链路
  • CRETIRIA, 匹配的条件或标准,如网段、IP、协议、端口、状态
  • ACTION,操作动作或控制类型。

(3)注意事项
1)不指定表名时,默认指filter表
2)不指定链名时,默认指表内的所有链
3)除非设定链的默认策略,否则必须指定匹配条件
4)链名、动作均为大写字母,命令大部分大写,其余均为小写。

(4)例子

  • 1)不允许10.8.0.0/16网络对80/tcp端口进行访问
iptables -A INPUT -p tcp -s 10.8.0.0/16 -d 192.168.1.254 --dport 80 -j DROP
#-A为追加新规则于指定链的尾部;-s为源地址;-d为目标地址;-p为协议;
  • 2)查看iptables中filter表
iptables -t filter -nvL    
#-n为数字格式显示主机地址和端口号;-v为显示详细信息;-L为列出规则。

iptables目的地址变成域名了 iptables 地址转换_linux_03

tips:
每1秒钟观察filter表的命令如下:

watch -n1 iptables -t filter -nvL

2.2 ACTION动作

数据包的常见动作(控制类型)有以下几种:
(1)ACCEPT:允许通过
(2)DROP:直接丢弃,不给出任何回应
(3)REJECT:拒绝通过,必要时会给出提示
(4)LOG:记录日志信息,然后传给下一条规则继续匹配。

谈谈REJECT和DROP之间的区别,Ming写了一封信,向Rose示爱。Rose如果不愿意接受,她可以不回应Ming,这个时候Ming不确定Rose是否接到了信;Rose也可以同样写一封信,在信中明确地拒绝Ming。前一种操作就如同执行了DROP操作,而后一种操作就如同REJECT操作。

2.3 COMMAND命令

2.3.1 规则管理

-A, --append chain rule-specification:追加新规则于指定链的尾部;

-I, --insert chain [rulenum] rule-specification:插入新规则于指定链的指定位置,默认为首部;

-R, --replace chain rulenum rule-specification:替换指定的规则为新的规则;

-D, --delete chain rulenum:根据规则编号删除规则;

#在filter表INPUT链首部开始第2行加一条规则;允许所有icmp协议的通过
iptables -t filter -I INPUT 2 -p icmp -j ACCEPT  

#删除filter表ORWARD第2条规则
iptables -t filter -D FORWARD 2

2.3.2 链管理

-N, --new-chain chain:新建一个自定义的规则链;

-X, --delete-chain [chain]:删除用户自定义的引用计数为0的空链;

-F, --flush [chain]:清空指定的规则链上的规则;

-E, --rename-chain old-chain new-chain:重命名链;

-Z, --zero [chain [rulenum]]:置零计数器;

-P, --policy chain target, 设置链路的默认策略

#将filter表ORWARD链全部清空
iptables -t filter -F FORWARD

#将filter表ORWARD链的默认策略改为DROP,注意默认策略只能选择ACCEPT和DROP
iptables -t filter -P FORWARD -j DROP

2.3.3 查看规则

-L, --list [chain]:列出规则;

-v, --verbose:详细信息;

-vv, -vvv 更加详细的信息

-n, --numeric:数字格式显示主机地址和端口号;

-x, --exact:显示计数器的精确值;

–line-numbers:列出规则时,显示其在链上的相应的编号;

-S, --list-rules [chain]:显示指定链的所有规则;

#显示filter的详细信息,并显示行号
iptables -t filter -nvL --line-numbers

iptables目的地址变成域名了 iptables 地址转换_网络_04

2.4 匹配条件

匹配条件包括通用匹配条件、隐含匹配条件和显式匹配条件。

(1)通用匹配条件:是指针对源地址、目标地址的匹配,包括单一源IP、单一源端口、单一目标IP、单一目标端口、数据包流经的网卡以及协议。

(2)隐含匹配条件:要求以特定的协议匹配作为前提,包括端口TCP标记、ICMP类型等条件

(3)显式匹配条件:要求以“-m 扩展模块”的形式明确指出类型,包括多端口、 MAC地址、IP范围、数据包状态等条件。

2.4.1 通用匹配条件

(1)协议匹配:-p, --protocol 协议名:匹配报文中的协议,可用值tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh 或者 “all”, 亦可以数字格式指明协议;

(2)地址匹配

  • -s, --source 地址[/mask][,…]:检查报文的源IP地址是否符合此处指定的范围,或是否等于此处给定的地址;
  • -d, --destination address[/mask][,…]:检查报文的目标IP地址是否符合此处指定的范围,或是否等于此处给定的地址;

(3)接口匹配

  • -i, --in-interface 入站网卡:限定报文仅能够从指定的接口流入;only for packets entering the INPUT, FORWARD and PREROUTING chains.
  • -o, --out-interface 出站网卡:限定报文仅能够从指定的接口流出;for packets entering the FORWARD, OUTPUT and POSTROUTING chains.
iptables -A INPUT -i eth1 -p icmp -s 172.16.0.0/12 -j ACCEPT

2.4.2 隐含匹配条件

(1)端口匹配

  • –source-port,–sport port[:port] 匹配报文源端口;可以给出多个端口,但只能是连续的端口范围 ;
  • –destination-port,–dport port[:port] 匹配报文目标端口;可以给出多个端口,但只能是连续的端口范围 ;

(2)TCP匹配标记

  • –tcp-flags mask comp 匹配报文中的tcp协议的标志位;Flags are: SYN ACK FIN RST URG PSH ALL NONE;
     ①mask:要检查的FLAGS list,以逗号分隔;
     ②comp:在mask给定的诸多的FLAGS中,其值必须为1的FLAGS列表,余下的其值必须为0;

(3)ICMP匹配标记

iptables -A INPUT -p icmp --icmp-type 8 -j DROP

2.4.3 显式扩展匹配条件

必须用-m option选项指定扩展匹配的类型,常见的有以下几种,

(1)多端口匹配:以离散或连续的 方式定义多端口匹配条件,最多15个;

  • -m multiport --sport 源端口列表
  • -m multiport --dport 源端口列表
iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -j ACCEPT

(2)IP范围匹配:以连续地址块的方式来指明多IP地址匹配条件;

  • -m iprange --src-range 源IP范围
  • -m iprange --dst-range 目标IP范围
iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -m iprange --src-range 172.16.0.61-172.16.0.70 -j REJECT

(3)MAC地址匹配

  • -m mac --mac-source 源MAC地址

(4)状态匹配:限制收发包的状态

  • -m state --state 状态:状态包括INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED。每个状态的含义如下:
    NEW: 新连接请求;
    ESTABLISHED:已建立的连接;
    INVALID:无法识别的连接;
    RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接;
    UNTRACKED:未追踪的连接;

2.5 iptables服务的重启、备份与保存

上述对iptables的所有修改,当重启iptables后又失效,回到最初状态.

#重启iptables服务
systemctl restart iptables.service

'''备份与导入'''
#将当前iptables状态备份到某文件中
iptables-save > 文件路径及名称(如/root/桌面/ipt.txt)
将某文件的规则导入到当前iptables中
iptables-restore < 文件路径及名称(如/root/桌面/ipt.txt)

'''直接保存'''
service iptables save

3 NAT网络地址转换示例

网络拓扑图如下,其中将linux作为两个网段的网关。另外不给外网的winxp指定网关来模拟现实中私有地址无法在互联网传播的情形。

iptables目的地址变成域名了 iptables 地址转换_网络_05

3.1 示例1

假如内网主机win7想访问外网的winxp(web服务器),由于公网上不能出现私网IP,当数据包到达Linux时需要做nat网络地址转换。NAT网络地址转换的工作原理详见《第22节 NAT(网络地址转换)—实现公网IP和私网IP之间的转换》。操作步骤如下:

(1)查看NAT表详细信息。我们可以先输入命令iptables -t nat -nvL查看查看NAT表详细信息,如下图所示。可以看到NAT表有PREROUTING 、INPUT、OUTPUT、POSTROUTING四个链。

iptables目的地址变成域名了 iptables 地址转换_运维_06


(2)做NAT网络地址转换。在Linux上的外网端口配置NAT代码如下:

iptables -F FORWARD           #清空filter表中的转发链,由于默认策略是ACCEPT,清空后,就允许转发。

#在nat表的路由后链上首行新增一条规则:只要是源地址为192.168.1.0/24访问TCP协议且从ens34网卡出的数据就给其做源地址转换,并将源地址转换为12.1.1.254
iptables -t nat -I POSTROUTING -p tcp -o ens34 -s 192.168.1.0/24 -j SNAT --to-source 12.1.1.254

3.2 示例2

假如内网的公网IP并不是固定的12.1.1.254,公司买的是动态的公网IP,公网IP时常变换,这时的NAT网络地址转换代码如下:

iptables -t nat -I POSTROUTING -p tcp -o ens34 -s 192.168.1.0/24 -j MASQUERADE  #MASQUERADE为乔装的意思,是指进行动态转换
参考文章

[1] 《iptables命令使用详解》 [2] 视频传送门