网站的客户和受众人群都是国内的,不想让国外访问;或者站长监测到国外肉鸡一直有扫描或攻击。这时就需要对对境外IP进行进行过滤和屏蔽;对IP进行过滤屏蔽只有两种方法:加白加黑;加白就是把允许访问的添加入白名单中,没在白名单中的都进行屏蔽过滤,不允许访问;加黑就是把不允许访问的加入到黑名单中,没在黑名单中的完全放开,都可以进行访问。那么两种方法怎么选择呢?并且要怎样去屏蔽呢?

黑白名单

作为运维的对黑白名单肯定不会默认,但是他们的使用场景是完全不同的。根据不同场景要求,选择是加白还是加黑是很重要的。正确选择可以让我们事半功倍,而且便于后期维护,反之亦然。那么他们哪些场景选择黑名单?哪些场景选择白名单呢?黑白名单的选择是根据场景需求中目标数量的比较决定的。

黑名单

要屏蔽的目标数量远远小于允许访问的数量时,就选择黑名单。只需要把需要屏蔽的加入黑名单中,其他完全放开就可以了。

白名单

允许访问的目标数量远远小于要屏蔽的数量时就选择白名单。

工具

ipsetiptables的扩展,它允许你创建匹配整个IP地址集合的规则。可以快速的让我们屏蔽某个IP段。

原理: 利用域名解析来禁止掉海外IP访问。绝大多数域名解析服务商都是提供电信联通移动海外线路区分解析的,所以我们可以充分利用这个功能,来禁止海外访问。

以阿里云DNS解析为例:

设置A记录类型

解析线路:境外

记录值:127.0.0.1

设置后等30分钟后我们再用ping工具测试下境外解析,就会发现所有的海外线路都会解析至127.0.0.1这个IP上,为什么是127.0.0.1呢?因为这个是本地IP,如果有攻击海外肉鸡攻击这个网站,就会自己攻击自己。

黑名单屏蔽

首先需要得到国家IP段,下载地址:http://www.ipdeny.com/ipblocks/ 这里以我们国家为例。

安装ipset

#Debian/Ubuntu系统

apt-get -y install ipset

#CentOS系统

yum -y install ipset
#创建一个名为cnip的规则
ipset -N cnip hash:net
#下载国家IP段
wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone
#将IP段添加到cnip规则中
for i in $(cat /root/cn.zone ); do ipset -A cnip $i; done

开始屏蔽

iptables -I INPUT -p tcp -m set --match-set cnip src -j DROP

解除屏蔽

#-D为删除规则

iptables -D INPUT -p tcp -m set --match-set cnip src -j DROP

一键执行(谨慎执行)

为了便于实时,这里我写了个脚本,可以一键执行。适用于CentOSDebianUbuntu等常用系统

vim  sunblock.sh

#! /bin/bash
#Block-IPs-from-countries
#Blog:https://wandouduoduo.github.io/

Green="\033[32m"
Font="\033[0m"

#root权限
root_need(){
    if [[ $EUID -ne 0 ]]; then
        echo "Error:This script must be run as root!" 1>&2
        exit 1
    fi
}

#封禁ip
block_ipset(){
check_ipset
#添加ipset规则
echo -e "${Green}请输入需要封禁的国家代码,如cn(中国),注意字母为小写!${Font}"
read -p "请输入国家代码:" GEOIP
echo -e "${Green}正在下载IPs data...${Font}"
wget -P /tmp http://www.ipdeny.com/ipblocks/data/countries/$GEOIP.zone 2> /dev/null
#检查下载是否成功
    if [ -f "/tmp/"$GEOIP".zone" ]; then
	 echo -e "${Green}IPs data下载成功!${Font}"
    else
	 echo -e "${Green}下载失败,请检查你的输入!${Font}"
	 echo -e "${Green}代码查看地址:http://www.ipdeny.com/ipblocks/data/countries/${Font}"
    exit 1
    fi
#创建规则
ipset -N $GEOIP hash:net
for i in $(cat /tmp/$GEOIP.zone ); do ipset -A $GEOIP $i; done
rm -f /tmp/$GEOIP.zone
echo -e "${Green}规则添加成功,即将开始封禁ip!${Font}"
#开始封禁
iptables -I INPUT -p tcp -m set --match-set "$GEOIP" src -j DROP
iptables -I INPUT -p udp -m set --match-set "$GEOIP" src -j DROP
echo -e "${Green}所指定国家($GEOIP)的ip封禁成功!${Font}"
}

#解封ip
unblock_ipset(){
echo -e "${Green}请输入需要解封的国家代码,如cn(中国),注意字母为小写!${Font}"
read -p "请输入国家代码:" GEOIP
#判断是否有此国家的规则
lookuplist=`ipset list | grep "Name:" | grep "$GEOIP"`
    if [ -n "$lookuplist" ]; then
        iptables -D INPUT -p tcp -m set --match-set "$GEOIP" src -j DROP
	iptables -D INPUT -p udp -m set --match-set "$GEOIP" src -j DROP
	ipset destroy $GEOIP
	echo -e "${Green}所指定国家($GEOIP)的ip解封成功,并删除其对应的规则!${Font}"
    else
	echo -e "${Green}解封失败,请确认你所输入的国家是否在封禁列表内!${Font}"
	exit 1
    fi
}

#查看封禁列表
block_list(){
	iptables -L | grep match-set
}

#检查系统版本
check_release(){
    if [ -f /etc/redhat-release ]; then
        release="centos"
    elif cat /etc/issue | grep -Eqi "debian"; then
        release="debian"
    elif cat /etc/issue | grep -Eqi "ubuntu"; then
        release="ubuntu"
    elif cat /etc/issue | grep -Eqi "centos|red hat|redhat"; then
        release="centos"
    elif cat /proc/version | grep -Eqi "debian"; then
        release="debian"
    elif cat /proc/version | grep -Eqi "ubuntu"; then
        release="ubuntu"
    elif cat /proc/version | grep -Eqi "centos|red hat|redhat"; then
        release="centos"
    fi
}

#检查ipset是否安装
check_ipset(){
    if [ -f /sbin/ipset ]; then
        echo -e "${Green}检测到ipset已存在,并跳过安装步骤!${Font}"
    elif [ "${release}" == "centos" ]; then
        yum -y install ipset
    else
        apt-get -y install ipset
    fi
}

#开始菜单
main(){
root_need
check_release
clear
echo -e "———————————————————————————————————————"
echo -e "${Green}Linux VPS一键屏蔽指定国家所有的IP访问${Font}"
echo -e "${Green}1、封禁ip${Font}"
echo -e "${Green}2、解封iP${Font}"
echo -e "${Green}3、查看封禁列表${Font}"
echo -e "———————————————————————————————————————"
read -p "请输入数字 [1-3]:" num
case "$num" in
    1)
    block_ipset
    ;;
    2)
    unblock_ipset
    ;;
    3)
    block_list
    ;;
    *)
    clear
    echo -e "${Green}请输入正确数字 [1-3]${Font}"
    sleep 2s
    main
    ;;
    esac
}
main

封禁ip时会要求你输入国家代码,代码查看:点击进入。记住所填参数均为小写字母。比如JAPAN (JP),我们就输入jp这个参数。注意:封禁国内时要特别注意,如封禁国内会造成登录服务器失败

Countries and Regions国家或地区国际域名缩写电话代码时差
Angola安哥拉AO244-7
Afghanistan阿富汗AF930
Albania阿尔巴尼亚AL355-7
Algeria阿尔及利亚DZ213-8
Andorra安道尔共和国AD376-8
Anguilla安圭拉岛AI1264-12
Antigua and Barbuda安提瓜和巴布达AG1268-12
Argentina阿根廷AR54-11
Armenia亚美尼亚AM374-6
Ascension阿森松247-8
Australia澳大利亚AU61+2
Austria奥地利AT43-7
Azerbaijan阿塞拜疆AZ994-5
Bahamas巴哈马BS1242-13
Bahrain巴林BH973-5
Bangladesh孟加拉国BD880-2
Barbados巴巴多斯BB1246-12
Belarus白俄罗斯BY375-6
Belgium比利时BE32-7
Belize伯利兹BZ501-14
Benin贝宁BJ229-7
Bermuda Is.百慕大群岛BM1441-12
Bolivia玻利维亚BO591-12
Botswana博茨瓦纳BW267-6
Brazil巴西BR55-11
Brunei文莱BN6730
Bulgaria保加利亚BG359-6
Burkina-faso布基纳法索BF226-8
Burma缅甸MM95-1.3
Burundi布隆迪BI257-6
Cameroon喀麦隆CM237-7
Canada加拿大CA1-13
Cayman Is.开曼群岛1345-13
Central African Republic中非共和国CF236-7
Chad乍得TD235-7
Chile智利CL56-13
China中国CN860
Colombia哥伦比亚CO570
Congo刚果CG242-7
Cook Is.库克群岛CK682-18.3
Costa Rica哥斯达黎加CR506-14
Cuba古巴CU53-13
Cyprus塞浦路斯CY357-6
Czech Republic捷克CZ420-7
Denmark丹麦DK45-7
Djibouti吉布提DJ253-5
Dominica Rep.多米尼加共和国DO1890-13
Ecuador厄瓜多尔EC593-13
Egypt埃及EG20-6
EI Salvador萨尔瓦多SV503-14
Estonia爱沙尼亚EE372-5
Ethiopia埃塞俄比亚ET251-5
Fiji斐济FJ679+4
Finland芬兰FI358-6
France法国FR33-8
French Guiana法属圭亚那GF594-12
Gabon加蓬GA241-7
Gambia冈比亚GM220-8
Georgia格鲁吉亚GE9950
Germany德国DE49-7
Ghana加纳GH233-8
Gibraltar直布罗陀GI350-8
Greece希腊GR30-6
Grenada格林纳达GD1809-14
Guam关岛GU1671+2
Guatemala危地马拉GT502-14
Guinea几内亚GN224-8
Guyana圭亚那GY592-11
Haiti海地HT509-13
Honduras洪都拉斯HN504-14
Hongkong香港HK8520
Hungary匈牙利HU36-7
Iceland冰岛IS354-9
India印度IN91-2.3
Indonesia印度尼西亚ID62-0.3
Iran伊朗IR98-4.3
Iraq伊拉克IQ964-5
Ireland爱尔兰IE353-4.3
Israel以色列IL972-6
Italy意大利IT39-7
Ivory Coast科特迪瓦225-6
Jamaica牙买加JM1876-12
Japan日本JP81+1
Jordan约旦JO962-6
Kampuchea (Cambodia )柬埔寨KH855-1
Kazakstan哈萨克斯坦KZ327-5
Kenya肯尼亚KE254-5
Korea韩国KR82+1
Kuwait科威特KW965-5
Kyrgyzstan吉尔吉斯坦KG331-5
Laos老挝LA856-1
Latvia拉脱维亚LV371-5
Lebanon黎巴嫩LB961-6
Lesotho莱索托LS266-6
Liberia利比里亚LR231-8
Libya利比亚LY218-6
Liechtenstein列支敦士登LI423-7
Lithuania立陶宛LT370-5
Luxembourg卢森堡LU352-7
Macao澳门MO8530
Madagascar马达加斯加MG261-5
Malawi马拉维MW265-6
Malaysia马来西亚MY60-0.5
Maldives马尔代夫MV960-7
Mali马里ML223-8
Malta马耳他MT356-7
Mariana Is马里亚那群岛1670+1
Martinique马提尼克596-12
Mauritius毛里求斯MU230-4
Mexico墨西哥MX52-15
Moldova, Republic of摩尔多瓦MD373-5
Monaco摩纳哥MC377-7
Mongolia蒙古MN9760
Montserrat Is蒙特塞拉特岛MS1664-12
Morocco摩洛哥MA212-6
Mozambique莫桑比克MZ258-6
Namibia纳米比亚NA264-7
Nauru瑙鲁NR674+4
Nepal尼泊尔NP977-2.3
Netheriands Antilles荷属安的列斯599-12
Netherlands荷兰NL31-7
New Zealand新西兰NZ64+4
Nicaragua尼加拉瓜NI505-14
Niger尼日尔NE227-8
Nigeria尼日利亚NG234-7
North Korea朝鲜KP850+1
Norway挪威NO47-7
Oman阿曼OM968-4
Pakistan巴基斯坦PK92-2.3
Panama巴拿马PA507-13
Papua New Cuinea巴布亚新几内亚PG675+2
Paraguay巴拉圭PY595-12
Peru秘鲁PE51-13
Philippines菲律宾PH630
Poland波兰PL48-7
French Polynesia法属玻利尼西亚PF689+3
Portugal葡萄牙PT351-8
Puerto Rico波多黎各PR1787-12
Qatar卡塔尔QA974-5
Reunion留尼旺262-4
Romania罗马尼亚RO40-6
Russia俄罗斯RU7-5
Saint Lueia圣卢西亚LC1758-12
Saint Vincent圣文森特岛VC1784-12
Samoa Eastern东萨摩亚(美)684-19
Samoa Western西萨摩亚685-19
San Marino圣马力诺SM378-7
Sao Tome and Principe圣多美和普林西比ST239-8
Saudi Arabia沙特阿拉伯SA966-5
Senegal塞内加尔SN221-8
Seychelles塞舌尔SC248-4
Sierra Leone塞拉利昂SL232-8
Singapore新加坡SG65+0.3
Slovakia斯洛伐克SK421-7
Slovenia斯洛文尼亚SI386-7
Solomon Is所罗门群岛SB677+3
Somali索马里SO252-5
South Africa南非ZA27-6
Spain西班牙ES34-8
Sri Lanka斯里兰卡LK940
St.Lucia圣卢西亚LC1758-12
St.Vincent圣文森特VC1784-12
Sudan苏丹SD249-6
Suriname苏里南SR597-11.3
Swaziland斯威士兰SZ268-6
Sweden瑞典SE46-7
Switzerland瑞士CH41-7
Syria叙利亚SY963-6
Taiwan台湾省TW8860
Tajikstan塔吉克斯坦TJ992-5
Tanzania坦桑尼亚TZ255-5
Thailand泰国TH66-1
Togo多哥TG228-8
Tonga汤加TO676+4
Trinidad and Tobago特立尼达和多巴哥TT1809-12
Tunisia突尼斯TN216-7
Turkey土耳其TR90-6
Turkmenistan土库曼斯坦TM993-5
Uganda乌干达UG256-5
Ukraine乌克兰UA380-5
United Arab Emirates阿拉伯联合酋长国AE971-4
United Kiongdom英国GB44-8
United States of America美国US1-13
Uruguay乌拉圭UY598-10.3
Uzbekistan乌兹别克斯坦UZ233-5
Venezuela委内瑞拉VE58-12.3
Vietnam越南VN84-1
Yemen也门YE967-5
Yugoslavia南斯拉夫YU381-7
Zimbabwe津巴布韦ZW263-6
Zaire扎伊尔ZR243-7
Zambia赞比亚ZM260-6

总结

一键屏蔽可以有效帮我们暂时防止一些CC攻击等,或者你不想让哪国的人进入博客也可以用,注意屏蔽cn的时候需谨慎,不然你SSH就上不去了。