相信很多人都熟悉iptables。 kangle的访问控制理念来自linux的iptables防火墙,kangle拥有功能最小化的匹配模块和标记模块,通过组合,反转等可以实现用户最复杂的需求; 最小化的匹配模块和标记模块犹如最小块的积木,独具匠心的玩家,总是能用小积木搭建出千变万化的造形。 Kangle的访问控制分为请求控制和回应控制 请求控制在最前面,用户发送请求过来时即进行请求控制。 回应控制发生在数据发送给用户之前,即进行回应控制。 Kangle详细数据流向图请查看: 说明: 如果在"回应控制”没有看到"POSTMAP表",可以自行建立。 “POSTMAP表”完成url到物理文件的映射。 例如: POSTMAP表对文件进行管理。 禁止文件被下载(日志文件不允许被下载)等 每个控制由一张或多张表加一个默认目标组成,其中BEGIN表是系统内建表,所有控制从BEGIN开始。 每张表可以定义若干条“链”,在一张表中控制按顺序从上到下对规则链进行匹配。 规则链由一个目标和任意个匹配模块和任意个标记模块组成。 在表中,用户可以按需要随意添加、删除、编辑或反转规则链。 在"请求控制”内有一个系统表:"BEGIN表" 在"回应控制”内有两个系统表"BEGIN表"和"POSTMAP表" “POSTMAP表”完成url到物理文件的映射。用户使用"POSTMAP表",需要自行创建。 例如:对文件进行管理、禁止文件被下载(日志文件不允许被下载)等可用"POSTMAP表"。 kangle如果发现用户的请求匹配了一个规则链中的匹配模块,则进入标记模块对请求做简单的处理,之后就按该条规则链指定的目标处理。如果目标是继续,则还要进行下一条规则链处理,否则就返回控制,按控制“目标”进行处理。 如果目标是“继续”,则还要进行下一条规则链的处理。 如果目标是“默认”,则控制按默认目标处理(默认目标有:拒绝、回写数据、服务器、虚拟主机等)。 如果目标是“拒绝”,则将对用户的请求拒绝并发送错误信息给用户,之后中断连接。 如果目标是“虚拟主机”,则将对用户请求使用虚拟主机处理。 如果目标是“服务器”,则用户使用的是反代。 如果目标是“回写数据”,则将对用户的请求拒绝,并发送管理员设定的原始数据给用户。 详细Kangle访问控制模块列表及说明: Kangle访问控制模块wiki 模块分类 kangle访问控制模块,按功能分为匹配模块和标记模块,按位置分为请求控制模块和回应控制模块。匹配模块只用来匹配相关数据,而不修改,标记模块就有可能修改,或特殊目的。 每个模块,都可以加上or='0|1' revers='0|1' 两个属性。 or表示和下一个模块是或的关系,默认是与(AND)的关系。(kangle 3.1.7开始支持) revers表示逻辑反转,默认不反转。 请求控制匹配模块 url 说明:匹配用户url网址。网址可以使用正则表达式 范围: 请求控制和回应控制 语法: <acl_url ><![CDATA[url地址]]></acl_url> 使用例子: <acl_url ><![CDATA[www.test.com]]></acl_url> reg_path 说明:匹配路径。可以使用正则表达式匹配路径 范围: 请求控制和回应控制 语法: <acl_reg_path path='路径' raw='原始的' nc='不区分大小写'></acl_reg_path> 使用例子: <acl_reg_path path='^/admin/'></acl_reg_path> reg_param 说明:可用正则表达式进行url参数匹配 范围: 请求控制和回应控制 语法: <acl_reg_param param='url参数'></acl_reg_param> 使用例子: <acl_reg_param param='^http://www.kanglesoft.com/'></acl_reg_param> path 说明:匹配路径 范围: 请求控制和回应控制 语法: <acl_path path='路径'></acl_path> 使用例子: <acl_path path='/admin/'></acl_path> dst_port 说明:匹配目标端口 范围: 请求控制和回应控制 语法: <acl_dst_port >端口</acl_dst_port> 使用例子: <acl_dst_port >80</acl_dst_port> meth 说明:匹配http请求方法(如get 、post) 范围: 请求控制和回应控制 语法: <acl_meth >参数</acl_meth> 使用例子: <acl_meth >GET</acl_meth> file_ext 说明:匹配一个或多个文件扩展名 范围: 请求控制和回应控制 语法: <acl_file_ext split='|'>文件扩展名</acl_file_ext> 使用例子: <acl_file_ext split='|'>html|js|php</acl_file_ext> host 说明:匹配一个或多个主机头 范围: 请求控制和回应控制 语法: <acl_host split='|'>主机头地址</acl_host> 使用例子: <acl_host split='|'>www.test.com|www.ttt.com</acl_host> wide_host 说明:泛域名匹配 范围: 请求控制和回应控制 语法: <acl_wide_host v='域名1|域名2'></acl_wide_host> 使用例子: <acl_wide_host v='abc.com|*.abc.com'></acl_wide_host> map_host 说明:匹配一个或多个主机头与“host”的区别:map_host是以文件形式来存放主机头进行匹配 范围: 请求控制和回应控制 语法: <acl_map_host file='文件名'></acl_map_host> 使用例子: <acl_map_host file='host.txt'></acl_map_host> 注:在文件中域名一行写一个 header 说明:匹配http头 范围:请求控制和回应控制 语法: <acl_header header='http头' regex='1'><![CDATA[参数]]></acl_header> 使用例子: <acl_header header='content-type' regex='1'><![CDATA[text/html]]></acl_header> self 说明:匹配当前连接的服务器ip 范围:请求控制和回应控制 语法: <acl_self >ip地址</acl_self> 使用例子: <acl_self >192.168.1.203</acl_self> selfs 说明:匹配多个本机ip地址 范围:请求控制和回应控制 语法: <acl_selfs split='|'>ip地址</acl_selfs> 使用例子: <acl_selfs split='|'>192.168.1.203|192.168.1.205</acl_selfs> sefl_port 说明:匹配当前连接的服务器端口 范围:请求控制和回应控制 语法: <acl_self_port >端口号</acl_self_port> 使用例子: <acl_self_port >80</acl_self_port> self_ports 说明:匹配多个本机端口 范围:请求控制和回应控制 语法: <acl_self_ports split='|'>端口号</acl_self_ports> 使用例子: <acl_self_ports split='|'>80|3320</acl_self_ports> src 说明:匹配源地址(ip或者ip段) 范围:请求控制和回应控制 语法: <acl_src >ip或ip段</acl_src> 使用例子: <acl_src >203.168.1.0/24</acl_src> srcs 说明:多ip段 范围:请求控制和回应控制 语法: <acl_srcs split='|'>ip段地址</acl_srcs> 使用例子: <acl_srcs split='|'>203.158.0.|203.168.1.</acl_srcs> time 说明:匹配当前时间,格式为:“crontab” 范围:请求控制和回应控制 参数格式: * * * * * 分 时 日 月 周 语法: <acl_time time='参数'></acl_time> 使用例子: <acl_time time='30 21 * * *'></acl_time> 例子表示每晚的21:30执行 ssl_serial 说明:匹配证书序列号 范围:请求控制和回应控制 语法: <acl_ssl_serial icase='1' split='|'>证书序列号</acl_ssl_serial> 使用例子: <acl_ssl_serial icase='1' split='|'>df48a548cef576bb4ae7a726b693842</acl_ssl_serial> auth_user 说明:匹配http认证用户 范围:请求控制和回应控制 语法: <acl_auth_user split='|'>用户名1|用户名2</acl_auth_user> 例匹配用户名是usera和用户名为userb <acl_auth_user split='|>usera|userb</acl_auth_user> referer 说明:url来源 范围:请求控制和回应控制 参数: Null:匹配为空 NotNull:匹配不为空 EqHost:来源的域名和访问的域名相同 语法: <acl_referer referer='参数'></acl_referer> 使用例子: <acl_referer referer='NotNull'></acl_referer> ip_rate 说明:ip访问频率 范围:请求控制和回应控制 语法: <acl_ip_rate request='次数' second='时间单位秒'></acl_ip_rate> 使用例子: <acl_ip_rate request='20' second='10'></acl_ip_rate> 设置匹配每ip10秒内可以访问20次 mark 说明:印记模块 范围:请求控制和回应控制 参数: eq是等于 lt是小于 gt是大于 语法: <acl_mark op='eq' v='参数'></acl_mark> 参数可以设置在0-255范围内,mark可以将请求控制和回应控制中的模块通过印记模块串连起来 使用例子: <acl_mark op='eq' v='100'></acl_mark> per_ip 说明:匹配每ip连接数 范围:请求控制和回应控制 语法: <acl_per_ip max='数值'></acl_per_ip> 使用例子: <acl_per_ip max='100'></acl_per_ip> 匹配每ip 100连接数 worker 说明:检测队列类型 范围:请求控制和回应控制 参数: rq:请求队列 io:io队列 dns:dns工作数 语法: <acl_worker type='队列类型' max='达到匹配的设定参数就返回成功'></acl_worker> 使用例子: <acl_worker type='rq' max='20'></acl_worker> 请求控制标记模块 speed_limit 说明:单连接限速只针对当前连接 speed_limit模块使用方法请参考 gspeed_limit 说明:分组限速针对所有连接 gspeed_limit模块使用方法请参考 ip_speed_limit 说明:每ip限速,限速针对每ip ip_speed_limit模块使用方法请参考 flag 说明:对用户请求作不缓存、不过滤内容及不防cc攻击标记 范围:请求控制 参数: clear flag(clear):清除设置 不缓存(no_cache):不缓存 多节点忽略宕机切换(mserver_noswitch):勾选后多节点宕机不会自动切换 忽略网络错误(ignore_error):勾选后做多节点cdn源机出现问题,cdn节点仍可以访问 上流短连接(upstream_noka):上游使用短链接 原始url代理:(raw_proxy) double_cache_expire:双倍过期时间 x_cache:插入x-cache via:插入via no_x_forwared_for:不插入x_forwared_for(如果没有勾选,默认是插入x_forwared_for) x_real_ip: 插入真实ip no_buffer: 不使用缓冲 语法: <mark_flag no_cache='参数' ></mark_flag> 使用例子: <mark_flag no_cache='1' ></mark_flag> 例子说明:不缓存 rewrite 说明:url重写 范围:请求控制 参数: prefix:前缀 path:路径 rewrite to:重写到 code:状态码 internal:内部的 no case:忽略大小写 qsappend:附加的url参数 语法: <mark_rewrite path='路径' dst='重写到' internal='0' nc='1' qsa='1' code='重写代码'></mark_rewrite> 使用例子 <mark_rewrite path='(.*)' dst='http://t.com$1' internal='0' nc='1' qsa='1' code='301'></mark_rewrite> redirect 说明:url重定向 范围:请求控制 语法: <mark_redirect dst='重定向到的地址' internal='内部的' code='状态码'></mark_redirect> 使用例子: <acl_host split='|'>www.php22.com</acl_host> <mark_redirect dst='http://127.0.0.100/' internal='1' code='301'></mark_redirect> auth 说明:http认证 范围:请求控制 参数: file:文件名 crypt_type:加密类型 auth_type:论证类型 realm:一般使用默认的 require:验证使用的帐户名是否被允许使用kangle服务器 语法: <mark_auth file='文件名' crypt_type='加密类型' auth_type='论证类型' realm='kangle' require='*'></mark_auth> 使用例子: <mark_auth file='fly.txt' crypt_type='plain' auth_type='Basic' realm='kangle' require='*'></mark_auth> host_rewrite 说明:主机重写 范围:请求控制 语法: <mark_host_rewrite reg_host='需重定向域名' host='www.php22.com' port='80' proxy='0或1(1是反代)' rewrite='0或1(1是重写)' life_time='生存时间'> </mark_host_rewrite> 使用例子: <mark_host_rewrite reg_host='(.*)' host='www.php22.com' port='80' proxy='0' rewrite='1' life_time='0'></mark_host_rewrite> 本例是所有域名访问重定向到www.php22.com anti_cc 说明:防CC模块 范围:请求控制 参数: wl(white list):1代表勾选白名单,0表示不勾选白名单,白名单时间有效时间以你的设置为准,可在kangle--》配置--》资源限制--》白名单有效期 fix_url: 勾选后,如触发了防CC,在地址栏不会显示一串长长的字符,这样让地址栏显得更友好 skip_cache:勾选后,如果是缓存了的内容,就会跳过防CC规则 语法: <mark_anti_cc request='次数' second='时间/秒' wl='白名单'><![CDATA[防CC代码]]></mark_anti_cc> 使用例子: <mark_anti_cc request='20' second='10' wl='1'><![CDATA[HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Connection: close <html><body><script language="javascript">window.location="{ {murl}}";</script></body></html>]]></mark_anti_cc> 注:{ {murl}}左右两边的大括号在写配置文件时中间不要有空格 extend_flag 说明:是否启用扩展卡 范围: 请求控制和回应控制 语法: <mark_extend_flag no_extend='参数'></mark_extend_flag> 使用例子: <mark_extend_flag no_extend='1'></mark_extend_flag> 勾选了无扩展,全部文件以源文件形式显示,(这个模块在回应控制中要添加在POSTMAP表里面,因为在回应控制的BEGIN表里面,数据已经产生所以没有效果。如果在回应控制里没有POSTMAP表可以手动添加这个表) host 说明:主机头 范围:请求控制 参数: host:主机头 port:端口 life_time:生存时间 rewrite:重写 语法: <mark_host host='主机头' port='端口号' proxy='反代'></mark_host> 使用例子: <mark_host host='test986.com' port='80' proxy='1'></mark_host> replace_ip 说明:ip替换 范围:请求控制 语法: <mark_replace_ip header='参数'></mark_replace_ip> 使用例子: <mark_replace_ip header='X-Real-Ip'></mark_replace_ip> param 说明:参数过滤 范围:请求控制 语法: <mark_param name='命名' value='需要过滤的参数' get='0或1' post='0或1' icase='0或1(1是忽略大小写)' charset='编码'></mark_param> 使用例子: <mark_param name='name' value=''.*[; ]?((or)|(insert)|(select)|(union)|(update)|(delete)|(replace)| (create)|(drop)|(alter)|(grant)|(load)|(show)|(exec))[\s(]' get='1' post='1' icase='1' charset='utf-8'> </mark_param> 本例是防SQL注入攻击 post_file 说明:上传文件过滤 范围:请求控制 语法: <mark_post_file filename='参数' icase='0或1(1是忽略大小写)'></mark_post_file> 使用例子: <mark_post_file filename='\.((php)|(htm)|(html))$' icase='1'></mark_post_file> 本例是防上传木马示例 mark 请参考请求控制匹配模块的mark模块 black_list 说明:插入到黑名单 范围:请求控制和回应控制 语法: <mark_black_list ></mark_black_list> 这个模块只要这样添加了就可以了 check_black_list 说明:检查黑名单 范围:请求控制 语法: <mark_check_black_list time_out='加入黑名单后限制时间'></mark_check_black_list> 使用例子: <mark_check_black_list time_out='1800'></mark_check_black_list> 是黑名单就拒绝 ,check_black_list模块一般加在black_list模块前面 flow 说明:流量统计 范围:请求控制和回应控制 参数: reset:重置 (如果勾选了reset这个选项,重新点提交后,统计就会重新计算,此选项需要3311的flow访问控制模块里设置) 语法: <mark_flow flow='0' cache='0' ></mark_flow> param_count 说明:防hash攻击 范围:请求控制和回应控制 语法: <mark_param_count get='1' post='1' max_count='允许的参数数量' ></mark_param_count> 使用例子: <mark_param_count get='1' post='1' max_count='1000' ></mark_param_count> 上例主要是防hash攻击,max_count=1000是最多允许的参数数量 path_sign 说明:签名防盗链 范围:请求控制 参数: sign:签名 expire:有效期 key:密钥 说明:以上三个参数需要和您程序上的参数吻合才行 语法: <mark_path_sign sign='签名' expire='有效期' key='密钥'></mark_path_sign> 使用例子: <mark_path_sign sign='_KS' expire='_KE' key='dfsdfsdfse'></mark_path_sign> remove_header 说明:删除http头 范围: 回应控制 语法: <mark_remove_header attr='属性' val='值' ></mark_remove_header> 使用例子: <mark_remove_header attr='http-header' val='text' ></mark_remove_header> remove_param 说明:删除参数 范围:请求控制和回应控制 语法: <mark_remove_param params='参数' raw='原始的' nc='不区分大小写'></mark_remove_param> 使用例子: <mark_remove_param params='thread-1493962' raw='0' nc='1'></mark_remove_param> self_ip 说明:指定出口ip 范围:请求控制 语法: <mark_self_ip ip='指定出口ip'></mark_self_ip> 使用例子: <mark_self_ip ip='192.168.1.20'></mark_self_ip> 反向代理时指定哪个ip连接源机,如果为空时进来哪个ip就哪个ip去连接 temp_file 说明:临时文件 范围:请求控制 语法: <mark_temp_file tf='0或1'></mark_temp_file> 使用例子: <mark_temp_file tf='1'></mark_temp_file> 1是on 表示使用临时文件, 0是off 表示使用内存缓存, 设置了这个模块就会忽略全局里的设置,优先使用这里 upload_progress upload_progress模块使用方法请参考 url_rewrite 说明:url重写 范围:请求控制 语法: <mark_url_rewrite url='重写url' dst='url地址' icase='1(1是忽略大小写)'> </mark_url_rewrite> 使用例子: <mark_url_rewrite url='http://www.php22.com/vhost/(.*)$' dst='http://www.php22.com/vhost/?c=session&a=loginForm' icase='1'> </mark_url_rewrite> kangle的url_rewrite重写带协议,比如是http的就在地址前面写上http 回应控制匹配模块 url 请参考请求控制匹配模块的url模块 reg_path 请参考请求控制匹配模块的reg_path模块 reg_param 请参考请求控制匹配模块的reg_param模块 path 请参考请求控制匹配模块的path模块 dst_port 请参考请求控制匹配模块的dst_port模块 meth 请参考请求控制匹配模块的meth模块 src 请参考请求控制匹配模块的src模块 srcs 请参考请求控制匹配模块的srcs模块 file_ext 请参考请求控制匹配模块的file_ext模块 host 请参考请求控制匹配模块的host模块 wide_host 请参考请求控制匹配模块的wide_host模块 map_host 请参考请求控制匹配模块的map_host模块 header 请参考请求控制匹配模块的header模块 self 请参考请求控制匹配模块的self模块 selfs 请参考请求控制匹配模块的selfs模块 sefl_port 请参考请求控制匹配模块的sefl_port模块 self_ports 请参考请求控制匹配模块的self_ports模块 file 说明:匹配一个或多个文件 范围:回应控制 语法: <acl_file split='|'>匹配文件</acl_file> 使用例子 <acl_file split='|'>D:\project\eeee\test2\index.html</acl_file> 匹配的路径要写具体的路径,像reg_file可使用正则就不需要写具体的路径 filename 说明:匹配一个或多个文件名 范围:回应控制 语法: <acl_filename split='|'>匹配文件名</acl_filename> 使用例子: <acl_filename split='|'>index.html|test.php</acl_filename> dir 说明:匹配多个目录下的文件。按目录匹配 范围:回应控制 语法: <acl_dir split='|'>匹配文件目录名</acl_dir> 使用例子: <acl_dir split='|'>D:\project\eeee\test2</acl_dir> reg_file 说明:匹配一个或多个文件。可用正则表达式表示 范围:回应控制 语法: <acl_reg_file file='匹配文件'></acl_reg_file> 使用例子: <acl_reg_file file='(D:\\project\\eeee\\test2(.*))|D:\\project\\eeee\\test(.*)'></acl_reg_file> 上例是匹配test2和test这两个目录里的所有文件名 reg_filename 说明:匹配一个或多个文件名。可用正则表达式表示 范围:回应控制 语法: <acl_reg_filename filename='匹配文件名'></acl_reg_filename> 使用例子: <acl_reg_filename filename='(index\.html)|(php\.php)'></acl_reg_filename> content_length 说明:配置内容大小 范围:回应控制 语法: <acl_content_length min='匹配内容起始大小' max='匹配内容最大大小' content_range='返回内容范围'></acl_content_length> 使用例子: <acl_content_length min='1' max='100K' content_range='1'></acl_content_length> 参数的单位是字节,也可以在参数后面写单位,上例中是对1字节到100K的内容大小进行匹配 mark 请参考请求控制匹配模块的mark模块 obj_flag 说明:检测网页的状态 范围:回应控制 语法: <acl_obj_flag flag='参数'></acl_obj_flag> 使用例子: <acl_obj_flag flag='nocache,'></acl_obj_flag> 上例意思是:检测回应里面是否有不允许缓存的标识 status_code 说明:状态码 范围:回应控制 参数: eq是等于 lt是小于 gt是大于 语法: <acl_status_code op='参数' code='状态码'></acl_status_code> 使用例子: <acl_status_code op='gt' code='301'></acl_status_code> worker 请参考请求控制匹配模块的worker模块 回应控制标记模块 cache_control 说明:缓存标记 范围: 回应控制 参数: static:强制缓存静态化 last_modified: 当勾选static这个选项后,勾选last-modified才会有用,勾选后会生成一个last-modified的头给浏览器(就是最后修改时间) soft: 勾选后就不会发送maxage给浏览器头 语法: <mark_cache_control max_age='设置时间' static='强制缓存静态化'></mark_cache_control> 使用例子: <mark_cache_control max_age='120' static='1'></mark_cache_control> content 说明:内容过滤(可以使用正则表达式进行内容过滤) 范围: 回应控制 语法: <mark_content charset='编码'><![CDATA[过滤的内容]]></mark_content> 使用例子: <mark_content charset='utf-8'><![CDATA[(html)|(网站控制面板)]]></mark_content> response_flag 说明:对回应给用户的请求作标记 范围: 回应控制 参数: nogzip: 不使用gzip压缩 gzip: 启用gzip压缩 nocache: 不缓存 cache: 缓存 nodiskcache: 不启用磁盘缓存 语法: <mark_response_flag flagvalue='参数'></mark_response_flag> 使用例子: <mark_response_flag flagvalue='gzip,'></mark_response_flag> add_header 说明:增加自定义头 范围: 回应控制 语法: <mark_add_header attr='属性' val='参数'></mark_add_header> 使用例子: <mark_add_header attr='http-header' val='kangle'></mark_add_header> remove_header 请参考请求控制标记模块的remove_header模块 replace_header 说明:替换http头(注:用于反代或cdn,替换源的http头) 范围: 回应控制 语法: <mark_replace_header attr='http头名' val='原始名' replace='替换后名'></mark_replace_header> 使用例子: <mark_replace_header attr='http-header' val='test' replace='test2'></mark_replace_header> footer 说明:插入内容在前面或者后面 范围: 回应控制 参数: head:插入内空在头部 replace: 选中后会替换页面的所有内容 语法: <mark_footer head='插入广告在头部'><![CDATA[插入的内容]]></mark_footer> 使用例子: <mark_footer head='1'><![CDATA[ad-test]]></mark_footer> extend_flag 请参考请求控制标记模块的extend_flag模块 http_only 说明:防XSS跨站脚本攻击 范围: 回应控制 语法: <mark_http_only cookie='参数'></mark_http_only> 使用例子: <mark_http_only cookie='.'></mark_http_only> .是匹配所有的cookie, 扩展阅读,案例说明. mark 请参考请求控制匹配模块的mark模块 replace_content 说明:替换内容 范围: 回应控制 参数: charset:编码 buffer:缓存大小 replaced_stop:勾选此选项后,含有替换内容的页面会被全部替换(注:replaced_stop选中后buffer选项才会生效) 语法: <mark_replace_content content='原始内容' replace='替换后内容' charset='编码' buffer='缓存大小'></mark_replace_content> 使用例子: <mark_replace_content content='test' replace='php' charset='utf-8' replaced_stop='1' buffer='1M'></mark_replace_content> |