IPTABLES
1、原理说明
iptables是一款命令行工具,位于用户空间,使用该工具操作内核安全框架(netfilter)。netfilter是基于包过滤技术,而现在的下一代防火墙是基于状态。
1.1 组成结构
iptable的结构:iptables -> Tables -> Chains -> Rules
一个table由多个chain组成
一个chain由多个rule组成
1.2 五表五链
- 五表
- raw(状态跟踪表)
iptables是有状态的,nat表对数据包有连接追踪机制,raw便是关闭这种机制 - mangle(报标记表)
对报文头部进行拆解、修改、封装 - nat(地址转换表)
网络地址转换,源nat和目的nat - filter(包过滤表)
包过滤 - security
强制访问控制网络规则(如:SELinux)
优先级:raw --> mangle --> nat --> filter
- 五链
- PREROUTING
网卡到内核
在对数据包作路由选择之前,应用此链中的规则,如DNAT - INPUT
内核到用户空间
当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则 - OUTPUT
用户空间到内核
当防火墙本机向外发送数据包(出站)时,应用此链中的规则 - FORWARD
内核转发
当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则 - POSTROUTING
内核到网卡
在对数据包作路由选择之后,应用此链中的规则,如SNAT
1.3 连接追踪
iptables的状态跟踪连接有4种,除了从本机出去的数据包由NAT表的OUTPUT链处理外,其他所有的状态跟踪都在NAT表中的PREROUTING链中处理:
- NEW:意味着该信息包已经或将启动新的连接,或者它与尚未用于发送和接收信息包的连接相关联
- ESTABLISHED:指出该信息包属于已建立的连接,该连接一直用于发送和接收信息包并且完全有效
- RELATED:该信息包正在启动新连接,以及它与已建立的连接相关联
- INVALID:如果一个包没有办法被识别,或者这个包没有任何状态
- UNTRACKED:表示报文未被追踪,当报文的状态为Untracked时通常表示无法找到相关的连接。
1.4 数据流向
报文流入:PREROUTING --> INPUT
报文流出:OUTPUT --> POSTROUTING
报文转发:PREROUTING --> FORWARD --> POSTROUTING
1.5 路由选择
-
报文流入
根据主机地址判断包的目的地址是否为本机
是:PREOUTING --> INPUT
否:PREROUTING --> FORWARD -
报文流出
根据主机路由判断包的目的地址下一跳
OUTPUT --> POSTROUTING
1.6 匹配规则
规则由匹配条件和处理动作组成
规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则
2、语法说明
2.1 chain管理
-F, --flush [chain] #清空chain
-N, --new-chain chain #新建自定义chain
-X, --delete-chain [chain] #删除自定义chain
-Z, --zero [chain [rulenum]] #规则匹配计数清零
-P, --policy chain target #设置默认策略
-E, --rename-chain old-chain new-chain #重命名chain
2.2 rule管理
-A, --append chain [matches...] [target] #追加规则
-I, --insert chain [rulenum] [matches...] [target] #插入规则
-D, --delete chain [matches...] [target] #删除规则
-D, --delete chain rulenum #以规则编号删除规则
-R, --replace chain rulenum [matches...] [target] #替换规则
2.3 table查看
-L, --list [chain] #显示规则
-n, --numeric #数字方式显示
-v, --verbose #详细信息
-x, --exact #精确信息
--line-numbers #显示行号
2.4 匹配规则
- 基本匹配
[!] -s, --source address[/mask][,...] #匹配源地址
[!] -d, --destination address[/mask][,...] #匹配目的地址
[!] -p, --protocol protocol #匹配协议,/etc/protocols
[!] -i, --in-interface name #匹配进入网卡
[!] -o, --out-interface name #匹配出去网卡
- 扩展匹配
-m, --match match
2.5 处理动作
- 基本动作
-j, --jump target
target:
ACCEPT #允许
DROP #丢弃
RETURN #返回
- 扩展动作
-j, --jump target
target:
REJECT #拒绝
REDIRECT #端口重定向
LOG #记录日志
MARK #标记
DNAT #目的nat
SNAT #源nat
MASQUERADE #地址伪装
3、基础实战
3.1 添加规则
[root@node1 ~]# iptables -t filter -A INPUT -p icmp -j DROP
[root@node1 ~]# iptables -t filter -vnL INPUT
Chain INPUT (policy ACCEPT 148 packets, 9327 bytes)
pkts bytes target prot opt in out source destination
800 49038 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
0 0 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0
3.2 插入规则
默认插在行首
[root@node1 ~]# iptables -t filter -vnL INPUT
Chain INPUT (policy ACCEPT 154 packets, 9942 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
992 61074 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
0 0 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0
插入指定位置
[root@node1 ~]# iptables -t filter -I INPUT 2 -p tcp --dport=21 -j ACCEPT
[root@node1 ~]# iptables -vnL INPUT --line-number
Chain INPUT (policy ACCEPT 155 packets, 10018 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
2 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:21
3 1289 78810 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
4 0 0 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0
3.3 添加默认规则
1、查看默认规则
[root@node1 ~]# iptables -t filter -vnL
Chain INPUT (policy ACCEPT 7 packets, 448 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 5 packets, 436 bytes)
pkts bytes target prot opt in out source destination
2、修改默认规则
[root@node1 ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT #防止默认DROP后,断开SSH连接
[root@node1 ~]# iptables -t filter -P INPUT DROP
[root@node1 ~]# iptables -vnL INPUT
Chain INPUT (policy DROP 139 packets, 8380 bytes)
pkts bytes target prot opt in out source destination
153 8964 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
3、测试
ssh连接测试成功证明,该服务放行通过
[C:\~]$ ssh root@10.10.10.10
Connecting to 10.10.10.10:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
WARNING! The remote SSH server rejected X11 forwarding request.
Last login: Tue Mar 24 01:06:45 2020 from 10.10.10.1
ping包测试,可确认服务是否默认DROP
3.4 删除规则
[root@node1 ~]# iptables -t filter -D INPUT -p icmp -j DROP
[root@node1 ~]# iptables -vnL INPUT --line-number
Chain INPUT (policy ACCEPT 160 packets, 10719 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
2 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:21
3 1413 86522 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
显然这样删除比较麻烦,应以规则编号进行删除
[root@node1 ~]# iptables -t filter -D INPUT 2
[root@node1 ~]# iptables -vnL INPUT --line-number
Chain INPUT (policy ACCEPT 161 packets, 10795 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
2 1450 88898 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
3.5 替换规则
[root@node1 ~]# iptables -t filter -R INPUT 1 -p tcp -s 10.10.10.0/24 --dport 80 -j ACCEPT
[root@node1 ~]# iptables -vnL INPUT --line-number
Chain INPUT (policy ACCEPT 162 packets, 11039 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT tcp -- * * 10.10.10.0/24 0.0.0.0/0 tcp dpt:80
2 1721 105K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
3.6清空计数
[root@node1 ~]# iptables -t filter -Z INPUT 2
[root@node1 ~]# iptables -vnL INPUT --line-number
Chain INPUT (policy ACCEPT 170 packets, 12164 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT tcp -- * * 10.10.10.0/24 0.0.0.0/0 tcp dpt:80
2 6 364 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
实际已清空pkts和bytes计数,由于ssh传输产生
3.7 清空规则
清空一个chain规则
[root@node1 ~]# iptables -t filter -F INPUT
[root@node1 ~]# iptables -t filter -vnL INPUT --line-number
Chain INPUT (policy ACCEPT 191 packets, 13412 bytes)
num pkts bytes target prot opt in out source destination
清空所有chain规则
[root@node1 ~]# iptables -t filter -F
4、扩展匹配
tcp
-m tcp
[!] --source-port,--sport port[:port] #源端口
[!] --destination-port,--dport port[:port] #目的端口
[!] --tcp-flags mask comp #检查mask中标志位,其中,comp给定的标志位必为1,未给定的为0
SYN: 同步标志
ACK: 应答标志
FIN: 结束标志
RST: 复位标志,PST置1表示复位该连接
PSH: 推标志,PSH置1表示数据进入缓存队列,但不等待缓存队列写满,立即向上层提交数据。在处理 telnet 或 rlogin 等交互模式的连接时,该标志总是置位的。
URG: 紧急标志,URG置1表示数据紧急,直接交予上层不进入缓存队列
ALL: 上述所有标志
NONE: 未指定标志
[!] --syn #等价 --tcp-flags SYN,RST,ACK,FIN SYN
http的syn计数
[root@node1 ~]# iptables -t filter -A INPUT -p tcp --dport 80 --syn -j ACCEPT
[root@node1 ~]# iptables -vL INPUT
Chain INPUT (policy ACCEPT 1682 packets, 109K bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:http flags:FIN,SYN,RST,ACK/SYN
安全防护
#禁止nmap scan
[root@node1 ~]# iptables -t filter -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
#禁止无效组合
[root@node1 ~]# iptables -t filter -A INPUT -p tcp --tcp-flags ALL NONE -j DROP #所有标志位置0
[root@node1 ~]# iptables -t filter -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP #SYN和RST同时置1
[root@node1 ~]# iptables -t filter -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP #SYN和FIN同时置1
[root@node1 ~]# iptables -t filter -A INPUT -p tcp --tcp-flags RST,FIN RST,FIN -j DROP #FIN和RST同时置1
[root@node1 ~]# iptables -t filter -A INPUT -p tcp --tcp-flags FIN,ACK FIN -j DROP #FIN被置1,ACK置0
[root@node1 ~]# iptables -t filter -A INPUT -p tcp --tcp-flags PSH,ACK PSH -j DROP #PSH被置1,ACK置0
[root@node1 ~]# iptables -t filter -A INPUT -p tcp --tcp-flags URG,ACK URG -j DROP #URG被置1,ACK置0
udp
-m tcp
[!] --source-port,--sport port[:port] #源端口
[!] --destination-port,--dport port[:port] #目的端口
禁用dhcp,客户端监听udp 67号端口,服务端监听udp 68号端口
只允许10.10.10.254网关回包通过
[root@node1 ~]# iptables -t filter -A INPUT -s 10.10.10.254 -p udp --sport 68 --dport 67 -j ACCEPT
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT udp -- * * 10.10.10.254 0.0.0.0/0 udp spt:68 dpt:67
436 28482 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
icmp
-m icmp
[!] --icmp-type {type[/code]|typename} #icmp类型
typename type code
Echo Reply 0 0
Echo Request 8 0
在INPUT链禁止ping,其他主机无法ping通本机,ping包在INPUT链被拒绝
[root@node1 ~]# iptables -t filter -A INPUT -p icmp --icmp-type 0 -j REJECT --reject-with icmp-host-unreachable
[root@node1 ~]# iptables -t filter -vnL INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 0 reject-with icmp-host-unreachable
REJECT拒绝回包时定义返回信息可以使用
--reject-with icmp-host-unreachable
icmp-port-unreachable
icmp-proto-unreachable
icmp-net-prohibited
icmp-host-prohibited
在OUTPUT禁止ping,本机无法ping通其他主机,ping包在OUTPUT链被拒绝
[root@node1 ~]# iptables -t filter -A INPUT -p icmp --icmp-type 8 -j REJECT
[root@node1 ~]# iptables -t filter -vnL OUTPUT
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
1 84 REJECT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8 reject-with icmp-port-unreachable
multiport
-m multiport
[!] --source-ports,--sports port[,port|,port:port]... #源端口
[!] --destination-ports,--dports port[,port|,port:port]... #目的端口
[!] --ports port[,port|,port:port]... #源目端口
放行本机1024-1100和2000端口
[root@node1 ~]# iptables -t filter -vnL INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport sports 1024:1100,2000
iprange
-m iprange
[!] --src-range from[-to] #连续源IP
[!] --dst-range from[-to] #连续目的IP
禁止10.10.10.100-10.10.10.200访问本机
[root@node1 ~]# iptables -t filter -A INPUT -m iprange --src-range 10.10.10.100-10.10.10.200 -j DROP
[root@node1 ~]# iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 source IP range 10.10.10.100-10.10.10.200
string
-m string
--algo {bm|kmp} #模式匹配策略
[!] --string pattern #待匹配字串
[!] --hex-string pattern #待匹配base-16编码字串
--icase #忽略大小写
[root@node1 ~]# iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string 'GET /index.html' -j LOG
浏览器访问10.10.10.10/index.html后,查看日志
[root@node1 ~]# tail -n 1 /var/log/messages
Mar 24 08:33:14 node1 kernel: IN=ens33 OUT= MAC=00:0c:29:3e:3c:76:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.10 LEN=565 TOS=0x00 PREC=0x00 TTL=64 ID=61729 DF PROTO=TCP SPT=11041 DPT=80 WINDOW=4106 RES=0x00 ACK PSH URGP=0
禁止访问带有node1字样的页面
[root@node1 ~]# iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --icase --string 'node1' -j DROP
再次访问10.10.10.10,虽然http请求是进入主机,但出来的数据含有’node1’是被丢弃掉了
time
-m time
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] #开始日期
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] #结束日期
--timestart hh:mm[:ss] #开始时间
--timestop hh:mm[:ss] #结束时间
[!] --monthdays day[,day...] #一月的哪几天
1 to 31,没有31的月份不匹配,同样2月份
[!] --weekdays day[,day...] #一周的哪几天
Mon, Tue, Wed, Thu, Fri, Sat, Sun 或者 1 to 7
每天固定时间段匹配
[root@node1 ~]# iptables -t filter -A INPUT -p tcp --dport 80 -m time --timestart 10:00 --timestop 22:00 -j drop
按周固定时间段匹配
[root@node1 ~]# iptables -t filter -A INPUT -p tcp --dport 80 -m time --timestart 10:00 --timestop 22:00 --weekdays Sat,Sun -j drop
按固定日期匹配
[root@node1 ~]# iptables -t filter -A INPUT -p tcp --dport 80 -m time --datastart 2020-04-01T00:00:00 --datastop 2020-08-01T24:00:00
connlimit
根据每个地址或地址块做并发连接数限制
-m connlimit
--connlimit-upto n #conn src/prefix > n
--connlimit-above n #conn src/prefix ≤ n
--connlimit-mask prefix #ipv4为0-32,ipv6为0-128,指定时表示匹配地址的掩码从而计算网络号,未指定时为32或128表示主机地址
--connlimit-saddr #连接限制源地址
--connlimit-daddr #连接限制目的地址
限制每个客户端两个连接
[root@node1 ~]# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-upto 2 -j ACCEPT
[root@node1 ~]# iptables -P INPUT DROP
[root@node1 ~]# iptables -vL INPUT
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
36 6244 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh flags:FIN,SYN,RST,ACK/SYN #conn src/32 <= 2
[root@node1 ~]# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 -j DROP
[root@node1 ~]# iptables -P INPUT ACCEPT
[root@node1 ~]# iptables -vL INPUT
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP tcp -- any any anywhere anywhere tcp dpt:ssh flags:FIN,SYN,RST,ACK/SYN #conn src/32 > 2
可以看出上面两条规则是相反的包括默认规则
limit
-m limit
--limit rate[/second|/minute|/hour|/day] #令牌产生速率
--limit-burst number #令牌桶容量
iptables -t filter -R INPUT 1 -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
每分钟产生10个令牌,即每6秒钟1个,令牌桶的容量最大为5,由于请求不定达到,消耗令牌桶中令牌,但当桶中令牌消耗完以后,由于每6秒产生1个,即对请求实现限速操作
state
连接追踪机制:每台客户端和本机通讯时,本机有一段内存空间存储源目IP、源目端口以及每条记录的生存时间。当客户端再次与本机通信时,可查看之前存储的信息追踪客户端。但如果在负载均衡的情况下,客户端的请求并不是每次达到同一台主机,类似于华为防火墙做负载时需要通过心跳线同步连接状态信息。
连接追踪的最大连接数由/proc/sys/net/nf_conntrack_max定义,已追踪的连接记录到/proc/net/nf_conntrack文件中,超时则从文件中删除。超时时间(追踪时长)定义在/proc/sys/net/netfilter/目录下,不同协议或连接不同。
连接追踪状态
- NEW:新发出连接请求,与协议无关
- ESTABLISHED:连接建立
- RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系
- INVALID:无法识别的连接;
- UNTRACKED:未进行追踪的连接;
-m state
[!] --state state
INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED
修改连接追踪状态限制一般有两个方法:
(1) 加大 ip_conntrack_max 值
vi /etc/sysctl.conf
net.ipv4.ip_conntrack_max = 393216
net.ipv4.netfilter.ip_conntrack_max = 393216
(2): 降低 ip_conntrack timeout时间
vi /etc/sysctl.conf
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
追踪http新建连接
[root@node1 ~]# iptables -t filter -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
开放被动模式的FTP
1、装载FTP追踪时专用模块
[root@node1 ~]# modprobe nf_conntrack_ftp
2、放行请求报文
命令连接: NEW, ESTABLISHED
数据连接: RELATED, ESTABLISHED
[root@node1 ~]# iptables -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
[root@node1 ~]# iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
3、放行响应报文
[root@node1 ~]# iptables -A OUTPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
5、NAT表
源NAT
-j SNAT
--to-source [ipaddr[-ipaddr]][:port[-port]] #映射源ip:port到指定范围ip:port
--random #随机映射源ip:port
--persistent #为每个连接提供相同映射ip:port
-o netcard -j MASQUERADE #针对拨号,IP地址不固定时,映射至网卡
目的NAT
-j DNAT
--to-source [ipaddr[-ipaddr]][:port[-port]] #映射目的ip:port到指定范围ip:port
--random #随机映射目的ip:port
--persistent #为每个连接提供相同映射ip:port
例子:
[root@node1 ~]# iptables -t nat -A POSTROUTING -s 10.10.10.10 ! -d 10.10.10.10 -j SNAT --to-source 10.10.10.254
[root@node1 ~]# ping -I 10.10.10.10 10.10.10.254
抓包结果
6、MANGLE表
MARK大写为标记模块,mark小写为匹配模块
-j MARK
--set-mark value[/mask] #标记数据包
-j CONNMARK
--set-mark value[/mask] #标记连接
--save-mark [--mask mask] #将数据包的nfmark保存在连接中
--restore-mark [--mask mask] #恢复保存的nfmark值,即将连接中的nfmark值设置到同一连接的数据包中
-m mark
[!] --mark value[/mask] #匹配指定nfmark值的数据包
-m connmark
[!] --mark value[/mask] #匹配指定nfmark值的连接
路由策略
1、打标记
[root@node1 ~]# iptables -t mangle -A PREROUTING -i ens33 -p tcp --dport 80 -j MARK --set-mark 1
[root@node1 ~]# iptables -t mangle -vnL PREROUTING
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 MARK tcp -- ens33 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 MARK set 0x1
2、建表
[root@node1 ~]# ip rule add from all fwmark 1 table 10
[root@node1 ~]# ip rule list table 10
32765: from all fwmark 0x1 lookup 10
3、路由策略
[root@node1 ~]# ip route add default via 10.10.10.254 dev eth1 table 10
[root@node1 ~]# ip route list table 10
default via 10.10.10.254 dev ens33
7、自定义链
1、创建自定义链
[root@node1 ~]# iptables -t filter -N http_80
2、引用自定义链
[root@node1 ~]# iptables -t filter -A http_80 -p tcp --dport 80 -j ACCEPT
[root@node1 ~]# iptables -t filter -A INPUT -p tcp --dport 80 -j http_80
[root@node1 ~]# iptables -vnL INPUT; iptables -vnL http_80
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 http_80 tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
Chain http_80 (1 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
3、重命名自定义链
[root@node1 ~]# iptables -t filter -E http_80 http
[root@node1 ~]# iptables -vnL http
Chain http (1 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
4、删除自定义链
[root@node1 ~]# iptables -t filter -X http