iptables

1、原理说明

在这里插入图片描述

iptables是一款命令行工具,位于用户空间,使用该工具操作内核安全框架(netfilter)。netfilter是基于包过滤技术,而现在的下一代防火墙是基于状态。

1.1 组成结构

在这里插入图片描述

iptable的结构:iptables -> Tables -> Chains -> Rules

一个table由多个chain组成
一个chain由多个rule组成

1.2 五表五链

  • 五表
  1. raw(状态跟踪表)
    iptables是有状态的,nat表对数据包有连接追踪机制,raw便是关闭这种机制
  2. mangle(报标记表)
    对报文头部进行拆解、修改、封装
  3. nat(地址转换表)
    网络地址转换,源nat和目的nat
  4. filter(包过滤表)
    包过滤
  5. security
    强制访问控制网络规则(如:SELinux)

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

  • 五链
  1. PREROUTING
    网卡到内核
    在对数据包作路由选择之前,应用此链中的规则,如DNAT
  2. INPUT
    内核到用户空间
    当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则
  3. OUTPUT
    用户空间到内核
    当防火墙本机向外发送数据包(出站)时,应用此链中的规则
  4. FORWARD
    内核转发
    当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则
  5. 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 匹配规则

  1. 基本匹配
  [!] -s, --source address[/mask][,...]					#匹配源地址
  [!] -d, --destination address[/mask][,...]			#匹配目的地址
  [!] -p, --protocol protocol							#匹配协议,/etc/protocols
  [!] -i, --in-interface name							#匹配进入网卡
  [!] -o, --out-interface name							#匹配出去网卡
  1. 扩展匹配
  -m, --match match

2.5 处理动作

  1. 基本动作
  -j, --jump target
  
  target:
      ACCEPT											#允许
      DROP												#丢弃
      RETURN											#返回
  1. 扩展动作
  -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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值