1、匹配优先级
表优先级:raw表 > mangle表 > nat表 > filter表
链优先级:数据包进入主机网络接口后,首先会经过 PREROUTING 链,在此链中可以对数据包的目的 IP 地址或端口进行修改(如DNAT)。
然后内核根据数据包目的IP地址查询路由表判断该数据包是发往本机、还是需要转发,如果目的IP地址是本机(host),那么数据包途经INPUT链流向host然后途经OUTPUT链后从POSTROUTING链出站;否则使用路由转发,途径FORWARD链后从POSTROUTING链出站。
规则优先级:在链中,规则的匹配优先级是从上到下,先匹配规则链的第一条规则,接着第二条,如果都不匹配,根据规则链的默认策略处理。
2、规则命令格式
iptables [-t 表名] 管理选项 [链名] [条件匹配] [-j 目标动作或跳转]
-t 表名
这个表名就是规则表的名字,因为规则是在链中,然后链在表中,所以操作先指定表的名字,然后不指定表名的时候则默认为filter表。
管理选项
对链中的防火墙策略进行管理,常用选项如下
-A:在链尾追加一条新的规则
-I:在指定位置(或链首)插入一条新的规则
-R:修改、替换指定位置或内容的规则
-P:设置指定链的默认策略
-D:删除指定位置或内容的规则
-F:清除表中的所有规则
-L:列表查看各条规则信息
-N:创建一条新的规则链(自定义链)
-X:删除自定义的规则链
--line-numbers:查看规则使显示规则的行号
-n:以数字形式显示IP地址、端口等信息
-v:显示已捕获的数据包个数、字节数等详细信息
链名
指定该表中哪条链进行修改,当不指定链名的时候,默认表示该表内所有链
条件匹配
与管理选项相结合,通常是添加/删除/修改的规则(后面有实例)。除非设置规则链的默认策略,否则需要指定匹配条件。常用条件匹配参数如下
-p 协议名:这个指定计算机网络中协议名,可以指定的协议名在/etc/protocols文件中查看,常用的协议包括tcp、udp、icmp等。通过使用--dport指定目的端口,--sdport指定源端口。
-s 源地址/-d 目的地址:地址可以是单个IP地址,也可以是网络地址(带掩码长度)
-i 网卡/-o 网卡:-i对应接受数据包的网络接口,-o对应发送数据包的网络接口
--tcp-flags 检查范围 被设置的标记:--tcp-flags SYN,RST,ACK 表示检查SYN、RST、ACK这3个标记,只有SYN为1时满足条件
--icmp-type ICMP类型:进行icmp类型匹配,ICMP类型可以使用类型字符串或者对应的数值,例如Echo-Req、Echo-Reply
MAC地址匹配:使用-m mac 结合 --mac-source MAC地址的形式
多端口匹配:使用-m multiport结合--sports源端口列表或--dports目标端口列表的形式
IP地址范围匹配:使用"-m iprange"结合"--src-range 源IP范围"或者"--dst-range目标IP范围"的形式,以"-"符号连接起始IP地址、结束IP地址
-j 目标动作或跳转
当链表中的规则匹配时,防火墙对数据包处理的方式。有四种方式。
DROP:直接删除数据包,不进行任何结果的返回。
REJECT:删除数据包,但是会有返回消息(委婉的DROP)
ACCEPT:接受数据包
LOG:记录数据包,将其信息写入系统日志中,方便分析和管理(记录在/var/log/messages)
示例
bash
# 清空所有链规则
iptables -F
# 设置链的默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# 通过变量定义一个ip
#BLOCK_THIS_IP="x.x.x.x"
iptables -A INPUT -s "SBLOCK_THIS_IP" -j DROP
# 允许所有的SSH
#iptables -A INPUT-i eth0-p tcp --dport 22 -m state --state NEW,ESTABLISHED -j
ACCEPT
iptables -A OUTPUT-o ethO-p tcp --sport 22-m state --state ESTABLISHED-jACCEPT
# 允许一个网段访问SSH
iptables -A INPUT -i eth0 -p tcp -s X.Y.Z.0/24 --dport 22 -m state -state
NEW,ESTABLISHED -j ACCEPT
iptables-A OUTPUT-o eth0 -p tcp --sport 22-m state --state ESTABLISHED-j ACCEPT
# 允许HTTP
iptables -A INPUT-1 ethO -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
#iptables-A OUTPUT-o eth0-p tcp --sport 80-m state --state ESTABLISHED -jACCEPT
# 允许 HTTPS
iptables -A INPUT -i ethO-p tcp--dport 443-m state --state NEW,ESTABLISHED -j ACCEPT
#iptables -A OUTPUT-o eth0-p tcp--sport 443 -m state --state ESTABLISHED-jACCEPT
# 7. 多端口 (允许 SSH, HTTP, and HTTPS)
iptables -A INPUT-i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state
NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state
ESTABLISHED -j ACCEPT
# 出方向允许 SSH
iptables -A OUTPUT -o eth0 -p tcp --dport 22-m state--state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i ethO -p tcp --sport 22-m state --state ESTABLISHED -j ACCEPT
# 出方向允许一个特定网段访问SSH
iptables -A OUTPUT -o eth0 -p tcp -d A.B.C.0/24 --dport 22 -m state --state
NEW,ESTABLISHED -j ACCEPT
iptables -AINPUr-i eth0-p tcp--sport 22-m state --state ESTABLISHED -jACCEPT
# 出方向允许 HTTPS
iptables-A OUTPUT-o eth0-p tcp --dport 443-m state-state NEW,ESTABLISHED-j ACCEPT
iptables -A INPUT -i eth0 -p tcp -sport 443 -m state --state ESTABLISHED-j ACCEPT
# 进方向HTTPS负载均衡
iptables -A PRERoUTING -i etho -p tcp --dport 443 -m state --state NEW -m nth
--counter 0--every 3 --packet 0 -j DNAT --to-destination 192.168.x.Y1:443
#iptables -A PRERoUrING -i ethO -p tcp --dport 443 -m state =-state NEW -m nth
--counter 0--every 3--packet 1 -j DNAT --to-destination 192.168.x.Y2:443
#iptables -A PREROUTING -ietho -p tcp --dport 443-m state --state NEW-m nth
--counter 0--every 3 --packet 2 -J DNAT --to-destination 192.168.x.Y3:443
# Ping 从内到外
iptables -A OUTPUT-picmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -picmp --icmp-type echo-reply -j ACCEPT
# Ping 从外到内
iptables -AINPUT -picmp --icmp-type echo-request -j ACCEPT
iptables -A ouTPUT-picmp--icmp-type echo-reply -jACCEPT
# 允许loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -0 lo -] ACCEPT
# 15. Allow packets from internal network to reach external network.
# if ethl is connected to external network (internet)
#if eth0 is connected to internal network (192.168.1.x)
iptables -A FORWARD -i etho-o ethl -j ACCEPT
# 16. Allow outbound DNS
fiptables -A OUTPUT -p udp -o eth0--dport 53 -j ACCEPT
#iptables -A INPUT -p udp -i etho --sport 53 -j ACCEPT
# 17. Allow NIS Connections
#rpcinfo -p I grep ypbind ; This port is 853 and 850
fiptables -A INPUT -p tcp --dport 1ll -j ACCEPT
#iptables -A INPUT -p udp --dport 111 -j ACCEPT
iptables -A INPUT -p tcp --dport 853 -j ACCEPT
iptables -A INPUT -p udp --dport 853 -j ACCEPT
iptables -A INPUT -p tcp --dport 850 -j ACCEPT
#iptables -A INPUT -p udp --dport 850 -j ACCEPT
# 18. Allow rsync from a specific network
iptables -A INPUT -i eth0 -p tcp -s 192.168.x.0/24 --dport 873 -m state =-state
NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT-o ethO-p tcp--sport 873- state --state ESTABLISHED-jACCEPT
#19. Allow MysQL connection only from a specific network
iptables -A INPUT -ieth0-p tcp -s 192.168.Y.0/24--dport 3306 -m state --state
NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT-o ethO-p tcp-sport 3306 -m state --state ESTABLISHED -jACCEPT
# 20. Allow Sendmail or Postfix
iptables -A INPUT -i etho -p tcp --dport 25-m state --state NEW,ESTABLISHED -j ACEPT
iptables -A oUTPUT -o etho-p tcp--sport 25-m state -state ESTABLISHED-j ACEPT
#21. Allow IMAP and IMAPS
iptables -A INPUT -ieth0-p tcp--dport 143-m state --state NEW,ESTABLISHED-jACCEPT
iptables -A oUrPUT-o ethO-p tcp--sport 143-m state --state ESTABLISHED-jACCEPT
iptables-AINPUT-iethppdport99mstate--stateNEw,ESTABLISHED-ACCEPT
iptables -A OUrPUT-o eth0 -p tcp --sport 993 -m state--state ESTABLISHED-jACCEPT
# 22. Allow POP3 and POP3S
iptables-A INPUT-ieth0-p tcp-dport 110-m state --state NEW,ESTABLISHED-jACCEPT
iptables-A OUTPUT-o eth0-p tcp-sport 110-m state --state ESTABLISHED-jACCEPT
iptables-A INPUT-ieth0-p tcp--dport 995-m state--state NEW,ESTABLISHED-jACCEPT
iptables -A oUTPUT-o ethO-p tcp--sport 995-m state --state ESTABLISHED-jACCEPT
# 23. Prevent DoS attack
iptables -A INPUT-p tcp--dport 80-m limit--limit 25/minute --limit-burst 100 -j ACCEPT
# 24. Port forwarding 422 to 22
iptables -t nat -A PREROUTING -p tcp -d 192.168.A.B--dport 422 -j DNAT --to
192.168.102.37:22
iptables -A INPUT -1 ethO-p tcp --dport 422-m state =-state NEw,ESTABLISHED -j ACCEPT
iptables-A OUTPUT-o eth0-p top-sport 422-m state --state ESTABLISHED-jACCEPT
# 25. Log dropped packets
iptables -N LOGGING
iptables -A INPUT -j LOGGING
iptables -A LoGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet
Dropped:" --log-level 7
iptables -A LOGGING -j DROP