当前位置 : 首页 » 文章分类 :  开发  »  Linux-iptables

Linux-iptables

Linux 防火墙 iptables
https://www.netfilter.org/


朱双印 老师的 iptables 系列文章很经典
https://www.zsythink.net/archives/1199

iptables简介

iptables 的前身叫 ipfirewall (内核1.x时代),这是一个作者从 freeBSD 上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是 ipfirewall 工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到 2.x 系列的时候,软件更名为 ipchains, 它可以定义多条规则,将他们串起来,共同发挥作用。而现在,它叫做 iptables, 可以将规则组成一个列表,实现绝对详细的访问控制功能。


四表五链

iptables 采用 “规则表” + “处理链” 的分层结构。

表(tables)提供特定的功能,iptables 内置了4个表:

  • filter表,用于实现包过滤
  • nat表,用于实现网络地址转换
  • mangle表,用于包重构(修改)
  • raw表,用于数据跟踪处理

链(chains)是一些按顺序排列的规则的列表,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定 义的默认策略来处理数据包。

四表

1、Filter表
三个链:INPUT、FORWARD、OUTPUT
作用:过滤数据包 
内核模块:iptables_filter.

2、Nat表
三个链:PREROUTING、POSTROUTING、OUTPUT
作用:用于网络地址转换(IP、端口)
内核模块:iptable_nat

3.MangleF
五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS
内核模块:iptable_mangle 很少用

4.Raw表(RHEL5 新增)
两个链:OUTPUT、PREROUTING
作用:决定数据包是否被状态跟踪机制处理 
内核模块:iptable_raw

五链

1、INPUT
进来的数据包应用此规则链中的策略

2、OUTPUT
外出的数据包应用此规则链中的策略

3、FORWARD
转发数据包时应用此规则链中的策略

4、PREROUTING
对数据包作路由选择前应用此链中的规则
所有的数据包进来的时侯都先由这个链处理

5、POSTROUTING
对数据包作路由选择后应用此链中的规则
所有的数据包出来的时侯都先由这个链处理


iptables 数据包处理流程

1、当一个数据包进入网卡时,它首先进入 PREROUTING 链,内核根据数据包目的IP判断是否需要转送出去。

2、如果数据包就是进入本机的,它就会沿着图向下移动,到达 INPUT 链。数据包到了 INPUT 链后,任何进程都会收到它。
本机上运行的程序可以发送数据包,这些数据包会经过 OUTPUT 链,然后到达 POSTROUTING 链输出。

3、如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过 FORWARD 链,然后到达 POSTROUTING 链输出。

或者从入站、转发、出站看处理流程:
1、入站流量
从外界到达防火墙的数据包,先被 PREROUTING 规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标主机是防火墙本机,那么内核将其传给 INPUT 链处理(决定是否允许通过等),通过以后再交给系统上层的应用程序进行响应。

2、转发流量
来自外界的数据包到达防火墙后,首先被 PREROUTING 规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如通过网关访问其他服务),则内核将其传递给 FORWARD 链进行处理(是否转发或拦截),然后再交给 POSTROUTING 规则链(是否修改数据包的地 址等)进行处理。

3、出站流量
防火墙本机向外部地址发送的数据包首先被 OUTPUT 规则链处理,之后进行路由选择,然后传递给 POSTROUTING 规则链(是否修改数据包的地址等)进行处理。


安装iptables

CentOS yum 安装 iptables

centos 最小化安装也自带 iptables 防火墙,如果系统中没有 iptables, 可使用 yum 安装:
yum install iptables

安装完 iptables 后配置文件默认在 /etc/sysconfig/iptables

如何检查系统中是否有iptables?
centos6 及以下 service iptables status 查看 iptables 防火墙状态,如果提示 iptables:unrecognized service 则表示系统尚未安装。
centos7 及以上 systemctl status iptables 查看 iptables 防火墙状态,显示 Loaded: not-found (Reason: No such file or directory) 说明未安装。


CentOS7 离线安装 iptables

1、下载 iptables 和 iptables-service rpm 安装包,上传到服务器

wget http://mirror.centos.org/centos/7/os/x86_64/Packages/iptables-1.4.21-35.el7.x86_64.rpm
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/iptables-services-1.4.21-35.el7.x86_64.rpm

2、安装 iptables 和 iptables-service
2.1、查看是否已安装 iptables

# rpm -qa |grep iptables
iptables-1.4.21-16.el7.x86_64

发现已安装 iptables-1.4.21-16.el7.x86_64

2.2、升级 iptables 并安装 iptables-service

rpm -U iptables-1.4.21-35.el7.x86_64.rpm
rpm -i iptables-services-1.4.21-35.el7.x86_64.rpm

2.3、查看是否安装

# rpm -qa|grep iptables
iptables-1.4.21-35.el7.x86_64
iptables-services-1.4.21-35.el7.x86_64

启停 iptables

启动 iptables
centos6 及以下 service iptables start 启动 iptables
centos7 及以上 systemctl start iptables 启动 iptables

停止 iptables
centos6 及以下 service iptables stop 停止 iptables
centos7 及以上 systemctl stop iptables 停止 iptables


设置开机启动 iptables

centos6 及以下 chkconfig iptables off 关闭 iptables 开机自启动
执行 chkconfig 命令,iptables 行0-6全是off说明成功关闭:

iptables           0:off    1:off    2:off    3:off    4:off    5:off    6:off

centos7 及以上 systemctl disable iptables 关闭 iptables 开机自启动


保存iptables规则

默认 iptables 规则只保存在内存中,系统重启后会丢失,所以规则设定完毕,检查无误后要及时持久化保存规则。
方法1、使用 service iptables save 保存,会自动保存到 /etc/sysconfig/iptables 文件

# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

方法2、使用 iptables-save 命令
将 iptables 规则保存到 /etc/sysconfig/iptables:
iptables-save > /etc/sysconfig/iptables


k8s环境中的iptables

kube-proxy 只修改了 filter 和 nat 表,它对 iptables 的链进行了扩充,自定义了 KUBE-SERVICES,KUBE-NODEPORTS,KUBE-POSTROUTING,KUBE-MARK-MASQ 和KUBE-MARK-DROP 五个链,并主要通过为 KUBE-SERVICES 链(附着在 PREROUTING 和 OUTPUT )增加 rule 来配制 traffic routing 规则。


iptables 命令

iptalbes 语法格式:
iptables [-t 表名] 命令选项 [链名][条件匹配][-j 目标动作或跳转]

-t table 指定表(默认filter)

-t, --table table 指定表,常用 filter, nat, mangle,若未指定则默认使用filter表


命令选项

命令选项用于指定操作 iptables 规则的方式,比如:插入、增加、删除、查看等。

-R  修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换
-E  重命名用户定义的链,不改变链本身
-N  新建(new-chain)一条用户自己定义的规则链
-X  删除指定表中用户自定义的规则链(delete-chain)
-n  使用数字形式(numeric)显示输出结果
-v  查看规则表详细信息(verbose)的信息
-V  查看版本(version)
-h  获取帮助(help)

-A 在链末尾插入规则

-A, --append chain 在指定链的末尾添加(append)一条新的规则

-I 在链开头插入规则

-I, --insert chain  在指定链中插入(insert)一条新的规则,默认在第一行添加。
-I 可指定插入位置,比如 iptables -I INPUT 2 -s 10.10.10.1 -j ACCEPT 允许10.10.10.1主机访问本机,在 filter 表的 INPUT 链插入成第2条规则

-D 删除规则

-D, --delete chain  删除(delete)指定链中的某一条规则,可以按规则序号和内容删除
iptables -D INPUT 1 删除 INPUT 链的第一条规则

-P 设置默认规则

-P, --policy chain  设置指定链的默认策略(policy)
iptables -P INPUT DROP 设置 filter 表 INPUT 链的默认规则是 DROP,当数据包没有被任何规则匹配时,则按默认规则处理。

-L 查看规则列表

-L, --list  列出(list)指定链中所有的规则进行查看

-F 清空规则

-F, --flush  清空(flush)

iptables -F INPUT #清空filter 表中INPUT链上的规则
iptables -F       #清空filter 表中所有链上的规则
iptables -t nat -F PREROUTING ##清空NAT表中PREROUTING链上的规则
iptables -t nat -F            #清空NAT表中所有链上的规则

-F 清空链中规则并不影响 -P 设置的默认规则。 因此在生产环境中,若指定默认规则为DROP,一旦执行iptables -F,很容易导致自己也无法连接服务器(-F 会把配置的明细ACCEPT规则删除,只留下默认规则拒接所有)。

-Z 计数器清零

-Z, --zero 将指定链的所有计数器归零,如不指定链则清空所有链。
iptables -Z INPUT 清除filter表INPUT链上的计数器


条件匹配选项

条件匹配用于指定对符合什么样条件的数据包进行处理

-i 匹配入站网卡

-i, --in-interface name 匹配数据进入的网络接口,此参数主要应用nat表,例如目标地址转换。
-i eth0 匹配从网络接口 eth0 进来的数据包

-o 匹配出站网卡

-o, --out-interface name 匹配数据流出的网络接口
-o eth1 匹配从 eth1 流出的数据包

-s 匹配源地址

-s, --source address[/mask][,...] 匹配源地址,可以是IP、网段、域名,也可空(代表任何地址)
iptables -A INPUT -s 10.10.10.10 -j DROP 拒绝 10.10.10.10 主机访问本机

-d 匹配目的地址

-d, --destination address[/mask][,...] 匹配目标地址
iptables -A OUTPUT -d www.baidu.com -j DROP 禁止本机访问百度

-p 匹配协议类型

-p, --protocol [!] protocol 匹配协议类型,可以是TCP、UDP、ICMP等
iptables -A INPUT -s 10.10.10.10 -p icmp -j DROP 禁止10.10.10.10主机ping通本机

–sport 匹配源端口

–sport 匹配源端口;可以是单个端口,也可以是端口范围
--sport 23 匹配源端口是23的数据包
--sport 2000:3000 匹配源端口是 2000-3000 的数据包
--sport :2000 匹配源端口是2000以下的数据包(包含2000)
--sport 1000: 匹配源端口是1000以上的数据包(包含1000)

注意:**–sport 和 –dport 必须配合 -p 参数使用**

–dport 匹配目的端口

–dport 匹配目的端口
iptables -A INPUT -p tcp –dport 80 -j ACCEPT 允许外部数据访问我的本地服务器80端口


-m 扩展匹配规则

-m, --match match 通过扩展模块进行条件匹配

-m state –state 匹配状态

-m state –state 状态
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 将目前已运行的服务端口全部放行

-m mac –mac-source 匹配来源MAC地址

-m mac –mac-source MAC
iptables -A INPUT -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP 拒绝来自某 MAC 地址的数据包进入本机
ESTABLISHED 表示已经响应请求或者已经建立连接的数据包,RELATED 表示与已建立的连接有相关性的,比如FTP数据连接等。

iptables 有四种状态:

  • NEW 主机连接目标主机,在目标主机上看到的第一个想要连接的包
  • ESTABLISHED 主机已与目标主机进行通信,判断标准只要目标主机回应了第一个包,就进入该状态。
  • RELATED 主机已与目标主机进行通信,目标主机发起新的链接方式,例如ftp
  • INVALID 无效的封包,例如数据破损的封包状态
-m limit –limit 匹配速率

-m limit –limit 匹配速率

-m multiport 多端口匹配

-m multiport <–sports|–dports|–ports> 端口 1[,端口 2,..,端口 n]
iptables -A INPUT -p tcp -m multiport --dports 22,53,80,443 -j ACCEPT 允许访问本机TCP/22,53,80,443端口
注意:多端口匹配也必须与 -p 参数配合使用

-m comment –comment 添加注释

-m comment --comment "COMMENT TEXT" -m comment 指定 comment 扩展模块,–comment 添加注释


动作选项

-j, --jump target 指定目标动作,即数据包匹配成功后需要做什么。

-j ACCEPT 允许通过

-j ACCEPT 允许数据包通过本链
iptables -A INPUT -j ACCEPT 允许所有访问本机的数据包通过

-j DROP 直接丢弃

-j DROP 直接丢弃数据包,不给任何回应信息
iptables -A FORWARD -s 10.10.10.10 -j DROP 阻止来自 10.10.10.10 的数据包通过本机进行转发

-j REJECT 拒绝(有响应)

REJECT 拒绝数据包通过,必要时会给数据发送端一个响应的信息。

-j LOG 记录日志

LOG 在 /var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则

-j SNAT –to 源地址转换

-j SNAT 源地址转换,支持转换为单IP,也支持转换到IP地址池
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 18.18.18.18 将内网 192.168.1.0/24 转换为公网18.18.18.18地址
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 18.18.18.18-18.18.18.28 将内网 192.168.1.0/24 转换为公网 18.18.18.18-28 地址池

-j DNAT –to 目的地址转换

-j DNAT 目的地址转换,支持转换为单IP,也支持转换到IP地址池
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.1.1 把从eth0口进来访问TCP/80端口的数据包目的地址改成192.168.1.1
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.1.1-192.168.1.10 同上目的地址映射到一组ip池

-j MASQUERADE 地址伪装

-j MASQUERADE 动态SNAT转换(适用于动态 IP 场景 )
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE 将源地址是 192.168.1.0/24 的数据包进行地址伪装,转换成 eth0 上的 IP 地址


配置示例

iptables -L 查看iptables规则

centos7 及之后

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy DROP)
target     prot opt source               destination
DOCKER-USER  all  --  anywhere             anywhere
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere

centos6 及之前,查看防火墙配置 /etc/init.d/iptables statusservice iptables status
结果为:

Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

iptables -L INPUT 查看input链规则


开放所有端口

iptables 默认策略就是全部 ACCEPT

如无其它规则,全部accept,将所有端口,入站、出站、转发都可访问

iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

拒绝全部入站流量

iptables -A INPUT -j DROP 拒绝所有人访问服务器(作为最后一条规则),默认使用filter表


禁止某IP ping本机

iptables -A INPUT -s 10.10.10.10 -p icmp -j DROP 禁止10.10.10.10主机ping通本机

禁止任何人ping本机

iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -j DROP 禁止任何人ping通本机

此外还可以修改内核参数实现禁止 ping 本机:

echo net.ipv4.icmp_echo_ignore_all=1 >> /etc/sysctl.conf
sysctl -p 

允许转发ICMP外的全部数据包

iptables -A FORWARD -p ! icmp -j ACCEPT 允许防火墙转发除ICMP协议以外的所有数据包
使用!可以将条件取反


开放指定端口

添加规则开放80端口:
/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
保存配置:
/etc/rc.d/init.d/iptables saveservice iptables save
显示

iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

或者使用 vi 打开 /etc/sysconfig/iptables 文件修改手动添加

-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

重启防火墙:
service iptables restart
再次查看防火墙状态可见多了一条

1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80

表明80端口开启成功


iptables ip端口转发

将目的地址是 172.31.0.1 的流量转发到 10.0.0.1
iptables -t nat -A OUTPUT -d 172.31.0.1 -j DNAT –to-destination 10.0.0.1

将目的地址是 172.31.0.1:8800 的流量转发到 10.0.0.1:8800
iptables -t nat -A OUTPUT -d 172.31.0.1 –dport 8800 -j DNAT –to-destination 10.0.0.1:8800

查看转发规则
iptables -t nat -nL


上一篇 Xenon

下一篇 Linux-FirewallD

阅读
评论
4.3k
阅读预计18分钟
创建日期 2022-03-30
修改日期 2022-09-07
类别

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论