nginx控制iptables芝麻开门

2022-02-10 作者:

During maintenance of a production server, we use to encounter a problem like this – an internet-access-blocked port, say 3306 (mysql), is about to be open for a little while due to debugging needs, which is not uncommon, right? So how to make this easily operated, mostly secure, and automatically disabled after working – I guess this’s gonna help somehow.

A Linux server with whatever the distribution including iptables (e.g. CentOS, Rocky for now as example), Nginx, fcgiwrap, a simple shell script and a commonly used web browser, let’s say chrome, will be major ingredients on the recipe.

常做运维,总会遇到某些线上服务器,为了便于调试,在符合安全要求的基础上,需要相对便利的对公网短时定向开放某些端口。

昨天想了一招,用nginx操作shell脚本,对特定公网IP开口子,叫一声“芝麻开门”,便捷又安全。举例端口3306(mysql),系统是Rocky Linux 8(原CentOS 8)。

Doors of Durin

Doors of Durin

先查一下现有的防火墙规则,需要的话可以保存一下。换句话说,搞芝麻开门之前,先确定门是隐藏的;也即已经有相应(且持久化)的iptables rule确保到被保护端口的连接是DROP/REJECT状态。

然后就是fcgiwrap的安装,此处就不写nginx安装过程了,默认安装即可。

安装后增加两个systemd服务文件,并测试fcgiwrap服务生效。

【注】那俩服务文件,在Redhat之外的发行版上,fcgiwrap安装包可能自带,请针对所用版本自行检查。

接下来为一个新的nginx server准备个根目录,存放网页和之后控制iptables的脚本。

在nginx上单开一个server,指向fcgiwrap和之前设定的根目录。重启nginx服务前,检查新增conf文件无错误。

然后编写由nginx进行调用的shell脚本,注意脚本返回内容尽量按html的基本规范输出,且脚本需要+x执行权限。

最后一步,给nginx用户增加免密sudo iptables的能力。

此处建议尽量使用visudo而非手改sudo config文件,这样不容易杯具。

搞定,打开浏览器输入URL,尝试开门,显示开门成功,待进门测试。

进门测试,使用nmap,开门前返回filtered(防火墙拦截),开门后显示open,验证成功。

至此问题解决,针对单个公网IP开放的端口,安全风险基本已经很低了。

如果觉得这钥匙不够安全,怕开门URL被猜出/试出,可以优化nginx config文件,加上basic auth,或者走header等其他auth手段,保障钥匙有且仅有自己可用。那部分比较简单,本文不再详述。


如果还想做个定期自动关门

在未开门之前,先对iptables安装持久化所用的包,保存现有防火墙规则,并测试服务生效。

【注】Redhat系列是iptables-services,而Debian/Ubuntu系列,按版本新旧不同,可能是iptables-persistent或者netfilter-persistent,请自行查阅文档。

接下来就简单了,因为开门产生的rules并未持久化落盘,所以要恢复到原有条目,只要重启该服务即可。

可以用 crontab -e 写入计划任务,这里的例子是,每周三晚上23:46自动恢复iptables已保存条目。

测试定时任务执行成功。

 

原创文章,转载请注明: 转载自渔人小径

本文链接地址: nginx控制iptables芝麻开门

打赏 PayPal

文章的脚注信息由WordPress的wp-posturl插件自动生成

打赏 赞(0)
微信
支付宝
微信二维码图片

微信扫描二维码打赏

支付宝二维码图片

支付宝扫描二维码打赏

最近文章

分享

发表评论

电子邮件地址不会被公开。 必填项已用*标注