iptables

iptable 用法

Linux 网络和 iptables 运行原理

iptables 配置实践

简介

Linux 系统在内核中提供了对报文数据包过滤和修改的官方项目名为 Netfilter,它指的是 Linux 内核中的一个框架,它可以用于在不同阶段将某些钩子函数(hook)作用域网络协议栈。Netfilter 本身并不对数据包进行过滤,它只是允许可以过滤数据包或修改数据包的函数挂接到内核网络协议栈中的适当位置。这些函数是可以自定义的。

iptables 是用户层的工具,它提供命令行接口,能够向 Netfilter 中添加规则策略,从而实现报文过滤,修改等功能。Linux 系统中并不止有 iptables 能够生成防火墙规则,其他的工具如 firewalld 等也能实现类似的功能。

iptables 策略是由一组有序的规则建立的,它告诉内核应该如何处理某些类别的数据包。每一个 iptables 规则应用于一个表中的一个链。一个 iptables 链就是一个规则集,这些规则按序与包含某种特征的数据包进行比较匹配。

table 和 chain

iptables包含4个表,5个链。其中表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度。

chain(从图里面看出chain作用域)

  • INPUT(路由表后目的地为本机)、OUTPUT (由本机产生,向外转发)主要针对经过local的包
  • PREROUTING (数据包进入路由表之前),POSTROUTING(发送到网卡接口之前) 针对外来路由包)PREROUTING只能改dst,POSTROUTING只能改src
  • FORWARDING(通过路由表后,目的地不为本机

表的处理优先级:raw>mangle>nat>filter。

iptables 默认有 4 个表

  • filter 默认表 包含内置chain
    • INPUT (针对发往local socket的包)
    • FORWARD (for packets being routed through the box)
    • OUTPUT (针对本地产生的包)
  • nat 表(包是从新连接进来的时候会被查询,地址映射,端口映射)
    • PREROUTING (进来的时候改包)
    • INPUT
    • OUTPUT
    • POSTROUTING (出去的时候改包)
  • mangle (用于特定包修改) kernel 2.4.17 之前只有PREROUTING 和 OUTPUT 到 kernel 2.4.18 INPUT FORWARD POSTROUTING

  • raw 有限级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能

    RAW 表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链 上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了.

一个数据包到达时,是怎么依次穿过各个链和表的

iptables四个表与五个链_iptables_03

规则

每个 iptables 规则都包含一组匹配和一个目标动作,后者定义了复合规则的数据包应该采取什么处理行为。iptables 匹配指定是数据包必须匹配的条件,只有当数据包满足所有的匹配条件时,iptables 才能根据规则的目标所指定的动作来处理该数据包。

规则管理

参数 作用
-P 设置默认策略
-F 清空规则链
-L 查看规则链
-A 在规则链的末尾加入新规则
-I num 在规则链的头部加入新规则
-D num 删除某一条规则

规则约束

参数 作用
-s, –source address/[mask][,… 匹配来源地址 IP/MASK,加叹号 “!” 表示除这个 IP 外
-d 匹配目标地址
-i 网卡名称 匹配从这块网卡流入的数据
-o 网卡名称 匹配从这块网卡流出的数据
-p 匹配协议,如 TCP、UDP、ICMP
–dport num 匹配目标端口号
–sport port[:port] 匹配来源端口号 100:200 表示端口范围
sports port[,port:port,port…] 匹配多个源端口[范围]
   

规则动作 -j 参数

操作名 功能
ACCEPT 允许数据包通过
DROP 直接丢弃数据包,不给任何回应信息
QUEUE 将数据包移交到用户空间
RETURN 停止执行当前链中的后续规则,并返回到调用链(The Calling Chain)中
REJECT 拒绝数据包通过,必要时会给数据发送端一个响应的信息
DNAT 进行目标地址转换
SNAT 源地址转换,解决内网用户用同一个公网地址上网的问题
MASQUERADE 是 SNAT 的一种特殊形式,适用于动态的、临时会变的 ip 上
REDIRECT 在本机做端口映射
LOG 记录日志信息,除记录外不对数据包做任何其他操作,仍然匹配下一条规则

常用命令

debug 是否命中规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 选项-v,则iptables将列出数据包和字节计数器
# 选项-t,table名
# --line-numbers 列出规则号 方便删除
# -L 展示规则
# -n 让ip和端口以数字输出(更快输出) 默认输出host names, network names, or services
iptables -nvL -t nat --line-numbers

规则和链有计数器:
pkgs:有规则或链所匹配到的报文的个数
bytes: 由规则或链匹配到的所有报文大小之和

# 删除规则
iptables -t nat -D PREROUTING 1

# 将所有的 chain 的计数与流量统计都归零
iptables -t nat -Z

开启路由转发

1
2
3
4
5
6
7
# 关闭路由转发
echo 0 > /proc/sys/net/ipv4/ip_forward            
# 开启路由转发
echo 1 > /proc/sys/net/ipv4/ip_forward            
# 注意以上操作仅当前有效,计算机重启后无效,修改 / etc/sysctl.conf 配置文件,可以实现永久有效规则
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
sysctl -p

规则保存恢复

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 保存当前规则
iptables-save >/etc/sysconfig/iptables
iptables-save >/etc/sysconfig/iptables.20171125
# 恢复当前规则
iptables-restore </etc/sysconfig/iptables
iptables-restore </etc/sysconfig/iptables.20171125


# 端口黑名单
iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -s 10.18.200.73/32 -p tcp -m multiport --dport 3306,6379 -j DROP


# drop k8s node port
iptables -t raw -I PREROUTING -s xxxx  -p tcp -m multiport --dports 30000:32767 -j DROP

例子

121 通过165 访问243

端口转发

121访问165转发到243

10.81.24.121 10.81.24.165 10.81.24.243
  iptables -t nat -I PREROUTING -p tcp –dport 10000 -j DNAT –to-destination 10.81.24.243:22  
  iptables -t nat -I POSTROUTING -p tcp -d 10.81.24.243 –dport 22 -j SNAT –to-source 10.81.24.165  
     
  • 把发到165:10000的包dst改成243:22,再把改好的包的src改成165的

IP双向路由转发

121直接访问243,感知不到165的转发

10.81.24.121 fa:16:3e:66:96:63 10.81.24.165 fa:16:3e:7e:f0:bf 10.81.24.243 fa:16:3e:f1:b5:da
iptables -t nat -I OUTPUT -d 10.81.24.243 -j DNAT –to-destination 10.81.24.165 iptables -t nat -I PREROUTING -s 10.81.24.121 -j DNAT –to-destination 10.81.24.243  
  iptables -t nat -I POSTROUTING -s 10.81.24.121 -j SNAT –to-source 10.81.24.165  
     
  iptables -t nat -I PREROUTING -s 10.81.24.243 -j DNAT –to-destination 10.81.24.121 iptables -t nat -I OUTPUT -d 10.81.24.121 -j DNAT –to-destination 10.81.24.165
  iptables -t nat -I POSTROUTING -s 10.81.24.243 -j SNAT –to-source 10.81.24.165  

121ping243的过程

image-20211204125406169

更多列子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#在 FILTER 表的 INPUT 链匹配源地址是172.20.20.1的主机,状态分别是NEW,ESTABLISHED,RELATED 的都放行。

iptables -A INPUT -s 172.20.20.1/32 -m state --state NEW,ESTABLISHED -p tcp -m multiport --dport 123,110 -j ACCEPT

# -p 指定协议,-m 指定模块,multiport模块的作用就是可以连续匹配多各不相邻的端口号。完整的意思就是源地址是172.20.20.1的主机,状态分别是NEW, ESTABLISHED,RELATED的,TCP协议,目的端口分别为123 和 110 的数据包都可以通过。


# 配置内网白名单
-A INPUT -s 10.0.0.0/8 -j ACCEPT
-A INPUT -s 172.16.0.0/12 -j ACCEPT
-A INPUT -s 192.168.0.0/16 -j ACCEPT
# 配置外网白名单
-A INPUT -s 180.168.36.198 -j ACCEPT 
-A INPUT -s 180.168.34.218 -j ACCEPT 
-A INPUT -s 222.73.202.251 -j ACCEPT 
# 控制端口
-A INPUT -p tcp --dport 80 -j ACCEPT 
-A INPUT -p tcp --dport 22 -j ACCEPT
# 拒绝其它
-A INPUT -j DROP 
-A FORWARD -j DROP 
# 开放出口
-A OUTPUT -j ACCEPT 


# 屏蔽单个IP的命令
iptables -I INPUT -s 123.45.6.7 -j DROP

#封整个段即从 10.10.10.1 到 10.10.10.254的命令
iptables -I INPUT -s 10.10.10.0/24 -j DROP


# 添加规则 禁止tcp/9099 被访问
iptables -A INPUT -p tcp --dport 9099 -j DROP
# 删除规则
iptables -D INPUT -p tcp --dport 9099 -j DROP

# 连续端口配置
-A INPUT -p tcp --dport 21:25 -j DROP
# 多端口
-A INPUT -p tcp -m multiport --dport 21:25,135:139 -j DROP

防火墙(firewall)

1
2
3
4
5
6
7
8
9
10
systemctl status firewalld
# 应用
firewall-cmd --reload
# 查看开放的端口
firewall-cmd --list-ports
# add port
firewall-cmd --zone=public --add-port=8080/tcp --permanent
# del port
firewall-cmd --zone=public --remove-port=8080/tcp --permanent

firewall-cmd 是 firewalld的字符界面管理工具,firewalld是centos7的一大特性,最大的好处有两个:支持动态更新,不用重启服务;第二个就是加入了防火墙的“zone”概念。

firewalld跟iptables比起来至少有两大好处:

  • firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效。

  • firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链”而且对TCP/IP协议也不理解也可以实现大部分功能。

firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和 iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结 构以及使用方法不一样罢了。