1、IPtables简介
Netfilter/Iptables是(linux/unix)自带的一款优秀开源代码的完全自由的基于包过滤的防火墙工具。可以对流入和输出服务器的数据包进行很精细的控制。IPtables主要工作在OSI七层的二、三、四层。
IPtables是linux内核集成的IP信息过滤系统。对于接入网络或者服务器,则该系统有利于在linux系统上控制IP信息包过滤和防火墙配置。
两大组件:netfilter iptables 。
netfilter 组件称为内核空间(kernelspace),是内核一部分,由信息包过滤表组成。这些表包含内核用来控制信息包过滤处理的规则集。
IPtables 组件是一种工具,称为用户空间(userspace),使插入、修改、除去信息包过滤表中的规则变得容易。
2 IPtables表与链功能
IPtables的规则链分为三种:输入、转发和输出。
1)输入——用于过滤目的地址是本机的连接。
2)转发——用来过滤目的地址和原地址都不是本机的连接。如路由器收到大多数数据均需要转发给其他主机。
3)输出——用来过滤地址是本机的连接。如ping baidu.com,iptables会检查输出链中与ping和baidu.com相关的规则,然后决定允许还是拒绝你的连接请求。
3 IPtables数据包流程
数据包先经过PREOUTING,由该链确定数据包走向:
1) 目的地址是本地,则发送到INPUT,让INPUT决定是否接收下来送到用户空间,流程为①--->②;
2) 若满足PREROUTING的nat表上的转发规则,则发送给FORWARD,然后再经过POSTROUTING发送出去,流程为: ①--->③--->④--->⑥;
3) 主机发送数据包时,流程则是⑤--->⑥;
4) 其中PREROUTING和POSTROUTING指的是数据包的流向,如上图所示POSTROUTING指的是发往公网的数据包,而PREROUTING指的是来自公网的数据包。
4、IPtables四张表、五条链。
IPtables具有Filter,、NAT、Mangle、Raw四个内建表。
5、linux下的IPtables下filter表
filter表示iptables的默认表,默认有三种内建表:
INPUT链:处理来自外部的数据
OUTPUT链:处理向外发送的数据
FORWARD链:将数据转发到本机或其他网卡设备上。
6、linux下IPtables下的NAT表
NAT表有三种内建链:
PREROUTING链:处理到达本机并在路由转发前的数据包,它会转发数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)
POSTROUTING链 – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)
OUTPUT链:处理本机产生的数据包
7、linux下IPtables命令
1.命令: -A 顺序添加,添加一条新规则 -I 插入,插入一条新规则 -I 后面加一数字表示插入到哪行 -R 修改, 删除一条新规则 -D 后面加一数字表示删除哪行 -D 删除,删除一条新规则 -D 后面加一数字表示删除哪行 -N 新建一个链 -X 删除一个自定义链,删除之前要保证次链是空的,而且没有被引用 -L 查看 @1.iptables -L -n 以数字的方式显示 @2. iptables -L -v显示详细信息 @3. iptables -L -x 显示精确信息 -E 重命名链 -F 清空链中的所有规则 -Z 清除链中使用的规则 -P 设置默认规则 2.匹配条件: 隐含匹配: -p tcp udp icmp --sport指定源端口 --dport指定目标端 -s 源地址 -d 目的地址 -i 数据包进入的网卡 -o 数据包出口的网卡 扩展匹配: -m state --state 匹配状态的 -m mutiport --source-port 端口匹配 ,指定一组端口 -m limit --limit 3/minute 每三分种一次 -m limit --limit-burst 5 只匹配5个数据包 -m string --string --algo bm|kmp --string"xxxx" 匹配字符串 -mtime--timestart 8:00 --timestop 12:00 表示从哪个时间到哪个时间段 -mtime--days 表示那天 -m mac --mac-source xx:xx:xx:xx:xx:xx 匹配源MAC地址 -m layer7 --l7proto qq 表示匹配腾讯qq的 当然也支持很多协议,这个默认是没有的,需要我们给内核打补丁并重新编译内核及iptables才可以使用 -m layer7 这个显示扩展匹配 3.动作: -j DROP 直接丢掉 ACCEPT 允许通过 REJECT 丢掉,但是回复信息 LOG --log-prefix"说明信息,自己随便定义" ,记录日志 SNAT 源地址转换 DNAT 目标地址转换 REDIRECT 重定向 MASQUERAED 地址伪装 保存iptables规则 service iptables save # 重启iptables服务 service iptables stop service iptables start
WEB服务器,开启80端口: iptables -A INPUT -p tcp --dport 80 -j ACCEPT 邮件服务器,开启25,110端口 iptables -A INPUT -P tcp --dport 110 -j ACCEPT iptables -A INPUT -P tcp --dport 25 -j ACCEPT FTP服务器,开启21端口 iptables -A INPUT -P tcp --dport 20 -j ACCEPT iptables -A INPUT -P tcp --dport 21 -j ACCEPT DNS服务器开启53号端口 iptables -A INPUT -p tcp --dport 53 -j ACCEPT 允许icmp包通过,也就是允许ping iptables -A OUTPUT -p icmp -j ACCEPT(DROP) iptables -A INPUT -p icmp -j ACCEPT(DROP) 将本机的8080端口转发至其他主机,主机IP:192.168.0.111 ,目标主机和端口:192.168.0.112:80 iptables -t nat -A PREROUTING -p tcp -m tcp -d 192.168.0.111 --dport 8080 -j DNAT --to-destination 192.168.0.112:80 iptables -t nat -A POSTROUTING -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.0.111:8080 echo 1>/proc/sys/net/ipv4/ip_forward 同时开启iptables forward
用 iptables 将 192.168.0.100 的 80 端口映射到 192.168.0.111 的 8080 端口 iptables -t nat -A PREROUTING -p tcp -d 192.168.0.100 --dport 80 -j DNAT -to-destination 192.168.0.111:8080 本机的80端口转到8080端口 iptables -t nat -A PREROUTING -p tcp --dport -j REDIRECT --to-ports 8080
门户网站iptables规则策略如下
*filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [602:39593] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -s 192.168.0.111 -j DROP -A INPUT -s 192.168.0.112 -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -P tcp -m state --state NEW -M tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT -A INPUT -s 116.243.139.7 -p tcp -m state --state NEW -m tcp --dport 7001 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 8801 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT #### -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT