前言
在前面曾提到一些方法确保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、主服务等不会部署到同一台机器,但对于如上问题还是有所困惑,如有大佬知道的,还望指教!