操作命令
服务重启命令
启动指令:service iptables start
重启指令:service iptables restart
关闭指令:service iptables stop
保存指令:service iptables save
注:只修改/etc/sysconfig/iptables 使其生效的办法是修改好后先service iptables restart,
然后才调用/etc/rc.d/init.d/iptables save
载入规则:iptables-restore < /etc/sysconfig/iptables
然后是相关配置:/etc/sysconfig/iptables
CentOS 7.3:
查看状态:systemctl status firewalld
启动指令:service firewalld start
重启指令:service firewalld restart
关闭指令:service firewalld stop
开机禁用:systemctl disable firewalld
开机启用:systemctl enable firewalld
添加规则
命令语法:iptables -t 表名 -A 链名 匹配条件 -j 动作
示例:iptables -t filter -A INPUT -s 192.168.1.146 -j DROP
iptables -t nat -A PREROUTING -d 222.76.205.198/32 -p tcp -m tcp --dport 15009 -j DNAT --to-destination 192.168.122.116:63501
修改规则
命令语法:iptables -t 表名 -R 链名 规则序号 规则原本的匹配条件 -j 动作
示例:iptables -t filter -R INPUT 3 -s 192.168.1.146 -j ACCEPT
删除iptables规则
#查看规则编号
iptabales -nvL --line-number
命令语法:iptables -t 表名 -D 链名 规则序号
示例:iptables -t filter -D INPUT 3
#删除指定表的指定链中的所有规则,-F选项表示清空对应链中的规则,执行时需三思。
命令语法:iptables -t 表名 -F 链名
示例:iptables -t filter -F INPUT
修改默认策略
命令语法:iptables -t 表名 -P 链名 动作
示例:iptables -t filter -P FORWARD ACCEPT
报错
- iptables: No chain/target/match by that name.
# iptables -nL REDIS
iptables: No chain/target/match by that name.
--》没有REDIS链
开启snat需要开ip转发功能吗?
iptables跟内核其他模块哪个优先级较高
iptables是处理内核模块“Netfilter” 的用户级接口
iptables详解
转自:https://blog.csdn.net/qq_24601199/article/details/107469570)
【简介】
官方曰:iptables is the userspace command line program used to configure the Linux 2.4.x and later packet filtering ruleset. It is targeted towards system administrators.
Since Network Address Translation is also configured from the packet filter ruleset, iptables is used for this, too.
翻译过来大概内容是:iptables是提供给系统管理员用来配置linux 2.4以及之后版本包的过滤规则集的一个工具。
其实如果真正要说起来,iptables并不能称作一个防火墙,真正意义上的防火墙(安全框架)应该是netfilter,是linux系统核心层内部的一个数据包处理模块。netfilter提供三个服务:1、NAT;2、数据包内容修改;3、数据包过滤的防火墙功能。人们通过iptables这个工具将规则策略设定进netfilter罢了,时间一长,大家就习惯把iptables称作iptables防火墙了。
用通俗的语言解释一遍:netfilter就好比古代京城的保卫体系,iptables则为记录着允许进城/进宫/进殿规则的小册子。
(ps:由于iptables相关的知识点实在太多,所以本文只讲解基础的iptables原理以及常见的使用场景。)
【京城保卫体系(netfilter)详解】
基础工作原理
外部的数据包传进网卡后,通过内核的一系列处理后(这里不展开讲内核如何处理数据包的过程,之后有空会针对此处展开来讲),来到netfileter框架,根据设置好的规则(规则)对数据包的头部进行检查,如果符合条件,再根据规则内容进行相应的处理(转发出去或者转发至上层协议/应用),如果不符合,就丢弃(drop)此数据包。
五表五链
一、五表(Tables)
首先提个问题,表是什么?就我个人理解而言,表是具有同类规则的合集。
大家常说的四表分别是filter表、nat表、mangle表、raw表,其实还有一个就是几乎被大家忽略的security表。下面是各个表的简介:

二、五链(Chains)
链是什么?链是数据处理的流程,相关信息如下表

表、链、规则的关系
想必大家都知道这么一句话吧,表是由链构成,前面有说到,表是具有同类规则的合集,链是数据处理的流程,那么问题来了,表是实实在在存在的表,链只是个流程,这句话从逻辑上来讲似乎不那么合理。那么这就需要深究一下到底表是什么,链是什么了。
从代码层面来说,表是一个结构体,链是一个hook函数。学过c语言的同学对结构体应该是不陌生的,就是一些同类数据构成的数据集合。这时候你会发现表的定义和这个是类似的,但是hook函数可能就陌生了,那么hook函数是什么呢?hook翻译过来就是‘钩子’,就是在一个数据包/事件传输到下个点的途中,钩住它,然后监控、进行一些自己特定的操作,然后再传至下一个点。有没有发现这有点像arp欺骗,从中间截取你的数据包,然后进行一些操作,再传送至目标地址,这里只不过不是外部的处理,只是内部的一个合法的操作而已。
前文提到了很次根据规则处理,那么这个规则是什么呢?规则由一个目标(数据包经过匹配所有条件后的动作,即符合条件后的执行动作)和很多匹配(导致该规则可以应用的数据包所满足的条件,即数据包需要满足的条件)指定。
规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。
初始化并注册好的表的结构如下图(从大佬文章中借图,若侵权请告知删除,大佬文章链:接表(table)的注册与初始化)

五虎上将图
读书的时候老师讲解netfilter/iptables规则匹配判断过程时自研了一套五虎上将图,如今我用自己的语言将其重现出来,准备开始咯~

场景一
话说,三国时期蜀国那么一群战士打仗胜利归来,准备接受皇帝刘备的嘉奖,于是乎准备进宫,他们首先来到主城成都城门(PREROUTNING链),此时张飞负责把手入城口,查看了他们的身份证明(PREROUTNING链上的规则),确认了他们是即将要觐见的蜀国功臣们(符合PREROUTNING链上的规则),便打开城门欢迎他们进城;
进了城门后,他们顺着指引来到皇宫门口(INPUT链),这时负责镇守皇宫入口的关羽查看了皇帝刘备的圣旨(INPUT链上的规则),得知需要召见这群战士进宫领赏,于是将其放行入宫前去觐见;
进宫后,刘备很是欢喜,奖励黄金还给他们封了官侯,并又下了一道圣旨(上层协议/应用处理完后返回数据包),给他们带回军营嘉奖其他士兵。
授奖后,这一群人又启程准备回去军营继续坚守国土,又来到了赵云赵子龙把手的皇宫出口(OUTPUT链),确认此群人没有问题(匹配符合OUTPUT链上的规则),便放行出皇宫。
放行出宫后,因军中不能太久没有主帅,于是他们马上准备出城前往军营驻扎地,他们来到出城口(POSTROUTING链),把守出城口的马超查看了他们令牌后,便将其放行出城。
场景二
还是三国时期,话说又有那么几个刺客,准备通过主城去到其他城池完成刺杀任务,他们首先来到城门口,张飞查验他们蜀国身份令牌后,并了解了其将经过此城前往其他城池,于是放行起进城歇息。
来到主城后,他们经由主路(FORWARD链)准备歇息一下,并见了他们的老大黄忠,由于时局有变,他们被重新分配至其他的城池,连夜收拾行李带上新任务准备出发;
收拾好后他们来到马超把手的出城口(POSTROUTING链),经过查验没有问题放行;
iptables数据包流程详解
从上面的五虎上将图我们了解了大概的数据包流程,你会发现里面并没有提到表相关东西,那么究竟是如何进行的呢?下图为官方提供的

详细过程见下图

Linux ip_forward 数据包转发
转自:https://www.jianshu.com/p/134eeae69281
出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功能。
要让Linux系统具有路由转发功能,需要配置一个Linux的内核参数net.ipv4.ip_forward。这个参数指定了Linux系统当前对路由转发功能的支持情况;其值为0时表示禁止进行IP转发;如果是1,则说明IP转发功能已经打开。
要配置Linux内核中的net.ipv4.ip_forward参数有多种配置方式可供选择,下面分别介绍。
临时生效的配置方式
临时生效的配置方式,在系统重启,或对系统的网络服务进行重启后都会失效。这种方式可用于临时测试、或做实验时使用。
使用 sysctl 指令配置
sysctl 命令的 -w 参数可以实时修改Linux的内核参数,并生效。所以使用如下命令可以开发Linux的路由转发功能。
sysctl -w net.ipv4.ip_forward=1
有关 sysctl 指令的更详细介绍,请参见Linux的系统man手册(man sysctl),或其他有关sysctl指令详细介绍的文章。
修改内核参数的映射文件:/proc/sys/net/ipv4/ip_forward
内核参数在Linux文件系统中的映射出的文件:/proc/sys/net/ipv4/ip_forward中记录了Linux系统当前对路由转发功能的支持情况。文件中的值为0,说明禁止进行IP转发;如果是1,则说明IP转发功能已经打开。可使用vi编辑器修改文件的内容,也可以使用如下指令修改文件内容:
echo 1 > /proc/sys/net/ipv4/ip_forward
永久生效的配置方式
永久生效的配置方式,在系统重启、或对系统的网络服务进行重启后还会一直保持生效状态。这种方式可用于生产环境的部署搭建。
修改/etc/sysctl.conf 配置文件
在sysctl.conf配置文件中有一项名为net.ipv4.ip_forward的配置项,用于配置Linux内核中的net.ipv4.ip_forward参数。其值为0,说明禁止进行IP转发;如果是1,则说明IP转发功能已经打开。
需要注意的是,修改sysctl.conf文件后需要执行指令sysctl -p 后新的配置才会生效。
有关 sysctl 指令和sysctl.conf配置文件的更详细介绍,请参见Linux的系统man手册(man sysctl和man sysctl.conf),或其他有关sysctl指令和sysctl.conf配置文件的文章。
修改/etc/sysconfig/network配置文件
在文件最后添加一行:FORWARD_IPV4=YES
需要注意的是,修改/etc/sysconfig/network配置文件后需要重启网络服务(service netwrok restart)才能使新的配置生效。
例子
常见配置规则
/etc/sysconfig/iptables文件配置如下:
# Generated by iptables-save v1.4.7 on Fri Mar 2 19:59:43 2012
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [8:496]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#ping使用的端口
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT
-A INPUT -s 192.168.2.200/32 -d 192.168.2.200/32 -j ACCEPT
#允许服务器自己的SSH(对外部请求来说服务器是目标所以使用--dport)
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
#80端口不用说了吧,服务器网站访问端口
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 11211 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 11212 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
#53端口是DNS相关,TCP和UDP都要配置
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -p udp -m udp --dport 53 -j ACCEPT
#ping使用的端口
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT
-A OUTPUT -s 192.168.2.200/32 -d 192.168.2.200/32 -j ACCEPT
#允许服务器SSH到其他机器(使用外部端口就使用--dport)
-A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT
#允许服务器自己的SSH(自已为源输出就使用--sport)
-A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT
#访问外部网站80端口(使用外部端口就使用--dport)
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
#如果服务器需要访问外部网站,那么OUTPUT也需要配置53端口(使用外部端口就使用--dport)
-A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
#如果有访问外部邮箱,那么打开邮箱相关端口(使用外部端口就使用--dport)
-A OUTPUT -p tcp -m tcp --dport 465 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 110 -j ACCEPT
#服务器网站访问端口(自已为源输出就使用--sport)
-A OUTPUT -p tcp -m tcp --sport 80 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 3306 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 11211 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 11212 -j ACCEPT
COMMIT
针设备做端口做限制
**设备IP:**1.1.1.1
条件1:
-
针对IP:1.1.10.2 1.1.10.3
-
放开端口:tcp 21 20
条件2: -
针对IP:出口IP,指定设备IP段
-
放开端口:所有端口
出口IP:
1.1.3.0/24
1.1.4.0/24指定设备IP段:
1.1.1.0/24
1.1.2.0/24
条件3:
- 针对IP:其余IP
- 拒绝所有端口
#针对IP:1.1.10.2 1.1.10.3,放开tcp 21端口
iptables -A INPUT -s 1.1.10.2 -j ACCEPT
iptables -A INPUT -s 1.1.10.3 -j ACCEPT
#iptables -A INPUT -p tcp --dport 20:21 -s 1.1.10.2 -j ACCEPT
#iptables -A INPUT -p tcp --dport 20:21 -s 1.1.10.3 -j ACCEPT
#iptables -A OUTPUT -p tcp --sport 20:21 -d 1.1.10.2 -j ACCEPT
#iptables -A OUTPUT -p tcp --sport 20:21 -d 1.1.10.3 -j ACCEPT
#DNS解析
iptables -A INPUT -p udp --dport 53 -s 223.5.5.5 -j ACCEPT
iptables -A INPUT -p tcp --dport 20:21 -s 1.1.1.1 -j ACCEPT
#放开出口IP,指定设备IP段
iptables -I INPUT -s 1.1.3.0/24 -j ACCEPT
iptables -I INPUT -s 1.1.4.0/24 -j ACCEPT
iptables -I INPUT -s 1.1.1.0/24 -j ACCEPT
iptables -I INPUT -s 1.1.2.0/24 -j ACCEPT
#拒绝其他条件
iptables -P INPUT DROP
#保存规则
service iptables save
#查看
iptables -nvL