之前配置的服务器,相当于对整个内网都是公开的

而且,除了可以通过80端口的nginx来间接访问各项服务,也可以绕过nginx,直接ip地址加端口访问对应服务

这是不对的啊,所以我们要做一些限制

因为只是对特定的人提供服务,而且局域网IP和MAC都是固定的,所以可以直接用白名单,其他的全部拒绝

/**************************************使用nginx做访问权限控制*********************************/

先在nginx做设置

在/etc/nginx/conf.d 下面新建ip.conf

在这个目录下的.conf都会被包含进nginx.conf中

假设我们只允许192.168.1.2   192.168.1.3 访问

那内容就是

allow 192.168.1.2;
allow 192.168.1.3;
deny all;

这样就搞定了

当然nginx还可以做得更好一些,分目录进行控制

ip.conf相当于第一层白名单,也就是全局白名单,在对应的反向代理的conf文件中,同样可以加上白名单

比如对于开放在4567端口的论坛,只想让192.168.1.2访问

那就将原来的配置文件(参考另一篇随笔ubuntu14.04下安装ngnix,mediawiki,nodebb,everything,gitlab

server {
listen ; server_name www.forum.zqb.local forum.zqb.local;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:4567/;
proxy_redirect off; # Socket.IO Support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}

改成

server {
listen ; server_name www.forum.zqb.local forum.zqb.local;
location / {
allow 192.168.1.2; #允许访问
deny all; proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:4567/;
proxy_redirect off; # Socket.IO Support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}

这样就可以对每个服务分别控制访问权限,而不是一刀切了

注意修改完配置文件后,要重新启动服务

service nginx restart

当然,也可以配置整个网段,也可以配置黑名单,具体自行google或百度语法

/**************************************使用iptables做访问权限控制*********************************/

但是只对IP做限制,还是有点不够,我们还想做的更好一些,比如,针对MAC地址也做限制

这个时候nginx就不行了,要iptables

配置可以一条条写命令,也可以编辑文件后批量写入

先把当前配置写入文件 /etc/iptables.test.rules 中

iptables-save > /etc/iptables.test.rules

然后修改文件  /etc/iptables.test.rules

修改后写回去

iptables-restore < /etc/iptables.test.rules

就生效了

假设服务器自己的IP是192.168.1.2,mac地址为aa:bb:cc:dd:ee:ff

想达到以下效果

服务器自己可以随意访问自己的所有端口

其他的机器不允许访问4567端口(也就是不能直接访问开放在4567端口的论坛,必须通过80端口的nginx去间接访问)

可以这么配置

# Generated by iptables-save v1.4.21 on Mon May   ::
*filter
:INPUT ACCEPT [:]
:FORWARD ACCEPT [:]
:OUTPUT ACCEPT [:]
-A INPUT -s 192.168.1.2/ -m mac --mac-source aa:bb:cc:dd:ee:ff -p tcp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport -j REJECT --reject-with icmp-port-unreachable
-A INPUT -s 192.168.1.3/ -m mac --mac-source ab:cd:ef:ab:cd:ef -p tcp -m tcp --dport -j ACCEPT
-A INPUT -p tcp -m tcp --dport -j REJECT --reject-with icmp-port-unreachable
COMMIT
# Completed on Mon May ::

前四行是自动是生成的

第五行表示,对于IP地址为192.168.1.2,mac地址为aa:bb:cc:dd:ee:ff,直接ACCEPT

第六行表示,允许环回通信

第七行表示,禁止访问4567端口

第八行表示,对于IP地址为192.168.1.3,mac地址为ab:cd:ef:ab:cd:ef,允许访问80端口

第九行表示,禁止访问80端口

这个规则是按顺序匹配的,匹配到任意一条就结束,否则继续往下匹配

所以对于服务器本身,第五行就匹配了,后面的规则不管,没有任何限制

对于其他机器,第五行匹配不到,第七行就禁止了直接访问4567端口

对于 192.168.1.3,匹配到第八行,所以可以访问80端口

其他机器匹配不到,执行到第九行,就禁止了80端口的访问

上面这种配置,只是禁止了几个端口,其他的ssh之类的并没有做限制

有点端口黑名单的感觉,更严格的话也可以做成端口白名单吧,只开放23,80等几个端口,其他的全禁止

哦,对了,还要弄成开机自动加载才行

iptables-save > /etc/iptables.up.rules

修改/etc/network/interfaces

在最后加上一行

pre-up iptables-restore < /etc/iptables.up.rules

/***********************************************************************/

综上,先通过iptables,让白名单(IP和MAC必须同时匹配)的机器只能访问80端口,也就是必须通过nginx而不能直接去访问服务

然后nginx再针对服务做进一步的限制

当然每个服务本身也是需要账号密码才能使用的,比如在论坛后台也可以设置注册权限,不过那个就是服务本身提供的了

另,这么做的话会带来一些附加影响,比如gitlab给出的会是

http://192.168.1.2:8081/zhuangqiubin/Books_ceshi.git

但你是无法直接访问8081的,所以要改成

http://www.gitlab.zqb.local/zhuangqiubin/Books_ceshi.git

/***********************************************************************/

不过,其实IP和MAC地址都是可以修改的==

修改IP

sudo ifconfig eth0 192.168.2.1 netmask 255.255.255.0
sudo /etc/init.d/networking restart

修改MAC

ifconfig eth0 down
ifconfig eth0 hw ether xx:xx:xx:xx:xx:xx
ifconfig eth0 up

本文链接 http://www.cnblogs.com/zqb-all/p/5452668.html

使用nginx和iptables做访问权限控制(IP和MAC)的更多相关文章

  1. 论Java访问权限控制的重要性

    人在什么面前最容易失去抵抗力? 美色,算是一个,比如说西施的贡献薄就是忍辱负重.以身报国.助越灭吴:金钱,算是另外一个,我们古人常说“钱乃身外之物,生不带来死不带去”,但我们又都知道“有钱能使鬼推磨” ...

  2. 初读"Thinking in Java"读书笔记之第六章 --- 访问权限控制

    包:库单元 包内包含有一组类,他们在单一的名字空间下被组织在一起. 通过import ***.***.*可以将某个包下的所有类导入到当前文件中. 每个Java源文件最多只能有一个public类,且名称 ...

  3. Java访问权限控制

    访问权限控制           java提供了访问权限修饰词,以供类库开发人员向客户端程序员指明哪些是可用的,哪些是不可用的.访问权限控制的等级,从最大权限到最小权限依次是:public.prote ...

  4. Java基础—访问权限控制

    Java中访问权限控制的作用: 为了使用户不要触碰那些他们不该触碰的部分,这些部分对于类内部的操作时必要的,但是它并不属于客户端程序员所需接口的一部分. 为了让类库设计者可用更改类的内部工作方式,而不 ...

  5. Java之封装与访问权限控制(一)

    目录 Java之封装与访问权限控制(一) 封装的概念 访问控制符 属性私有化 Java之封装与访问权限控制(一) 对于封装的概念,我总觉得自己还是挺了解的,但是真要我说,还真说不出个啥来.我只能默默地 ...

  6. Java编程思想之六访问权限控制

    访问控制(或隐藏具体实现)与"最初的实现并不恰当"有关. 访问权限控制的等级,从最大权限到最小权限依次为:public,protected,包访问权限(没有关键字)和private ...

  7. MongoDB 安全和访问权限控制

    MongoDB的访问控制能够有效保证数据库的安全,访问控制是指绑定Application监听的IP地址,设置监听端口,使用账户和密码登录 一,访问控制的参数 1,绑定IP地址 mongod 参数:-- ...

  8. (转)浅析Java中的访问权限控制

    原文地址: http://www.cnblogs.com/dolphin0520/p/3734915.html 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下 ...

  9. [THINKING IN JAVA]访问权限控制

    6 访问权限控制 6.1 包:库单元 package.import.import *.import static: 修改classpath环境变量可以将自己写的类库添加至环境变量并在任何java程序中 ...

随机推荐

  1. PHP如何获取二个日期的相差天数?

    我们经常需要获取二个日期之间相差的天数,方便客户知道距离某个时间段是相差了多少天数,这样的显示结果现在是越来越流行的了.不再像以前那样呆板的显示日期的了.我们这里就分享了二种方法可以获取到二个日期之间 ...

  2. ThinkPHP v3.2.3 数据库读写分离,开启事务时报错:There is no active transaction

    如题:ThinkPHP v3.2.3 数据库读写分离,开启事务时报错: ERR: There is no active transaction 刚开始以为是数据表引擎不对造成的,因为 有几张表的引擎是 ...

  3. Thrift的TCompactProtocol紧凑型二进制协议分析

    Thrift的紧凑型传输协议分析: 用一张图说明一下Thrift的TCompactProtocol中各个数据类型是怎么表示的. 报文格式编码: bool类型: 一个字节. 如果bool型的字段是结构体 ...

  4. java基础知识(一)数据类型(下)

    前面介绍了java的8种基本数据类型,包括boolean, byte, char, short,  int, long, float, double.同时,java也提供了这些类型的封装类,分别为Bo ...

  5. C和指针 第三章 链接属性 extern、internal、none

    三种链接属性 组成一个程序有多个源文件,如果相同的标识符出现在多个源文件中,那么标识符的链接属性决定如何处理在不同文件中出现的标识符. 链接属性有三种: external:外部 多个源文件中的相同标识 ...

  6. difference bewteen *args and **args in python?

    It's also worth noting that you can use * and ** when calling functions as well. This is a shortcut ...

  7. JavaScript之bind,call,apply

    参考: http://rangercyh.blog.51cto.com/1444712/1615809 function foo(a,b) { this.x = this.x + a + b; } / ...

  8. 我常用的grep命令

    查找包含某个字符的行并保存在文件 grep -rn 'test' ./*.sql >test.sql -r 是递归查找 -n 是显示行号 在当前目录下的.sql结尾的文件中查找包含 test 字 ...

  9. windwos server 路由备份和恢复 路由表备份和恢复

    netsh dump>:c\name.dmp netsh exec >:c\name.dmp

  10. 移动端web开发技巧

    META相关 1. 添加到主屏后的标题(IOS)