photo_2021-01-04_16-55-57.jpg

利用 IPtables 为服务器设置仅对特定IP段开放指定端口的方法(例如Cloudflare的加速节点);

主理人序

大概在2019年的8、9月,基于对博客防御措施的真实需要考量开始收集大量关于网站防御的知识;参阅

什么是防火墙

简单来说,防火墙是一种网络隔离工具,部署于主机或者网络的边缘,目标是对于进出主机或者本地网络的网络报文根据事先定义好的规则做匹配检测,规则匹配成功则对相应的网络报文做定义好的处理(允许,拒绝,转发,丢弃等)。防火墙根据其管理的范围来分可以将其划分为主机防火墙和网络防火墙;根据其工作机制来区分又可分为包过滤型防火墙(netfilter)和代理服务器(Proxy)。我们接下来在这篇笔记中主要说说包过滤型防火墙(netfilter)。

IPtable 介绍

Iptables-flow.PNG

包过滤型防火墙主要依赖于 Linux 内核软件 netfilter,它是一个 Linux 内核“安全框架”,而 iptables 是内核软件 netfilter 的配置工具,工作于用户空间。iptables/netfilter 组合就是 Linux 平台下的过滤型防火墙,并且这个防火墙软件是免费的,可以用来替代商业防火墙软件,来完成网络数据包的过滤、修改、重定向以及网络地址转换(nat)等功能。

nftables 已经包含在 Linux kernel 3.13 中,以后会取代 iptables 成为主要的 Linux 防火墙工具。netfilter 中的五个钩子(这里也称为五个关卡)分别为:PRE_ROUTING/INPUT/FORWARD/OUTPUT/POST_ROUTING;

匹配流程示意图.png

四表五链

iptables - 四表五链.png

四表
raw:高级功能,如:网址过滤。
mangle:数据包修改(QOS),用于实现服务质量。
net:地址转换,用于网关路由器。
filter:包过滤,用于防火墙规则。

五链
INPUT 链:发往本机的报文
OUTPUT 链:由本机发出的报文
FORWARD 链:经由本机转发的报文
PREROUTING 链:报文到达本机,进行路由决策之前
POSTROUTING 链:报文由本机发出,进行路由决策之后

via ArchWiki/morven lifeiptables (简体中文) - ArchWiki.pdf

IPtable 命令

语法

iptables(选项)(参数)

选项;

-t<表>:指定要操纵的表;
-A:向规则链中添加条目;
-D:从规则链中删除条目;
-i:向规则链中插入条目;
-R:替换规则链中的条目;
-L:显示规则链中已有的条目;
-F:清楚规则链中已有的条目;
-Z:清空规则链中的数据包计算器和字节计数器;
-N:创建新的用户自定义规则链;
-P:定义规则链中的默认目标;
-h:显示帮助信息;
-p:指定要匹配的数据包协议类型;
-s:指定要匹配的数据包源ip地址;
-j<目标>:指定要跳转的目标;
-i<网络接口>:指定数据包进入本机的网络接口;
-o<网络接口>:指定数据包要离开本机所使用的网络接口。
表名包括:
raw:高级功能,如:网址过滤。
mangle:数据包修改(QOS),用于实现服务质量。
net:地址转换,用于网关路由器。
filter:包过滤,用于防火墙规则。

规则链名包括:
INPUT链:处理输入数据包。
OUTPUT链:处理输出数据包。
PORWARD链:处理转发数据包。
PREROUTING链:用于目标地址转换(DNAT)。
POSTOUTING链:用于源地址转换(SNAT)。

动作包括:
accept:接收数据包。
DROP:丢弃数据包。
REDIRECT:重定向、映射、透明代理。
SNAT:源地址转换。
DNAT:目标地址转换。
MASQUERADE:IP伪装(NAT),用于ADSL。
LOG:日志记录。

via iptables命令
iptables命令_Linux iptables 命令用法详解:Linux上常用的防火墙软件.pdf

脚本配置应用参考

可根据需要删减增加端口,3306/2408 端口是博主在原始脚本的基础上增加的,目的是为了保护MySQL,2408端口单独对 Cloudflare 开放的原因是因为要使用到 Cloudflare的 Railgun

Cloudflare CDN 节点IP段参阅: https://www.cloudflare.com/zh-cn/ips/ https://www.cloudflare.com/ips-v4 https://www.cloudflare.com/ips-v6

#!/bin/bash
# Name  : Anti IP Leakage
# Author: Zhys
# Date  : 2019
# www.9sep.org

netfilter-persistent flush

# 禁止来自IPv4的所有HTTP/S访问请求
iptables -I INPUT -p tcp --dport 80 -j DROP
iptables -I INPUT -p tcp --dport 443 -j DROP
iptables -I INPUT -p tcp --dport 3306 -j DROP
iptables -I INPUT -p tcp --dport 2408 -j DROP

# 对Cloudflare CDN IPv4地址开放HTTP/S入站访问
for i in `curl https://www.cloudflare.com/ips-v4`; do iptables -I INPUT -s $i -p tcp --dport 80 -j ACCEPT; done
for i in `curl https://www.cloudflare.com/ips-v4`; do iptables -I INPUT -s $i -p tcp --dport 443 -j ACCEPT; done
for i in `curl https://www.cloudflare.com/ips-v4`; do iptables -I INPUT -s $i -p tcp --dport 2408 -j ACCEPT; done
iptables -I INPUT -s ipv4Address -p tcp --dport 2408 -j ACCEPT;
iptables -I INPUT -s ipv4Address -p tcp --dport 443 -j ACCEPT;
#iptables -I INPUT -s 127.0.0.1 -p tcp --dport 443 -j ACCEPT;

# 禁止来自IPv6的所有HTTP/S访问请求
ip6tables -I INPUT -p tcp --dport 80 -j DROP
ip6tables -I INPUT -p tcp --dport 443 -j DROP
ip6tables -I INPUT -p tcp --dport 3306 -j DROP
ip6tables -I INPUT -p tcp --dport 2408 -j DROP

# 对Cloudflare CDN IPv6地址开放HTTP/S入站访问
for i in `curl https://www.cloudflare.com/ips-v6`; do ip6tables -I INPUT -s $i -p tcp --dport 80 -j ACCEPT; done
for i in `curl https://www.cloudflare.com/ips-v6`; do ip6tables -I INPUT -s $i -p tcp --dport 443 -j ACCEPT; done
for i in `curl https://www.cloudflare.com/ips-v6`; do ip6tables -I INPUT -s $i -p tcp --dport 2408 -j ACCEPT; done
ip6tables -I INPUT -s ipv6Address -p tcp --dport 2408 -j ACCEPT;
ip6tables -I INPUT -s ipv6Address -p tcp --dport 443 -j ACCEPT;

# 保存iptables配置
netfilter-persistent save
iptables-save
ip6tables-save

# 注意:80/443为默认HTTP/S协议通讯使用端口,若实际应用使用非80/443端口进行,请依葫芦画瓢自行修改脚本
# Ubuntu系统可以使用UFW则类似:for i in `curl https://www.cloudflare.com/ips-v4`; do ufw allow proto tcp from $i to any port 80; done
# 基于Linux系统兼容性考虑脚本使用iptables配置系统防火墙,请自行根据各自系统、防火墙不同做相应配置调整实施
# www.9sep.org

1.以上脚本中 ipv4Addressipv6Address 请替换为服务器的ipv4/ipv6地址;
2.netfilter-persistent flush 命令实现对表的重置(Reset);
3.netfilter-persistent save 命令实现对表的永久化保存,即时服务器重启;
4.iptables 命令对 ipv4 进行控制;
5.ip6tables 命令对 ipv6 进行控制;

本脚本(有修改)援引自 www.9sep.org,毒奶博客最初部署于2019年10月下旬(那段时间有大量压测);

最后修改:2021 年 05 月 02 日 01 : 42 PM