iptables基本用法

iptables基本用法

iptables -L --line-numbers #查看规则
iptables -S #打印规则

command含义

iptables -A chain rule
将rule添加到chain,是附加,不是add的意思。

一般情况下,最后的规则是丢弃所有数据包,如果丢弃后再增加规则就没有意义。如果插入到中间位置需要用-I指令。

iptables -D chain rule/rulenum
从chain中删除rule,可以指定rulenum

iptables -I chain [rulenum] rule
将rule添加到chain中的第rulenum规则之后,如果没有指定将替换第一条规则

iptables -R chain [rulenum] rule
将chain中第rulenum条规则替换为rule,没有指定则替换第一条

iptables -L
列出规则

iptables -S
打印规则

iptables -F
清空规则

iptables -Z
把chain或者所有chain的包及字节的计数器清空(统计值清空)

--new -N chain
创建一个名称为chain的新链

iptables -X [chain]
删除用户自定义chain,不影响预设规则

iptables -P chain target
改变chain的策略为target
target在iptables的意思是处理动作,具体包括:accept、drop、reject等。
参考链接:https://www.zsythink.net/archives/1199

iptables -E old-chain new-chain
将旧链名称改为新链名称,这样会使引用旧链的规则失效。

iptables规则中参数定义

-P 代表协议 protocol
指明当前规则针对的传输协议,如tcp、udp、icmp等,使用all将适应所有协议,如果没有指定-p,默认使用all参数

-S 代表原地址 source
指定数据包源地址,可以使ip、网络地址或主机名,对于网络掩码使用/mask。如果不指定-s参数,默认匹配所有源地址

-D 代表目的地址 destination
指定数据包的目的地址,方法同-s类似,不同之处在于-s指源,-d指目的

-J 带包跳转 target
意思是jump到目标,指定当数据包满足该规则就跳转到下一个处理规则,而不再顺序执行后面的判断(类似于continue、yield),可能的指是accept、drop、queue、return,分别表示接受、丢弃、进入队列、返回(跳出到上层chain),可以跳转到自定义chain
SNAT 基于源地址转换,可以转换为固定外网地址
MASQUERADE 动态伪装
REDIRECT 重定向,主要实现端口重定向

-I 代表IN INTERFACE 入站接口
指网络数据处理的网卡,一般eth0表示第一块外网接口,lo表示内网接口。-i表示输入时的接口,-o特指输出用的接口。如果不指定-i参数,默认所有接口都匹配规则。制定数据包进入input、forward、prerouting链时经由的接口

-O 代表 OUT INTERFACE 出站接口
与-I类似

其他参数选项(主要用于匹配)

--sport 表示源端口 用于 -p tcp 或者 -p udp
默认匹配所有端口,可以使用端口号或者名称。使用号码效率更高,也可以用(:)匹配端口范围

--dport 表示目的端口 用于 -p tcp 或者 -p udp
与sport用法类似,区别在于对象是目的端口

--tcp-flags 表示tcp flags 用于 -p tcp
可以用英文逗号来指定多个tcp状态标识,可能的值有:SYN、ACK、FIN、RST、URG、PSH

--icmp-type 表示icmp type 用于 -p icmp
例如 0表示Echo Reply;8表示Echo

-m comment --comment "str" 表示注释

-m state --state NEW,ESTABLISHED,INVALID,RELATED 表示数据状态
分别代表:想要建立连接的封包状态,已经联机成功的状态,无效封包,封包与主机发出的封包有关。

补充概念:链和表

链:
这些"关卡"在iptables中为什么被称作"链"呢?我们知道,防火墙的作用就在于对经过的报文匹配"规则",然后执行对应的"动作",所以,当报文经过这些关卡的时候,则必须匹配这个关卡上的规则,但是,这个关卡上可能不止有一条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了"链",所以,我们把每一个"关卡"想象成如下图中的模样  ,这样来说,把他们称为"链"更为合适,每个经过这个"关卡"的报文,都要将这条"链"上的所有规则匹配一遍,如果有符合条件的规则,则执行规则对应的动作。(下图所示)包括:prerouting、input、output、forward、postrouting

表:
我们把具有相同功能的规则的集合叫做"表",所以说,不同功能的规则,我们可以放置在不同的表中进行管理,而iptables已经为我们定义了4种表,每种表对应了不同的功能,而我们定义的规则也都逃脱不了这4种功能的范围,所以,学习iptables之前,我们必须先搞明白每种表 的作用。
filter表:负责过滤功能,防火墙;内核模块:iptables_filter
nat表:network address translation,网络地址转换功能;内核模块:iptable_nat
mangle表:拆解报文,做出修改,并重新封装 的功能;iptable_mangle
raw表:关闭nat表上启用的连接追踪机制;iptable_raw

表的优先级:raw --> mangle --> nat --> filter

表链关系:
我们可以认为链是流程,而表是对流程的节点归类。

以下就是各链中包含的表种类:
PREROUTING      的规则可以存在于:raw表,mangle表,nat表。
INPUT          的规则可以存在于:mangle表,filter表,(centos7中还有nat表,centos6中没有)。
FORWARD         的规则可以存在于:mangle表,filter表。
OUTPUT         的规则可以存在于:raw表mangle表,nat表,filter表。
POSTROUTING      的规则可以存在于:mangle表,nat表。

我们在实际的使用过程中,往往是通过"表"作为操作入口,对规则进行定义的,之所以按照上述过程介绍iptables,是因为从"关卡"的角度更容易从入门的角度理解,但是为了以便在实际使用的时候,更加顺畅的理解它们,此处我们还要将各"表"与"链"的关系罗列出来:
表(功能)<-->   链(钩子):

raw     表中的规则可以被哪些链使用:PREROUTING,OUTPUT

mangle  表中的规则可以被哪些链使用:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

nat     表中的规则可以被哪些链使用:PREROUTING,OUTPUT,POSTROUTING(centos7中还有INPUT,centos6中没有)

filter  表中的规则可以被哪些链使用:INPUT,FORWARD,OUTPUT
链
流程

配置示例

https://github.com/openconnect/recipes/blob/master/ocserv-firewall-iptables-ipv4.md

*nat
:INPUT ACCEPT [0:0]
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
# Generic NAT for LAN Network 192.168.5.0/24  
-A POSTROUTING -s 192.168.5.0/24 -o eth0 -j MASQUERADE
COMMIT

*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# START INPUT RULES
# Stateful Rule - INPUT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# ACCEPT traffic from Loopback interface
-A INPUT -i lo -j ACCEPT
# ACCEPT SSH from LAN
-A INPUT -p tcp -m tcp -i eth1 --dport 22 -j ACCEPT
# ACCEPT DHCP from LAN
-A INPUT -p udp -m udp -i eth1 --dport 67:68 -j ACCEPT
# ACCEPT Webmin from LAN (Optional, only for Webmin users)
-A INPUT -p tcp -m tcp -i eth1 --dport 10000 -j ACCEPT
# ACCEPT DNS UDP From LAN
-A INPUT -p udp -m udp -i eth1 --dport 53 -j ACCEPT
# ACCEPT DNS TCP From LAN
-A INPUT -p tcp -m tcp -i eth1 --dport 53 -j ACCEPT
# ACCEPT ping from LAN
-A INPUT -p icmp --icmp-type echo-request -i eth1 -j ACCEPT
# ACCEPT OpenConnect TCP From WAN
-A INPUT -p tcp -m tcp -i eth0 --dport 443 -j ACCEPT
# ACCEPT OpenConnect UPD From WAN
-A INPUT -p udp -m udp -i eth0 --dport 443 -j ACCEPT
# DROP wan traffic
-A INPUT -i eth0 -j DROP
# LOG LAN
-A INPUT -i eth1 -j LOG --log-prefix "IPTABLES-LOG-INPUT-LAN:" --log-level 4
# ACCEPT LAN traffic - Learning rule - Should be changed to DROP once custom rules are created.
-A INPUT -i eth1 -j ACCEPT
# LAST RULE - DROP all traffic
-A INPUT -j DROP
# END INPUT RULES
	
# START FORWARD RULES
# Stateful Rule - FORWARD
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# ACCEPT LAN to WAN
-A FORWARD -s 192.168.5.0/24 -j ACCEPT
# LOG Forwarded traffic
-A FORWARD -j LOG --log-prefix "IPTABLES-LOG-FORWARD:" --log-level 4
# LAST RULE - ACCEPT all traffic - Should be changed to DROP once custom rules are created.
-A FORWARD -j ACCEPT
# END FORWARD RULES

# START OUTPUT RULES
# Stateful Rule - OUTPUT 
-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# LOG Outgoing traffic
-A OUTPUT -j LOG --log-prefix "IPTABLES-LOG-OUTPUT:" --log-level 4
# LAST RULE - ACCEPT all traffic - Should be 	changed to DROP once custom rules are created.
-A OUTPUT -j ACCEPT
# END OUTPUT RULES
COMMIT
 

留下评论