官方链接:
https://man7.org/linux/man-pages/man8/iptables.8.html
非权威翻译,翻译结果仅供参考。
后文用iptables泛指iptables和ip6tables
Name
iptables/ip6tables IPV4/IPV6 数据包过滤和NAT管理工具
DESCRIPTION
iptables被用来建立,维护,检查linux内核数据包过滤规则。可以定义一些不同的表,每一个表包含了一些内置的chain和用户自定义的chain。
每一个chain是一组用来匹配数据包的规则,每个规则指明数据包匹配上了应如何做,这个叫target,也可能跳到同一个表里面的用户自定义的chain。
TARGETS
目前有五个独立的表。
-t --table table
这个选项指明了应该使用哪个table。如果内核配置的是自动加载模块,如果没有加载则会自动加载。
有如下几种表:
filter:
默认的表,如果-t没有指定,包含了如下几种内置的chains,INPUT(数据包的目的是本地sockets),FORWARD(要被路由的包),OUTPUT(本地生成的包?)
nat:
当一个数据包建立一个新连接遇到问题,这个表会被查询。它包含四个内置的chain:PREROUTING(数据包到达则会触发)INPUT(目的地是本地sockets的数据包)OUTPUT
(本地产生的数据包,路由之前),POSTROUTING(将要发送出去的数据包)
mangle:
这个表专门用来修改数据包,2.4.17之前,它有两个内置的chain,PREROUTING(进来的包路由之前)OUTPUT(本地产生的数据包,路由之前),2.4.18之后,又添加了3个内置的chain:INPUT(进入到它自己box的数据包)FORWARD:修改的数据包被路由出去;
raw:
这个表主要用来面向连接跟踪,结合NOTRACK类型的target配置豁免,它注册在netfilter的钩子函数拥有很高的优先级,在ip_conntrack之前被调用,或者其它ip表之前。它提供如下内置chain:prerouting(通过任何网络接口过来的数据包)OUTPUT(本机进程生成的数据包)
security
这个表是用来控制网络接入规则,就像那些通过SECMARK和CONNSECMARK target控制的。强制接入控制通过Linux Security模块,就像SELinux。security表是滞后于filter表被调用,DAC规则是早于MAC规则,这个表提供了下面3个内置的chains:INPUT(进来的数据包),OUTPUT(本地生成的数据包,在被路由之前),FORWARD(本机路由的包)
OPTIONS
options可以被分为几个不同的组
COMMANDS
这些选项用来指定期望的动作,命令行通常只有一个,除了几个特殊情况。对于长版本的命令和选项名字,应该写的完整。
-A,--append chain rule-specification
在选择的chain后面,追加一条或者多条规则,当源或者目的地址名字解析到大于一个地址,每一条可能的地址后面都会加一条规则。
-C,--check
检查一条规则是否匹配在选择的这个chain上,同-D一样的逻辑,但是不使用已经存在的配置并且使用他们的退出码来表示成功或者失败?没看懂
-D --delete
删除一个或者多个规则从选择的chain里面,可以加规则,也可以加规则顺序。
-I,--insert
插入一条或者多条规则,默认是从头插入。
-R,--replace
替换一条规则
-L,--list
列出当前选择的chain的所有规则,如果没有指定chain,则所有的chain都会列举出来,就像每一个iptables的命令,它对应的是一个具体的表,所以列出NAT的rules命令行是:
iptables -t nat -n -L ,通常都携带着-n参数,就不会花费大量时间在DNS解析上,通常也携带着-Z选项,chain就可以自动列出来并且归零,精确的输出也要通过其它选项,如果使用了iptables -L -v则会抑制这种输出
-S,--list-rules
输出选择的chain上所有的规则
-F,--flush
删除选择的chain上所有的规则
-Z,--zero
在所有的chains上归零packet和byte计数,或者指定的chain,或者指定的规则,和-L结合起来是合法的,可以在清理之前先显示计数
-N,--new-chain
创建一个自定义的chain
-X,--delete-chain
删除用户自定义的chain,前提是这个chain没有被引用,这个chain是空的。如果没有给定参数,将会尝试删除表里面的所有自定义的chain
-P,--policy
对于内置的chain设置target,policy必须是ACCEPT或者DROP
-E,--rename-chain
重命名用户自定义chain
-h
PARAMETERS
接下来的参数组成了规则说明书(被用在add,delete,insert,replace和append command)
-4,--ipv4
-6,--ipv6
-p,--protocol
可以是tcp,udp,udplite,icmp,icmpv6,esp,ah,sctp,mh,也可以是all,也可以使用/etc/protocols文件里面对应的数字
-s, --source address
源说明,地址可以是network名字,主机名字,网络ip地址,纯ip地址,hostnames会被立即解析,再把规则加到内核。尽量不要使用需要解析的名字。可以用多个ip地址,这个就成了需要多条规则。
-d,--destination address
和-s类似
-m,--match match
没看懂
-j, --jump target
指定规则的target,就是说packet匹配上了接下来做啥,target可以是用户自定义的chain,也可以是内置的targets,或者是一个extension,如果在一条规则里面这个选项没有用到,并且也没有用-g,则匹配上了不会对包做处理,但是会做计数
-g,--goto chain
这个表明接下来进入到另外的用户自定义的chain继续处理,不像--jump选项返回不会继续在这条chain上继续处理,会到调用jump的chain上继续处理。
-i,--in-interface name
指明哪个网口收到的数据包,进入到INPUT,FORWARD,PREROUTINGchain里面,如果后面有+,则是能匹配到的都是
-o,--out-interface name
类比-i
-f,--fragment
指的是只匹配分片报文的除了首段的报文,如果在f前面加了!,则指的是只匹配分片的首段,或者不分片的报文。
-c,--set-counters
这个允许对一条规则的packet或者byte计数
other options
-v,--verbose
冗余输出,可以显示像接口名字,规则选项,计数等等信息,多个-v,可以打印出更详细的信息。
-w,--wait
跑多个进程时,会有lock,设置时间等待。
-W,--wait-interval
没有细看,跟-w类似吧
-n,--numeric
用数字来显示,通常程序会尝试显示这些数字为主机名字,网络名字或者服务名字。
-x,--exact
显示精准的数字,而不是用M,K等等,这个选项只跟-L命令有关联
--line-number
打印规则时,把行号在规则前面显示出来
--modprobe=command
加载必须的模块