为了解决linux配置Nginx 只能关闭防火墙才能访问的问题

来源:互联网 发布:手机域名交易平台 编辑:程序博客网 时间:2024/06/05 16:11

使用Nginx和iptables做访问权限控制(IP和MAC)

  

之前配置的服务器,相当于对整个内网都是公开的,而且,除了可以通过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访问

那就将原来的配置文件(参考另一篇随笔Ubuntu 14.04下安装Nginx,MediaWiki,NodeBB,Everything,GitLab http://www.linuxidc.com/Linux/2016-05/131137.htm)

server {    listen 80;        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 80;        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  2 15:53:51 2016*filter:INPUT ACCEPT [96:9703]:FORWARD ACCEPT [0:0]:OUTPUT ACCEPT [1531:1424833]-A INPUT -s 192.168.1.2/32 -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 4567 -j REJECT --reject-with icmp-port-unreachable-A INPUT -s 192.168.1.3/32 -m mac --mac-source ab:cd:ef:ab:cd:ef  -p tcp -m tcp --dport 80  -j ACCEPT-A INPUT -p tcp -m tcp --dport 80 -j REJECT --reject-with icmp-port-unreachableCOMMIT# Completed on Mon May  2 15:53:51 2016

前四行是自动是生成的

第五行表示,对于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.0sudo /etc/init.d/networking restart

修改MAC

ifconfig eth0 downifconfig eth0 hw ether xx:xx:xx:xx:xx:xxifconfig eth0 up


CentOS 7.0关闭默认防火墙启用iptables防火墙 http://www.linuxidc.com/Linux/2015-05/117473.htm

iptables使用范例详解 http://www.linuxidc.com/Linux/2014-03/99159.htm

Linux防火墙iptables详细教程 http://www.linuxidc.com/Linux/2013-07/87045.htm

iptables的备份、恢复及防火墙脚本的基本使用 http://www.linuxidc.com/Linux/2013-08/88535.htm

Linux下防火墙iptables用法规则详解 http://www.linuxidc.com/Linux/2012-08/67952.htm

Linux下iptables防火墙设置 http://www.linuxidc.com/Linux/2015-10/123843.htm

 

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-05/131139.htm

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 肛裂大便出鲜血怎么办 拉大便有血怎么办啊 长痔疮拉大便血怎么办 病人卧床太久不解大便怎么办 宝宝拉泡沫便便怎么办 孩子拉肚子怎么办呢有好办法吗 2岁宝宝大便带血怎么办 十个月宝宝肛裂怎么办 大便时拉出血怎么办啊 2岁宝宝大便干燥怎么办 5岁儿童大便干燥怎么办 九个月宝宝平血怎么办 6个月宝宝肛裂怎么办 3岁儿童大便干燥怎么办 外痔疮出血了该怎么办 外痔疮流血了怎么办呢 外痔疮破了出血怎么办 拉稀拉的肛门疼怎么办 大人屁股沟裂了怎么办 肛门痛大便有血怎么办 肛裂出血几天了怎么办 肛裂拉屎出血该怎么办 孕期肛裂出血该怎么办 老人大便拉不出来怎么办 拉屎拉的屁眼疼怎么办 拉屎堵在肛门口怎么办 上火拉大便有血怎么办 7岁儿童大便带血怎么办 阴炎用药后出血怎么办 孕晚期大便拉不出来怎么办 想拉屎拉不出来怎么办 4岁幼儿大便干燥怎么办 2岁幼儿大便干燥怎么办 1岁幼儿大便干燥怎么办 5岁幼儿大便干燥怎么办 4岁儿童大便干燥怎么办 狗吃别的狗的屎怎么办 狗狗黄疸怎么办最有效 拉屎出血但不疼怎么办 没拉出时就出血怎么办 拉不出大便怎么办肛门像被堵住