Linux iptables
防火墙概述:
1、防火墙工作在主机边缘:对于进出本网络或者本主机的数据报文,根据事先设定好的检查规则对其检查,对所有的报文一律按照事先定义好的处理机制做出相应处理
2、linux的tcp/ip协议栈是在内核当中,意味着报文的处理是在内核中处理的,也就是说防火墙必须在工作在内核中,防火墙必须在内核中完成tcp/ip报文所流进的位置,用规则去检查,才真正能工作起来
3、在linux中真正实现防火墙功能的是处于内核空间中的netfilter,但是内核空间用户无法直接操作,所以linux上诞生了一个netfilter的管理软件,可以让用户通过这个软件在netfilter做一系列操作,这个软件就是iptables
Netfilter:
Netfilter 是 Linux 操作系统内核的一个数据包处理模块, 它具有如下功能:
网络地址转换(NAT)
数据包内容修改
以及数据包过滤的防火墙功能
Netfilter 中制定了数据包的五个挂载点(Hook Point), 即 iptables 中的 "五链"
这五个挂载点, 我们可以理解为回调函数, 数据包到达指定位置时会主动调用对应函数, 根据这些函数中定义的规则处理数据包
这5个挂载点分别是:
PRE_ROUTING
INPUT
OUTPUT
FORWARD
POST_ROUTING
数据包的流入顺序:
数据包从网络接口进入 TCP/IP 协议栈, 进行IP校验以后, 数据包被第一个钩子函数 PRE_ROUTING 处理, 然后就进入路由模块, 由其决定该数据包是转发出去还是送给本机
若该数据包是送给本机的, 则经过 LOCAL_IN(INPUT) 处理后传递给本机的上层协议
若该数据包应该被转发, 则将其交给 FORWARD 处理, 然后经过 POST_ROUTING 处理后传输到网络
本机进程产生的数据包则要先经 LOCAL_OUT(OUTPUT) 处理后, 再进行路由选择处理, 然后经过 POST_ROUTING 处理后再发送到网络
iptables:
Netfilter 设置的规则存放于内核内存之中, 而 iptables 是一个应用层的应用程序, 它通过 Netfilter 暴露的接口来对存放在内核内存中的 XXtables(Netfilter的配置表)进行操作
XXtables 由表(tables)、链(chains)、规则(rules) 组成, iptables 在应用层负责修改这些规则, 类似的应用程序还有 firewalld(centos 7中默认的防火墙应用程序)
iptables 处理数据包的完整流程:
iptables 表和链:
filter: 用于对数据包进行过滤, 内置三个链, 可以对包进行 DROP、LOG、ACCEPT 和 REJECT 等操作 内置的链: INPUT 用于对入口流量包进行检测 FORWARD 过滤所有不是本地产生的并且目的地不是本地(即本机只是负责转发)的包 OUTPUT 用于对出口流量包进行检测 nat: 主要用于修改数据包的IP地址、端口号等信息, 内置三个链, 可实现 SNAT、DNAT、MASQUERADE、REDIRECT 等操作 属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包), 只会经过这个表一次 如果第一个包被允许做 NAT 或 MASQUERADE, 那么余下的包都会自动地被做相同的操作, 也就是说, 余下的包不会再通过这个表 内置的链: PREROUTING 对入口方向到达 nat 表的数据包进行修改(可实现 DNAT 功能) OUTPUT 改变本地产生的包的目的地址 POSTROUTING 对出口方向到达 nat 表的数据包进行修改(可实现 SNAT 功能) mangle: 用于修改数据包属性等操作, 需要相应的路由设备支持, 内置五个链 内置的链: PREROUTING POSTROUTING INPUT OUTPUT FORWARD raw: 对数据包进行状态跟踪, 内置二个链 内置的链: OUTPUT PREROUTING
iptables 处理数据包的动作:
ACCEPT 允许数据包通过 DROP 直接丢弃数据包, 不给任何回应信息 REJECT 拒绝数据包通过, 必要时会给数据发送端一个响应的信息 SNAT 源地址转换, 主要用于实现多个内网用户用同一个公网地址上网的问题 MASQUERADE 地址伪装, 在 iptables 中有着和 SNAT 相近的效果 区别: SNAT 是指定数据包从网卡发送出去的时候, 把数据包中的源地址部分替换为指定的IP, 这样接收方就认为数据包的来源是被替换的那个IP的主机 MASQUERADE 是用发送数据的网卡上的IP来替换源IP, 因此对于 IP 不固定的场合, 比如拨号网络或者通过 dhcp 分配 IP 的情况下, 必须用 MASQUERADE DNAT 目标地址转换, 主要用于服务发布 REDIRECT 是 DNAT 的一种特殊形式, 将封包重新导向到另一个端口(PNAT), 主要用于实现端口转发 LOG 在 /var/log/messages 文件中记录日志信息, 然后将数据包传递给下一条规则 注意: 除 LOG 动作以外, 其他的动作只有匹配到相应的规则之, 该数据包就不会再往下继续匹配了, 所以规则顺序极其关键
iptables 命令:
-t 指定操作的表, 默认为filter -A 新增一条规则到该规则链列表的最后一行 -I 插入一条规则原本该位置上的规则会往后顺序移动, 默认插入在第一条规则前面 -D 从规则链中删除一条规则, 可以输入完整的规则或者指定规则编号 -R 修改指定规则 -P 设置指定规则链的默认动作 -F 清空指定表的规则链 -N 在指定表上新建规则链(iptables 支持自定义规则链) -X 删除用户自定义的空链, 如果链不为空需要清空之后才能删除 -E 重命名自定义链 -Z 清空链和规则计数器 -L 查看指定表上正在运行的 iptables 规则 -n 禁止对 IP 地址或端口进行反解(通常和 -L 参数一起使用) -v 显示规则的详细信息 -vv 相对与 -v 更加详细 --line-numbers 显示规则在链上的规则编号 -i 数据包从那个网卡进入 -o 数据包从那个网卡出去 -s 数据包的原地址 --sport 数据包的原端口 -d 数据包的目的地址 --dport 数据包的目的端口 -j 处理数据包的动作, ACCEPT、DROP、REJECT 等 -m 用于提供更多的匹配参数 例如: -m state –state ESTABLISHED,RELATED -m tcp –dport 22 -m multiport –dports 80,8080 -m tcp -p tcp --dport 40001:40030
iptables 规则编写示例:
# 清空 filter 表的规则 iptables -F # 设置 filter 表的 INPUT 链的默认动作为 DROP iptables -P INPUT DROP # 只允许 192.168.0.0/24 网段的 IP 访问 22 端口 iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport 22 -j ACCEPT # 修改 filter 表的第一条 INPUT 规则, 将允许192.168.0.0/24 访问 22 端口改为允许 192.168.1.0/24 访问 iptables -R INPUT 1 -s 192.168.1.0/24 # 运行所有地址访问 80 端口(-s 和 -d 省略都表示 0.0.0.0) iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 允许 ping iptables -A INPUT -p ICMP -j ACCEPT # 删除 filter 表中 INPUT 链上的第 3 条规则 iptables -D INPUT 3 # 屏蔽 mac 为 00:00:00:00:00:00 的数据包 iptables -A INPUT -m mac --mac-source 00:00:00:00:00:00 -j DROP # 丢弃无效数据包 iptables -A INPUT -m state --state INVALID -j DROP # 禁止所有数据包发往 eth0 iptables -A INPUT -i eth0 -j DROP # 允许访问回环网卡 iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # 限制 80 端口的并发连接数为 2000, 需要 iptables v1.4.19 以上版本 iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 2000 -j REJECT # 记录日志, 限制日志记录频率 3 分钟记录 8 次 iptables -R INPUT 1 -p tcp --dport 22 -m limit --limit 3/minute --limit-burst 8 -j LOG 地址转换: SNAT: 需求: 目前只有一台服务器拥有外网 IP 但是内网的其他服务器都需要访问外网 A 服务器: 拥有外网 IP 的服务器 外网IP: 123.123.124.125 内网IP: 192.168.0.104 B 服务器: 需要访问外网的服务器 内网IP: 192.168.0.105 A 服务器配置: # 打开路由转发(临时生效, 永久生效请修改 /etc/sysctl.conf 文件) sysctl -w net.ipv4.ip_forward=1 # 允许 192.168.0.0/24 进行原地址转换, eth1 为外网 IP 所在的网卡, 123.123.124.125 为外网 IP iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT --to-source 123.123.124.125 B 服务器配置: # 将默认路由指向 SNAT 服务器 route add default gw 192.168.0.104 DNAT: 需求: 使外网主机可以通过特定端口 ssh 内网的服务器 A 服务器: 拥有外网 IP 的服务器 外网IP: 123.123.124.125 内网IP: 192.168.0.104 B 服务器: 需要访问外网的服务器 内网IP: 192.168.0.105 A 服务器配置: # 打开路由转发(临时生效, 永久生效请修改 /etc/sysctl.conf 文件) sysctl -w net.ipv4.ip_forward=1 # 将访问 2183 端口的数据包转发到 192.168.0.183 的 22 端口, eth1 为外网 IP 所在的网卡, 123.123.124.125 为外网 IP iptables -t nat -A PREROUTING -i eth1 -d 123.123.124.125 -p tcp --dport 2183 -j DNAT --to-destination 192.168.0.183:22 B 服务器配置: # 将默认路由指向 SNAT 服务器 route add default gw 192.168.0.104 防止轻微的攻击: # 防止 SYN 攻击 iptables -N syn-flood iptables -A INPUT -p tcp --syn -j syn-flood iptables -I syn-flood -p tcp -m limit --limit 2/s --limit-burst 5 -j RETURN iptables -A syn-flood -j REJECT # 防止 DOS 太多连接进来, 允许外网网卡每个 IP 最多15个初始连接, 需要 iptables v1.4.19以上版本 iptables -A INPUT -i eth0 -p tcp --syn-m connlimit --connlimit-above 15 -j DROP iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT #防止 DDOS iptables -A INPUT -p tcp --syn -m limit --limit 5/s --limit-burst 10 -j ACCEPT iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT iptables -A FORWARD -p icmp -m limit --limit 2/s --limit-burst 10 -j ACCEPT iptables -A INPUT -p icmp --icmp-type 0 -s ! 172.29.73.0/24 -j DROP
iptables规则持久化和备份:
# 持久化, 将规则写入到 /etc/sysconfig/iptables 文件 service iptables save # 将 iptables 规则备份到 /root/iptables.bak 文件 iptables-save > /root/iptables.bak # 还原 iptables 规则 iptables-restore < /root/iptables.bak
posted on 2018-11-12 17:44 HuYuanBlog 阅读(455) 评论(0) 编辑 收藏 举报