[云原生网络]iptables

316 阅读5分钟

在云原生领域iptables 是绕不开的一个功能,许多我们常见的组件都是基于iptables 实现的功能,比如kube-proxy 又比如calico cni 等等,所以在网络排错或者网络调优都需要了解iptables的规则

一、四表五链

四表 iptables的功能——filter, nat, mangle, raw.

filter:控制数据包是否允许进出及转发(INPUT、OUTPUT、FORWARD),(这个规则表是预设规则表,这个规则表顾名思义是用来进行封包过滤的理动作)

nat:控制数据包中地址转换,可控制的链路有prerouting, input, output, postrouting( 主要功能为进行一对一、一对多、多对多等网址转译工作(SNATDNAT))

mangle:修改数据包中的原数据,可控制的链prerouting, input, forward, output, postrouting(除了进行网址转译工作会改写封包外,在某些特殊应用可能也必须去改写封包(ITL、TOS)或者是设定MARK(将封包作记号,以进行后续的过滤)这时就必须将这些工作定义在mangles规则表中)

raw:控制nat表中连接追踪机制的启用状况,可以控制的链路有prerouting, output(RAW表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链上,RAW表处理完后,将跳过NAT表和ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了.)

4个表的优先级由高到低:raw-->mangle-->nat-->filter,

五链:内核中控制网络的NetFilter定义的五个规则链

PREROUTING, 路由前

INPUT, 数据包流入口

FORWARD, 转发管卡

OUTPUT, 数据包出口

POSTROUTING, 路由后

二、堵通策略

accept、drop、reject(drop收到数据直接不回、reject回复拒绝)

三、iptables命令

iptables [-t table] COMMAND [chain] CRETIRIA -j ACTION

  -t table,是指操作的表,filter、nat、mangle或raw, 默认使用filter

  COMMAND,子命令,定义对规则的管理

  chain, 指明链路

  CRETIRIA, 匹配的条件或标准

  ACTION,操作动作

例如,不允许10.8.0.0/16网络对80/tcp端口进行访问,

iptables -A INPUT -s 10.8.0.0/16 -d 172.16.55.7 -p tcp --dport 80 -j DROP

3.1命令

操作命令:-A, -I, -D, -R, -P -F

查看:-xnvL:

L:list列出规则
-S:显示指定链的所有规则
v:显示详细信息
x:在v的基础上禁止单位换算
n:只显示ip地址和端口号,不显示域名和服务名称
iptables -t nat -vxnL PREROUTING
详细列出nat表PREROUTING链的所有规则

-A

-A<链名>   追加一条规则放在最后
append
iptables -t filter -A INPUT -j DROP
在表fil的input链追加规则作为最后一条匹配所有访问本机的数据包,并丢弃

-I

-I<链名>[x]
insert
插入一条规则为第x条

-D

-D<链名>[规则号码|具体规则内容]
delete删除一条规则
(1,若有多条相同规则,按内容匹配只删除最小的一条
2,确保规则或号码存在,否则报错)

-R

-R<链名>[规则号码]<具体规则内容>
replace替换一条规则

-P

-P<链名>[动作]
policy 设置某个链的默认规则
iptables -P INPUT DROP
设置filter表的INPUT链的默认规则是DROP
(当数据包没被任何规则匹配到,按默认规则,动作前面不能加 -j

-F

-F[链名]
flush 清空所有规则
(1-F仅仅清楚链中的规则,并不影响-P设置的默认规则
2-P设置DROP后使用-F要小心
3如果不写链名,则默认清空表中所有链)

  -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, 设置链路的默认策略

3.2匹配条件

流入流出 -i -o 、来源目的地址 -s -d 、协议类型 -p 、来源目的端口 --sport 、--dport

3.3动作

ACCEPT、DROP、SNAT、DNAT、MASQUERADE(动作一般写法 -j ACCEPT)

RETURN返回 在自定义链执行完毕后使用返回,来返回原规则链。
MARK:打防火墙标记的
MASQUERADE:源地址伪装
REDIRECT:重定向:主要用于实现端口重定向

DNAT
-to-destination [ipaddr[-ipaddr]][:port[-port]] 轮询访问
--random 随机访问
--persistent 固定访问

3.4附加模块(-m)

按包状态匹配:state、按来源mac匹配:mac、按包速率匹配:limit、多端口匹配:multiport

-m state --state
状态有NEW、RELABTED、ESTABLISHD、INVALID
    ?、连接态、衍生态、不能被识别属于哪个连接或没有任何状态
iptables -A INPUT -m state --state RELABTED,ESTABLISHD\ -j ACCEPT
-m mac --mac-source MAC
匹配某个mac地址
iptables -A FORWARD -m mac --mac-source xx:xxx:xx:xx:xx:xx -j DROP
(报文经过路由后,数据包中的原有的mac地址会被替换,所以再路由后的iptables中使用mac模块没意义)
-m limit --limit [匹配速率]
用一定的速率去匹配数据包
iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s \ -j ACCCEPT
iptables -A FORWARD -d 192.168.0.1  -j DROP
(limit只是匹配,想要限制的话,后面要再单独加命令)
-m multiport <--sports|--dports|--ports>[端口1,端口2,。。。端口n]
一次性匹配多个端口
iptables -A INPUT -p tcp -m multiport --dports\21,22,23,24 -j ACCEPT
必须和-p一起使用
-m connlimit
  --connlimit-upto n

  --connlimit-above n
用于限制同一IP可建立的连接数目
-m string 
匹配数据包中的字符
  --algo {bm|kmp}
  [!] --string pattern
  [!] --hex-string pattern
  --from offset
  --to offset
  iptables -I OUTPUT -m string --algo bm --string "gay" -j REJECT
-m time
匹配数据包到达的时间

  --timestart hh:mm[:ss]

  --timestop hh:mm[:ss]

  [!] --weekdays day[,day...]

  [!] --monthdays day[,day...]

  --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

  --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

  --kerneltz:使用内核配置的时区而非默认的UTC
-m iprange
以连续地址块的方式来指明多IP地址匹配条件;

  [!] --src-range from[-to]

  [!] --dst-range from[-to]
  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
-m comment --comment "note"