為了解決linux配置Nginx 只能關閉防火牆才能訪問的問題


使用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-unreachable COMMIT # 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.0 sudo /etc/init.d/networking restart

修改MAC

ifconfig eth0 down ifconfig eth0 hw ether xx:xx:xx:xx:xx:xx ifconfig 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM