如何允许SSH/FTP访问基于国家使用GeoIP

GeoIP的数据库具有IP地址对应的地理位置的记录。使用这个数据库,我们可以使用Linux命令行搜索任意IP属于哪个国家。本文将帮助你基于国家用户IP 允许SSH或FTP(vsftpd)的访问。下面的例子使用TCP包,以确保您的服务。 国家的访问

安装GeoIP和GeoIP数据库

首先在Linux或其它数据库操作系统中安装GeoIP的二进制文件。在CentOS和RedHat用户的GeoIP二进制和数据库封装在单个封包中。
在CentOS和RedHat中安装:
# yum install GeoIP
在Ubuntu和Debian中安装:
$ sudo apt-get install geoip-bin geoip-database

创建SSH/FTP脚本过滤器

现在创建一个shell脚本,检查所有传入连接的IP地址,并使用GeoIP的数据库和代码在 ALLOW_COUNTRIES变量定义的脚本中只允许的国家。
# vim /usr/local/bin/ipfilter.sh
#!/bin/bash
# License: WTFPL

# UPPERCASE space-separated country codes to ACCEPT
ALLOW_COUNTRIES="IN US"
LOGDENY_FACILITY="authpriv.notice"

if [ $# -ne 1 ]; then
  echo "Usage:  `basename $0` " 1>&2
  exit 0 # return true in case of config issue
fi

if [[ "`echo $1 | grep ':'`" != "" ]] ; then
  COUNTRY=`/usr/bin/geoiplookup6 "$1" | awk -F ": " '{ print $2 }' | awk -F "," '{ print $1 }' | head -n 1`
else
  COUNTRY=`/usr/bin/geoiplookup "$1" | awk -F ": " '{ print $2 }' | awk -F "," '{ print $1 }' | head -n 1`
fi
[[ $COUNTRY = "IP Address not found" || $ALLOW_COUNTRIES =~ $COUNTRY ]] && RESPONSE="ALLOW" || RESPONSE="DENY"

if [[ "$RESPONSE" == "ALLOW" ]] ; then
  logger -p $LOGDENY_FACILITY "$RESPONSE sshd connection from $1 ($COUNTRY)"
  exit 0
else
  logger -p $LOGDENY_FACILITY "$RESPONSE sshd connection from $1 ($COUNTRY)"
  exit 1
fi
脚本源代码:https://gist.github.com/jokey2k/a74f56955124880749e7 将这个脚本增加可执行权限
# chmod +x /usr/local/bin/ipfilter.sh

限制SSH / FTP连接

现在使用TCP封装SSH和FTP的申请限制。首先,我们需要通过在/etc/hosts.deny中添加以下行来拒绝所有。
sshd: ALL
vsftpd: ALL
现在编辑/etc/hosts.allow,只允许那些在你ip筛选器脚本允许的IP。
sshd: ALL: spawn /usr/local/bin/ipfilter.sh %a
vsftp: ALL: spawn /usr/local/bin/ipfilter.sh %a
上述FTP限制仅供vsftpd使用。另外,还要确保您已在vsftpd的配置中启用(tcp_wrappers=YES)。您还可以创建支持TCP封包任何其他服务类似的规则。

测试

最后,从不同的两个测试地点使用SSH或FTP登录服务器并分析访问日志文件。下面是ipfilter.sh创建的一些演示日志。
Feb 27 13:03:29 youcl root: DENY sshd connection from 212.191.246.202 (PL)
Feb 27 13:34:28 youcl root: DENY sshd connection from 212.181.246.202 (SE)
Feb 27 13:34:36 youcl root: DENY sshd connection from 211.181.246.203 (KR)
Feb 27 13:35:00 youcl root: DENY sshd connection from 221.191.146.204 (JP)
Feb 27 15:11:04 youcl root: ALLOW sshd connection from 49.15.212.12 (IN)
Feb 27 15:11:09 youcl root: ALLOW sshd connection from 149.15.212.12 (US)
Feb 27 15:11:22 youcl root: ALLOW sshd connection from 49.15.156.123 (IN)
Feb 27 15:11:32 youcl root: ALLOW sshd connection from 231.15.156.123 (IP Address not found)
Feb 27 15:14:04 youcl root: DENY sshd connection from 111.15.15.123 (CN)
Feb 27 15:14:56 youcl root: ALLOW sshd connection from 49.15.110.123 (IN)
在日志中,你可以说所有IPS属于 US(美国)和 IN(印度)国家是允许的。此外,如果任何IP不在GeoIP的数据库中将被默认允许。匹配到的其他国家IPS和其余部分都被拒绝。
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏