linux防火墙iptables

目录

1、iptables四表五链

2、黑名单,白名单设置

 3、iptables基本语法

选项

4、iptables隐含扩展

5、显示扩展模块 

1)multipor扩展

2)iprange扩展

3)MAC地址

4)string字符串

5)time模块

6)connlimit扩展(连接最大数)

7)state

8)规则优化

9)保存规则


1、iptables四表五链

iptables真正是五表五链

五表:security表、raw表、mangle表、nat表、filter表

五表的优先级(高->低):security -->raw-->mangle-->nat-->filter

五链:INPUT链、OUTPUT链、FORWARD链、POSTROUTING链、PREROUTING链

五表
表名 解释 包含的链
security 用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现 (了解)
raw 关闭启用的连接跟踪机制,加快封包穿越防火墙速度 OUTPUT、PREROUTING
mangle 修改数据标记位规则表 INPUT、 OUTPUT、 FORWARD、 PREROUTING、 POSTROUTING
nat network address translation 地址转换规则表 OUTPUT、PREROUTING、POSTROUTING
filter 过滤规则表,根据预定义的规则过滤符合条件的数据包,默认表 PREROUTING、POSTROUTING、OUTPUT
五链
链名 解释
INPUT 处理入站数据包,匹配目标IP为本机的数据包
OUTPUT 处理出站数据包,一般不在此链上做配置
FORWARD 处理转发数据包,匹配流经本机的数据包
PREROUTING 在进行路由选择前处理数据包,用来修改目的地址,用来做DNAT。相当于把内网服务器的IP和端口映射到路由器的外网IP和端口上
POSTROUTING 在进行路由选择后处理数据包,用来修改源地址,用来做SNAT。相当于内网通过路由器NAT转换功能实现内网主机通过一个公网IP地址上网

linux防火墙iptables_第1张图片

三种报文流向

  • 流入本机:PREROUTING --> INPUT-->用户空间进程

  • 流出本机:用户空间进程 -->OUTPUT--> POSTROUTING

  • 转发:PREROUTING --> FORWARD --> POSTROUTING

注意:在设置iptables设置时,将iptables的默认值设置为ACCEPT,设置成DROP或REJECT,在清空iptables的所有规则时,会出现远程无法连接的问题 。

2、黑名单,白名单设置

iptables默认设置是黑名单设置。linux防火墙iptables_第2张图片

黑名单:默认允许所有数据流量通过,可以添加不允许通过的数据流量

白名单:默认拒绝所有数据流量通过,可以添加允许通过的数据流量

linux防火墙iptables_第3张图片
linux防火墙iptables_第4张图片
linux防火墙iptables_第5张图片

在白名单中添加一条允许规则

linux防火墙iptables_第6张图片
linux防火墙iptables_第7张图片

 3、iptables基本语法

 格式:iptables    -t   表名   -A   链名   规则

# 如果不加“-t  表名” 默认为filter表

linux防火墙iptables_第8张图片

选项

管理选项 用法示例
-A 在指定链末尾追加一条 iptables -A INPUT (操作)
-I 在指定链中插入一条新的,未指定序号默认作为第一条 iptables -I INPUT (操作)
-P 指定默认规则 iptables -P OUTPUT ACCEPT (操作)
-D 删除 iptables -t nat -D INPUT 2 (操作)
-R 修改、替换某一条规则 iptables -t nat -R INPUT (操作)
-L 查看 iptables -t nat -L (查看)
-n 所有字段以数字形式显示(比如任意ip地址是0.0.0.0而不是anywhere,比如显示协议端口号而不是服务名) iptables -L -n,iptables -nL,iptables -vnL (查看)
-v 查看时显示更详细信息,常跟-L一起使用 (查看)
--line-number 规则带编号 iptables -t nat -L -n --line-number /iptables -t nat -L --line-number
-F 清除链中所有规则 iptables -F (操作)
-N 新加自定义链
-X 清空自定义链的规则,不影响其他链 iptables -X
-Z 清空链的计数器(匹配到的数据包的大小和总和)iptables -Z
-S 看链的所有规则或者某个链的规则/某个具体规则后面跟编号

-A        在指定链末尾追加一条 iptables -A INPUT (操作)

linux防火墙iptables_第9张图片

 -I        在指定链中插入一条新的,未指定序号默认作为第一条 iptables -I INPUT (操作)

linux防火墙iptables_第10张图片

-P        设置链的默认规则 

linux防火墙iptables_第11张图片linux防火墙iptables_第12张图片

-D        删除规则

linux防火墙iptables_第13张图片

 -R        将规则替换成其他规则

linux防火墙iptables_第14张图片

-L        查看 iptables -t nat -L (查看)

linux防火墙iptables_第15张图片

-n        将域名或端口都转成数字化显示,经常-vnL一起使用

-v        查看时显示更详细信息,常跟-L一起使用

linux防火墙iptables_第16张图片

-F        清除所有iptables规则

linux防火墙iptables_第17张图片

 -N        添加自定义链

linux防火墙iptables_第18张图片

-X        删除,清空自定义链

linux防火墙iptables_第19张图片

4、iptables隐含扩展

使用man iptables-extensions查看扩展帮助

ptables 在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块

要求以特定的协议匹配作为前提,包括端口、TCP标记、ICMP类型等条件。 端口匹配: --sport 源端口、--dport 目的端口

--tcp-flags ALL ALL  
--tcp_flags ALL NONE
--sport 1000          匹配源端口是1000的数据包
--sport 1000:3000     匹配源端口是1000-3000的数据包
--sport :3000         匹配源端口是3000及以下的数据包
--sport 1000:         匹配源端口是1000及以上的数据包
注意: --sport和--dport 必须配合-p <协议类型>使用

端口可以使用的范围 0-65535

linux防火墙iptables_第20张图片

类型匹配:

--icmp-type ICMP类型

#可以是字符串、数字代码 "Echo- Request" (代码为8)表示请求
"Echo- Reply" (代码为0)
表示回复 "Dest ination-Unreachable" (代码为3)表示目标不可达
关于其它可用的ICMP协议类型,可以执行“iptables -p icmp -h”命令,查看帮助信息

禁止其它主机ping本机

[root@heitui ~]#iptables -A INPUT -p icmp --icmp-type 8 -j DROP

linux防火墙iptables_第21张图片

 

当本机ping不通其它主机时提示目标不可达

[root@heitui ~]#iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
此时其它主机需要配置关于icmp协议的控制类型为REJECT

[root@server1 ~]#iptables -A INPUT -p icmp -j REJECT

linux防火墙iptables_第22张图片

5、显示扩展模块 

显示扩展即必须使用-m选项指明要调用的扩展模块名称,需要手动加载扩展模块

[-m  模块  [per-match-options]]

1)multipor扩展

以离散方式定义多端口匹配,最多指定15个端口

[!] --source-ports,--sports port[,port|,port:port]...
#指定多个源端口 逗号隔开
[!] --destination-ports,--dports port[,port|,port:port]...
# 指定多个目标端口 逗号隔开
[!] --ports port[,port|,port:port]...
#多个源或目标端

例子

[root@heituit ~]#iptables -t filter -A INPUT -s 192.168.91.101 -p tcp --dport 22,80 -j REJECT 
#不支持离散的端口号
iptables v1.4.21: invalid port/service `22,80' specified
Try `iptables -h' or 'iptables --help' for more information.

[root@heitui ~]#iptables -A INPUT  -s 192.168.91.101 -p tcp -m multiport --dports 22,80,3306 -j REJECT 
#阻止 ip地址来自192.168.91.101  访问当前机器 的tcp  80  8080端口

linux防火墙iptables_第23张图片
linux防火墙iptables_第24张图片

2)iprange扩展

 指明连续的(但一般不是整个网络)ip地址范围

[!] --src-range from[-to] 源IP地址范围
[!] --dst-range from[-to] 目标IP地址范围

指定 源地址为192.168.91.101-192.168.91.103   3个地址无法访问 当前主机

[root@heitui ~]#iptables -A INPUT  -m iprange --src-range 192.168.91.101-192.168.91.103 -j REJECT 

linux防火墙iptables_第25张图片

3)MAC地址

mac 模块可以指明源MAC地址,,适用于:PREROUTING, FORWARD,INPUT chains

-m   mac    [!] --mac-source XX:XX:XX:XX:XX:XX

linux防火墙iptables_第26张图片

4)string字符串

对报文中的应用层数据做字符串模式匹配检测

--algo {bm|kmp} 字符串匹配检测算法
 bm:Boyer-Moore           算法
 kmp:Knuth-Pratt-Morris   算法

--from offset 开始查询的地方
--to offset   结束查询的地方

[!] --string pattern 要检测的字符串模式
[!] --hex-string pattern要检测字符串模式,16进制格式

例子

[root@heitui ~]#echo "www.bilibili.com" > /var/www/html/index.html
#自建网页1
[root@heitui ~]#echo "www.baidu.com" > /var/www/html/index1.html
#自建网页2


[root@heitui ~]#iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --from 62 --string "bilibili" -j REJECT 
#注意  请求的包不带字符,回复的包带字符  所以要 output

linux防火墙iptables_第27张图片
linux防火墙iptables_第28张图片

5)time模块

根据将报文到达的时间与指定的时间范围进行匹配(centos有 bug ubuntu没问题)

--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...]   每个月的几号
[!] --weekdays day[,day...]   星期几,1 – 7 分别表示星期一到星期日
--kerneltz:内核时区(当地时间),不建议使用,CentOS 7版本以上系统默认为 UTC
注意: centos6 不支持kerneltz ,--localtz指定本地时区(默认)

man   iptables-extensions   查看帮助

linux防火墙iptables_第29张图片

6)connlimit扩展(连接最大数)

根据每客户端IP做并发连接数数量匹配

可防止Dos(Denial of Service,拒绝服务)攻击

--connlimit-upto N #连接的数量小于等于N时匹配
--connlimit-above N #连接的数量大于N时匹配

7)state

状态类型

  • NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求

  • ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态

  • RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系

  • INVALID:无效的连接,如flag标记不正确

  • UNTRACKED:未进行追踪的连接,如:raw表中关闭追踪

格式:

 --state state
 
ipatables  -A INPUT -m state --state   NEW            -j  REJECT
ipatables  -A INPUT  -m state --state  ESTABLISHED    -j   ACCEPT
                  
 新用户不可以访问     旧用户可以访问 

8)规则优化

  1. 安全放行所有入站和出站的状态为ESTABLISHED状态连接,建议放在第一条,效率更高

  2. 谨慎放行入站的新请求

  3. 有特殊目的限制访问功能,要在放行规则之前加以拒绝

  4. 同类规则(访问同一应用,比如:http ),匹配范围小的放在前面,用于特殊处理

  5. 不同类的规则(访问不同应用,一个是http,另一个是mysql ),匹配范围大的放在前面,效率更高

  6. 应该将那些可由一条规则能够描述的多个规则合并为一条,减少规则数量,提高检查效率

  7. 设置默认策略,建议白名单(只放行特定连接)

    A:iptables -P,不建议,容易出现“自杀现象”

    B:规则的最后定义规则做为默认策略,推荐使用,放在最后一条

9)保存规则

使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限

持久保存规则:

centos  7,8

iptables-save > /PATH/TO/SOME_RULES_FILE

centos  6

#将规则覆盖保存至/etc/sysconfig/iptables文件中
service iptables save

加载规则

CentOS 7,8 重新载入预存规则文件中规则:

iptables-restore < /PATH/FROM/SOME_RULES_FILE
iptables-restore选项
-n, --noflush:不清除原有规则
-t, --test:仅分析生成规则集,但不提交

centos  6

#会自动从/etc/sysconfig/iptables 重新载入规则
service iptables  restart

开机自动重载规则

用脚本保存各个iptables命令;让此脚本开机后自动运行

.bashrc

在/etc/rc.d/rc.local文件添加

iptables-save > /opt/iptables
vim ~/.basrc
iptables-restore < /opt/iptables

你可能感兴趣的:(linux,服务器,运维)