Linux 系统中防火墙: iptables/netfilter (既可以当主机防火墙, 又可以当网络防火墙)
netfilter:linux 内核中的防火墙的框架, Feamework, 防火墙功能实现的主体;
iptables: 专门为 netfilter 编写的数据报文的匹配规则的用户空间的应用程序工具;
在使用 iptables 防火墙的时候, 我们建议将 Centos 7 中的 firewalld 关闭, 并停止运行;
- [root@ljy ~]# systemctl stop firewalld.service
- [root@ljy ~]# systemctl disable firewalld.service
并把核心转发功能开启, 这关系到我们转发功能;
- [root@ljy ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
- [root@ljy ~]# cat /proc/sys/net/ipv4/ip_forward
- 1
把 SELinux 设成 premissive 模式;
- [root@ljy ~]# setenforce 0
- [root@ljy ~]# getenforce
- Permissive
netfilter 的逻辑结构:
- chain:
- INPUT
- OUOTPUT
- FORWARD
- PREROUTING
- POSTROUTING
- table:
filter: 过滤器, 包过滤防火墙功能;
包含: INPUT,OUOTPUT,FORWARD 三条链
nat: 用于修改报文的源地址和 / 或目的地址, 而且还可以修改端口号;
地址转换
地址伪装
包含: PREROUTING,POSTROUTING,OUTPUT,INPUT(1.4 + 版本中新增加)
mangle: 拆解报文并对报文格式进行修改, 然后在重新封装报文;
流量控制
数据标签
包含: PREROUTING,POSTROUTING,OUTPUT,INPUT,FORWARD 五条链;
raw: 关闭 nat 表上启动的连接追踪机制;
包含: PREROUTING,OUTPUT 两条链;
各个表中相同规则链上的规则生效优先级次序(从高到低);
raw --> mangle --> nat --> filter
定义规则时的注意事项:
1. 规则的匹配顺序是由上至下按照书写顺序进行匹配;
1) 同一类规则, 匹配范围最小的应该写在最上面;
2) 非同一类的规则, 匹配频率越高的应该写在上面;
3) 建议尽量不修改链的默认策略为组织所有数据, 如果想要设置组织所有数据的规则, 在链的最后一条设置阻止所有数据的规则即可;
iptables 规则编写的通用格式:
iptables [-t table] COMMAND CHAIN [-m matchname] [per-match-options] -j targetname [per-target-options]
-t table: 指定选择执行那个表的功能, 可以选择的表包括: raw,mangle,nat 及 filter, 如果省略此选项, 则表示使用默认表 --filter 表;
-m matchname: 通常是配置显示扩展的匹配条件时, 必须书写; 如果省略则表示要配置基本匹配条件或隐式扩展匹配条件;
-j targetname: 指定所有匹配条件的数据包的处理动作;
COMMAND:
链的操作命令:
-P, --policy chain target
用于定义指定链的默认策略; 通常有两种动作选择, 即: ACCEPT 和 DROP;
-N, --new-chain chain
创建一条新的自定义的规则链; 新建的链上的规则必须要被内键链上的规则调用才能生效;
-X, --delete-chain [chain]
删除被内键链调用次数为 0 的自定义链;
-E -rename-chain
重定义被内键链调用次数为 0 的自定义链;
-F -flush
清除所有指定链 (表中所有链) 上的规则;
规则的操作命令:
-A -append chain rule-specification:
在指定的链的末尾追加一条规则;
-D, --delete chain rule-specification
-D, --delete chain rulenum
从指定的链上删除一条规则, 可以指明具体规则, 也可以指明规则在链上的编号;
-I, --insert chain [rulenum] rule-specification:
在指定的链上插入一条规则, 默认是将新规则插入至链的第一条规则, 也可以指定规则编号, 使得插入的规则称为指定链上的第 rulenum 条规则;
-R, --replace chain rulenum rule-specification:
用命令行中的规则替换指令链上的第 rulenum 条规则, 并不是修改规则张总某个具体条件, 而是用完全替换整条规则;
-L, --list [chain]:
列表显示指定表指定链 (所有链) 上的所有规则;
可以使用的其他常用选项:
-v, --verbose: 显示更详细的信息, 还有 - vv;
-n, --numeric: 将规则中的所有信息都进行数字化显示; 包括主机名和端口号等信息;
-x, --exact: 精确的显示计数器的结果;
每个规则都有两个计数器:
1. 规则所匹配的报文的个数;
2. 规则所匹配的报文的字节总数;
--line-numbers: 显示指定链上各个规则的编号;
其他的命令:
-Z, --zero [chain [rulenum]]
将指定链的规则计数器置 0;
常用的 TARGETS:
LOG: 对于匹配的数据报文的的流动情况进行日志记录, 并不会影响数据报文本身的传输;
MARK: 对于匹配的数据报文进行防火墙标记的设置;
MASQUERADE: 源地址伪装, 一种特殊情况的 IP 地址转换;
REDIRECT: 目标 IP 地址和端口的重定向;
REJECT: 阻止数据报文传输并向数据报文的源头返回消息;
SNAT: 源 IP 地址转换;
DNAT: 目标 IP 地址转换;
ACCEPT: 对于匹配的数据报文进行放行;
DROP: 对于匹配的数据报文进行阻止;
RETURN: 在规则链之间跳转;
匹配条件:
默认情况下, 同一条命令中的不同条件之间存在逻辑 "与" 的关系;
!: 对于匹配的结果取反, 有除了... 之外的意思;
基本匹配条件:
[!] -s, --source address[/mask][,...]
检测数据报文中的源 IP 地址的匹配范围; 可以是单个 IP 地址, 也可以是子网, 主网, 超网等 IP 地址设定: 0.0.0.0/0 表示整个 ip 地址栈中所有的 ip 地址; 如果省略该条件, 意味着将匹配所有的源 IP 地址;
[!] -d, --destination address[/mask][,...]
检测数据报文中的目的 IP 地址的匹配范围; 可以是单个 IP 地址, 也可以是子网, 主网, 超网等 IP 地址设定: 0.0.0.0/0 表示整个 ip 地址栈中所有的 ip 地址; 如果省略该条件, 意味着将匹配所有的目的 IP 地址;
[!] -i, --in-interface name
检查数据报文入站的接口是否能够被此条件所匹配;
[!] -o, --out-interface name
检查数据报文出站的接口是否能够被此条件所匹配;
扩展匹配条件:
隐式扩展匹配条件:
- [!] -p, --protocol protocol
- [!] -p, [-m matchname] --protocol protocol
检查数据报文某指定的协议的封装首部中是否有符合条件的特性或字段;
可以在此处指定的协议包括:
tcp, udp, udplite, icmp, icmpv6, esp, ah, sctp, mh, all
tcp 协议:
- [!] --source-port,--sport port[:port]
- [!] --destination-port,--dport port[:port]
用于指定源端口和 / 或目标端口的匹配条件; 每次只能指定一个端口或一组连续的端口, 而不能指定离散端口;
[!] --tcp-flags mask comp
用于指定在 tcp 协议首部中各标志位的匹配条件;
URG, SYN, RST, PSH, FIN, ACK, ALL, NONE
mask: 设定要检测的标志位的列表, 可以使用 "," 进行分隔;
comp: 必须被置 "1" 的标志位列表, 剩余的在 mask 列表中的标志位必须置 "0";
[!] --syn
相当于:--tcp-flags SYN,RST,ACK,FIN SYN
udp 协议(udp 模块):
- [!] --source-port,--sport port[:port]
- [!] --destination-port,--dport port[:port]
用于指定源端口和 / 或目标端口的匹配条件; 每次只能指定一个端口或一组连续的端口, 而不能指定离散端口;
icmp 协议(icmp 模块)
- [!] --icmp-type {type
- |typename}
常用的 icmp-type:
echo-request: 代码为 8;
echo-reply: 代码为 0;
显式扩展匹配条件:
1.multiport 扩展:
一次性的写入多个离散端口或多组连续端口, 最大的上限 15 组端口, 每一个段范围占用两个端口;
可以支持的协议: tcp, udp, udplite, dccp, sctp
相关选项:
- [!] --source-ports,--sports port[,port|,port:port]...
- [!] --destination-ports,--dports port[,port|,port:port]...
- [!] --ports port[,port|,port:port]...
--dports 22 ,80,3306 -j ACCEPT
示例:
- ~]# iptables -I FORWARD -s 192.168.100.100 -d 172.16.69.2 -p tcp -m multiport --dports 22,80,3306 -j ACCEPT
- ~]# iptables -I FORWARD -d 192.168.100.100 -s 172.16.69.2 -p tcp -m multiport --sports 22,80,3306 -j ACCEPT
2.iprange 扩展:
以连续的任意数量的 IP 地址访问作为匹配条件:
相关选项:
- [!] --src-range from[-to]
- [!] --dst-range from[-to]
- -m iprange --src-range 172.16.1.100-172.16.1.200
示例:
- ~]# iptables -I FORWARD -m iprange --src-range 192.168.100.1-192.168.100.100 -d 172.16.69.2 -p tcp -m multiport --dports 22,80,3306 -j ACCEPT
- ~]# iptables -I FORWARD -m iprange --dst-range 192.168.100.1-192.168.100.100 -s 172.16.69.2 -p tcp -m multiport --sports 22,80,3306 -j ACCEPT
3.string 扩展:
对数据报文中的应用层数据做字符串匹配检测;
相关选项:
- --algo {bm|kmp}
- --string "STRING"
示例:
~]# iptables -I FORWARD -s 172.16.69.2 -m string --algo bm --string "dafa" -j REJECT
4.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-31
[!] --weekdays day[,day...]
定义每个星期的星期几, 1-7
示例:
~]# iptables -I FORWARD -m time --timestart 08:00:00 --timestop 17:59:59 ! --weekdays 6,7 -o eno16777736 -j REJECT
5.stat 扩展 modprobe nf_conntrack_ftp 内核模块;
连接状态检测的模块; 基于连接追踪机制实现;
conntrack
iptables 对连接状态的定义:
INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED;
INVALID: 无法识别的连接状态, 无效的通信状态; SYN,FIN
ESTABLISHED: 已经建立连接的状态; 连接态;
NEW: 尚未建立连接的状态;
RELATED: 与其他已经建立的连接有相互关联的连接状态; 关联态或衍生态;
UNTRACKED: 未追踪的状态;
内核中用于保存连季节追踪状态数据的位置:/proc/net/nf_conntrack
能够被追踪到的最大的连接数:/proc/sys/net/nf_conntrack_max
注意: 此处记录的最大连接数的数值, 建议必要时可以调整其大小到足够大;
为了能够尽可能的高效利用内存资源, 缓存的连接追踪的状态不能无限期保存, 因此设置了相应的超时时间;
/proc/sys/net/netfilter/nf_conntrack*timeout*
利用连接追踪设置 FTP 服务器的访问控制:
- ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- ~]# iptables -A INPUT -d 172.16.69.2 -p tcp -m multiport --dports 21,22,80,3306 -m state --state NEW -j ACCEPT
- ~]# iptables -A INPUT -j DROP
注意: 需要装载 nf_conntrack_ftp 内核模块;
~]# modprobe nf_conntrack_ftp
设置 nf_conntrack_ftp 模块的自动装载;
- /etc/sysconfig/iptables-config
- IPTABLES_MODULES="nf_conntrack_ftp"
利用连接追踪可以设置 OUTPUT 链上的通用规则;
- ~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
- ~]# iptables -A OUTPUT -j DROP
6.mac 扩展
实现 mac 地址的扩展进行限制; PREROUTING, INTPUT, FORWARD 链;
[!] --mac-source address
匹配 Mac 地址, 其形式必须是: XX:XX:XX:XX:XX:XX
7.connlimit 扩展:
根据每个客户端 IP 地址做并发连接数的匹配检测;
相关选项:
[!] --connlimit-upto n
当客户端当前的并发连接数小于或等于 n 时, 可以匹配此条件; 此条件通常和 ACCEPT 动作配合使用;
[!] --connlimit-above n
当客户端当前的并发连接数大于 n 时, 可以匹配此条件; 此条件通常和 DROP 或 REJECT 动作配合使用;
8.limit 扩展:
基于服务器端收发数据报文的速率来进行匹配检测;
--limit rate[/second|/minute|/hour|/day]
服务器端最大单位时间内能够接收的报文速率;
--limit-burst number
初始时所能接收的数据报文的最大数量;
示例:
~]# iptables -I INPUT 1 -p icmp --icmp-type 8 -m limit --limit 15/minute --limit-burst 8 -j ACCEPT
nat 表:
功能:
- 1.NAT,Network Address Translation,
- 1) SNAT: Source-Address Nat
通常用于让局域网中使用私有 ipv4 地址的主机能够访问外部网络或互联网;
一般在路由选择之后完成原地址自的网络地址转换, 因此, 与 iptables 而言, 此类规则应配置在 POSTROUTTING 链上;
a. 静态地址转换: 一对一地址转换;
b. 地址伪装: 多对一地址值转换;
2) DNAT:Destination-Address Nat
通常用于让外部网络或互联网中的主机能够访问局域网中使用私有 ipv4 地址的服务器上的网络服务;
一般在路由选择之前就需要完成目标地址的网络地址转换, 因此, 于 iptables 而言, 此类规则应配置在 PREROUTING 链上;
2.NAPT:Network Address and Port Translation, 网络地址端口转换;
网络地址转换 + 地址映射
SNAT:
This is the correct behavior when the next dialup is unlikely to have the same interface address (and hence any established connections are lost anyway).
--to-ports port[-port]
注意: 在 REHL 或 Centos 系发信号版 Linux 中, SNAT 所指定的 ipaddr 必须是当前主机上配置并生效的 ip 地址;
示例:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.16.1.74
- ~]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j MASQUERADE
- // 源地址伪装技术, 无需指定具体的内部全局地址, 自动决定本地可用的 IP 地址作为内部全局地址, 进行源地址转换
- DNAT:
This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.
--to-destination [ipaddr[-ipaddr]][:port[-port]]
示例:
~]# iptables -t nat -A PREROUTING -d 192.168.100.1 -p tcp --dport 80 -j DNAT --to-destination 172.16.69.2:8000
与之相同功能的操作:
1. 在路由器上设置 NAT 转换的防火墙规则:
~]# iptables -t nat -R PREROUTING 1 -d 192.168.100.1 -j DNAT --to-destination 172.16.69.2
2. 在目标服务器上做端口重定向: 需要使用 REDIRECT target
~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8000
来源: http://www.bubuko.com/infodetail-2614602.html