前言
在前面曾提到一些方法確保SpringCloud中服務接口先通過網關轉發,再到達我們的主服務,避免請求越過網關,直接訪問我們的主服務。
但除了在轉發層面添加header的解決方式之外,我們大可在服務器層面做手腳,開放必要的端口即可,從源頭上斷絕了對服務接口的直接訪問。
正文
首先有如下架構:
Consul於服務器192.168.1.102;
Gateway於服務器192.168.1.103;
Auth(即我們的主服務)於服務器192.168.1.104;
在Gateway的application.yml配置文件中,有:
server:
port: 8750
spring:
cloud:
consul:
host: 192.168.1.102
port: 8500
discovery:
service-name: hpsyche-gateway-server
prefer-ip-address: true
gatway:
- id: hpsyche-auth-server
uri: lb://hpsyche-auth-server
order: 8000
predicates:
- Path=/api/auth/**
filters:
- StripPrefix=2
# gateway路由配置等
......
在Auth中同樣有如下,application.yml
server:
port: 8762
spring:
cloud:
consul:
host: 192.168.1.102
port: 8500
discovery:
service-name: hpsyche_auth_server
prefer-ip-address: true
若此時啓動consul+gateway+auth,可以通過http://192.168.1.103:8750/api/auth/xxx訪問auth下的接口,此方式是通過網關的合理轉發實現,但同樣若訪問http://192.168.1.104:8762/xxx,發現也可直接訪問auth下的接口(不合理),所以我需要對auth服務器的端口加以限制。
解決方式
由於項目並沒有掛在阿里雲或其他雲服務器上(沒法直接通過安全組進行設置),所以手動敲起iptables命令!
在104服務器下,先禁止8762端口的訪問:
iptables -I INPUT -p tcp --dport 8762 -j DROP
再設置指定可以訪問的ip,對consul和gateway可見,即:
iptables -I INPUT -p tcp -s 192.168.1.102 --dport 8762 -j ACCEPT
iptables -I INPUT -p tcp -s 192.168.1.103 --dport 8762 -j ACCEPT
再通過如下命令
iptables -L -n
就可以查看是否成功添加端口規則啦!
當然如果你操作有誤,想要刪除端口規則的話,可以通過如下命令:
首先查看命令num號:
iptables -L -n --line-numbers
在每個規則前都會有個數字,再通過如下命令即可刪除:
iptables -D INPUT #{num}
疑問
在實驗中,我一開始嘗試用將consul、gateway、auth三個服務都在同一臺機器上192.168.1.102跑,通過iptables --sport
來設置給auth服務添加如下規則:
iptables -I INPUT -p tcp --dport 8762 -j DROP
iptables -I INPUT -p tcp -s 192.168.1.102 --sport 8500 --dport 8762 -j ACCEPT
iptables -I INPUT -p tcp -s 192.168.1.102 --sport 8750 --dport 8762 -j ACCEPT
本以爲可以實現,但發現配置瞭如上策略後,consul無法監控到auth服務,現在還暫不知什麼原因(似乎不能指定某一個端口)。
雖說gateway、consul、主服務等不會部署到同一臺機器,但對於如上問題還是有所困惑,如有大佬知道的,還望指教!