linux 之 自定义防火墙规则(iptables)
2017-01-16 本文已影响1529人
丿易小易
iptables基本理论:
iptables组成单元:规则(rules),链(chains),表(tables)
1.规则(rules)
规则(rules)其实就是网络管理员`预定义的条件`;
规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。
规则存储在内核空间的信息包过滤表中,
这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。
当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。
'配置防火墙的主要工作就是添加、修改和删除这些规则'。
2.链(chains)(规则的集合)
链(chains)是数据包传播的路径;
每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。
当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。
如果满足,系统就会根据该条规则所定义的方法处理该数据包;
否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
INPUT链 针对那些目的地是本地的包。
FORWARD链 过滤所有不是本地产生的并且目的地不是本地的包。
OUTPUT链 过滤所有本地生成的包的。
PREROUTING链(路由前的数据流,修改即将到来的的数据包).
POSTROUTING链(路由后的数据流,修改即将出去的数据包).
3.表(tables)
1. 表(tables)提供特定的功能;
2. iptables内置'filter'表、'nat'表和'mangle'表,
3. 分别用于实现'包过滤','网络地址转换'和'包重构'的功能。
3.1 .filter表
1.'主要用于过滤数据包' Filter表是默认的表,iptables就默认使用filter表来执行所以命令,
2. 防火墙的规则配置也都是在这张表里配置(预定义的一组规则过滤符合条件的数据包)
3. filter表包含了INPUT链,RORWARD链,OUTPUT链
在filter表中只能允许对数据包进行接受,丢弃的操作,而无法对数据包进行更改
3.2 .nat表
1.'主要用于网络地址转换NAT',该表可以实现一对一,一对多,多对多等NAT 工作,iptables就是使用该表实现共享上网的。
2.NAT表包含了PREROUTING链,POSTROUTING链,OUTPUT链
3.3 .mangle表
1.主要用于对指定数据包进行更改
2.在内核版本2.4.18 后的linux版本中该表包含的链为:
INPUT链,RORWARD链,OUTPUT链,POSTROUTING链,PREROUTING链
iptables命令参数说明
命令:iptables [-t filter] [-A/I/R/D INPUT,OUTPUT,FORWARD] [-i/o interface] [-p tcp,udp.icmp,all] [-s ip/nerwork] [--sport ports][-d ip/netword] [--dport ports][-j ACCEPT DROP]
* -t 表名 命令作用于该表,如果省略默认filter表
* -A 链命令追加到上表该链的尾部
* -I 链 行数 命令插入到上表该链的第几行
* -R 链 行数 命令插入到上表该链的第几行
*iptables -R INPUT 2 -p tcp -m multiport --dport 22,11251,8050,8080,80 -j ACCEPT
* -D 行数 链 删除上表该链第几行
* -i 网卡 数据进入要经过的网卡 eth0
* -o 网卡 数据输出要经过的网卡 eth1
* -p 协议 通信协议 tcp/udp
* -s ip 源地址,可以是ip,网络 192.168.2.0/24,域名china-ecar.com
* --sport 端口 来源端口
* -d ip 目标IP地址/网络/域名
* --dport 目标端口
* -j 规则 执行规则 acccept drop reject
*
iptables数据包流程
图一:
图二:
图一黄色内容和图二B路线解释:(局域网内的防火墙配置)
DNAT(DNAT目标地址转换在PREROUTING链上做)
对外提供服务,将局域网ip映射到外网ip
DNAT目标地址转换在PREROUTING链上做;可以将虚拟机的服务映射到宿主机的ip上,达到访问宿主的 ip就等于访问虚拟机的效果;
iptables -t nat -A PREROUTING -d 公网ip -p tcp -m tcp --dport 公网端口 -j DNAT --to-destination 内网ip:内网端口
命令解释:
-t (table)命令用于哪个表 -t nat 是指该命令作用于nat表
-A (append)命令追加在表的尾部
-d (destination)指定的物理机ip
-p (protocol)指协议
-m (match)指匹配
--dport 指定的物理机ip端口
-j (jump)跳转执行,指定要进行的处理动作(ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK)
--to-destination 目标地址
iptables可以使用扩展模块来进行数据包的匹配,语法就是 -m module_name, 所以
-m tcp 的意思是使用 tcp 扩展模块的功能 (tcp扩展模块提供了 --dport, --tcp-flags, --sync等功能)
其实只用 -p tcp 了话, iptables也会默认的使用 -m tcp 来调用 tcp模块提供的功能。但是 -p tcp 和 -m tcp是两个不同层面的东西,一个是说当前规则作用于 tcp 协议包,而后一是说明要使用iptables的tcp模块的功能 (--dport 等)
应用场景:
这样主要是为了 能让内网的主机能够对外提供服务:
数据包的第一站 PREROUTING,匹配到规则就执行规则进行DNAT转发,
经过FORWARD ,到达POSTROUTING出站。没有匹配到就进入INPUT,进行匹配
备注:让指定的ip访问服务器 (指定的 ip是192.168.1.154,内网网段是192.168.122.0/24)
将内网ip 192.168.122.2:22 映射到外网ip 192.168.1.51:8081
iptables -t nat -A PREROUTING -d 192.168.1.51 -p tcp -m tcp --dport 8081 --to-destination 192.168.122.2:22
防火墙开放端口和ip
iptables -A FORWARD -s 指定的ip -d 内网网段 -p tcp -m tcp --dport 22 -j ACCEPT
192.168.122.0/24 表示192.168.122.1-192.168.122.254
需要实践检测
当内网的主机或本地的虚拟机需要通过本机上网时,需要做SNAT规则:我的环境是虚拟机要通过宿主机上网,虚拟机以宿主机为网关,虚拟机的网段是192.168.122.0/24,宿主机的网段是192.168.1.0/24,相对来说宿主机网段就是外网,虚拟机就是内网。-j MASQUERADE 是当外网ip不固定时,这个配置 I 可以自动获取外网ip。
iptables -t nat -A POSTROUTING -o br0 -s 内网段/24 -j MASQUERADE
-s配置不是必须的,在真实局域网环境中,也许会有多个局域网段,这时就可以通过-s 配置,指定那个网段可以上网
参考:http://jiapeng.blog.51cto.com/6706171/1719289
SNAT(SNAT源地址转换在POSTROUTING链上做)
可以为局域网提供上网服务
iptables -t nat -A PORTROUTING -o eth0 -j MASQUERADE
-t (table)命令用于哪个表 -t nat 是指该命令作用于nat表
-A (append)命令追加在表的尾部
-o (-o eth0 从这块网卡流出的数据,流出一般在OUTPUT和POSTROUTING上)
-j MASQUERADE 源地址伪装
应用场景:
主机上的NAT 虚拟机需要访问物理网路,虚拟机直接通过先 经过FORWARD,然后通过POSTROUTING 将源地址转换
图一绿色内容和图二A路线解释:(ssh远程连接阿里云服务器)
1.清除原有防火墙,并预设规则(默认为filter表)
#iptables -F INPUT 清除input链中的规则 F flush 清除刷新,该命令不用执行
#iptables -F 清除 filter表中所有链的规则
#iptables -X 清除 filter表中自定义的链input output forward是不会清除的 -X --delete-chain 删除链
#service iptables save 保存防火墙
#service iptables restart 重启防火墙
2.开启22远程连接端口
查看防火墙配置 #iptables -L -n 或者查看 vi /etc/sysconfig/iptables 文件如下图
这里有些问题 input accept [240:20967] 那为什么 22 端口也对外开放了呢????
开放远程连接端口号22后,在设置INPUT规则为DROP,先后顺序不能乱
#iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
--dport 为两个-
区分大小写
设置filter表INPUT链的规则为DROP ,及不在开放端口范围的请求一律删除
#iptables -P INPUT DROP 设置 INPUT链的规则为DROP
#service iptables save
#service iptables restart
当由服务器发起的通信建立要INPUT允许,不然可能导致不能连接,该命令是允许已经建立的通信通过input
#iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
INVALID 表示该封包的联机编号(Session ID)无法辨识或编号不正确。
ESTABLISHED 表示该封包属于某个已经建立的联机。
NEW 表示该封包想要起始一个联机(重设联机或将联机重导向)。
RELATED 表示该封包是属于某个已经建立的联机,所建立的新联机。例如:FTP-DATA 联机必定是源自某个FTP 联机。
关闭防火墙的状态
清洗完规则后重新开启防火墙的状态
防火墙启动方式
自定义规则有两种方式:
1.在iptables处于stop状态下,将命令写入到配置文件中(/etc/sysconfig/iptables)中,然后save,启动start
2.在iptables处于start状态下,直接在dos环境中写入命令,然后save,然后重启restart
这两种都有实际意义:第一种方便,不用写命令; 第二种可以不用停掉防火墙写入规则,时间更短,更安全
总结:在清除完规则后,防火墙的所有规则为accept(放行)