禁止IP直接访问网站(含docker)

[MD]

引言

为了防范真实的IP地址暴露带来的危险,我们通常有以下做法:

  • WAF
  • 本机防火墙
  • CDN

万一IP真的暴露了呢?

使用 Firewalld 保护 Docker 端口

在docker容器中,我们采用反向代理,达到在浏览器中输入网址可以正常访问,输入IP地址(或IP+端口号)无法访问的目的。

1. 准备

清除所有 iptables 配置并重启 Docker。否则在启动 Nginx Docker 时可能会看到 failed: iptables: No chain/target/match by that name 错误

iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
systemctl restart docker

设置 SELINUX 权限

setenforce Permissive

永久设置 SELINUX 权限

修改 /etc/selinux/config 文件,设置 SELINUX=permissive,使其永久生效(需要重启)

2. 配置 Firewalld

停止 Docker

systemctl stop docker

在 firewalld 中重建 DOCKER-USER iptables chain(请忽略任何警告)

firewall-cmd --permanent --direct --remove-chain ipv4 filter DOCKER-USER
firewall-cmd --permanent --direct --remove-rules ipv4 filter DOCKER-USER
firewall-cmd --permanent --direct --add-chain ipv4 filter DOCKER-USER

添加 iptables 规则到 DOCKER-USER chain

firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 1 \
  -m conntrack \
  --ctstate RELATED,ESTABLISHED -j ACCEPT \
  -m comment --comment 'Allow containers to connect to the outside world'

firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 1 \
  -j RETURN \
  -s 172.17.0.0/16 \
  -m comment --comment 'allow internal docker communication'

提示: 172.17.0.0/16 是 Docker 的默认子网地址, 也可以改为你实际的 Docker 子网地址

为机器 192.168.51.245(公网IP) 配置允许访问Docker的端口(本例为nginx的80、443),优先级为1(您可以在以后添加更多优先级为 0 的规则。请参见下文)

firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 1 \
  -o docker0 \
  -p tcp -m multiport \
  --dports 80,443 -s 192.168.51.245/32 -j ACCEPT \
  -m comment \
  --comment 'Allow IP 192.168.51.245 to access http and https docker ports'

提示:这里的端口是指的 Docker 的内部端口 80,443,而不是映射的外部端口 8080,8443

阻止所有其他IP。 此规则的优先级最低,您可以稍后在此规则之前添加规则

firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 10 \
  -j REJECT -m comment --comment 'reject all other traffic to DOCKER-USER'

激活规则

firewall-cmd --reload

启动 Docker

systemctl start docker

配置Nginx

http{}中加入

server {
    listen 80 default;
    listen 443 default_server;    #使用https/443时启用
    ssl_certificate    /www/cert/certificate.pem; #任意证书位置
    ssl_certificate_key    /www/cert/privatekey.pem; #任意的私钥位置
    server_name _;
    return 444;
}

原文链接:
https://zhuanlan.zhihu.com/p/371683318

arm宝塔面板安装Nginx防火墙后导致Nginx报错

本文最后更新于(2023-11-12 13:12:19),链接可能失效,内容可能难以复现。请注意甄别。
[MD]

错误场景

在甲骨文VPS(Oracle Cloud)中的arm服务器,安装宝塔面板的Nginx防火墙,会导致之前安装的nginx重启报错unknown directive "lua_shared_dict"

原因分析

这个功能应该是和面板上面的编译安装中出现的自定义模块有关,但是并不妨碍我们使用这个功能来实现自动编译和加载 LuaJIT。

解决方法

1.在 /www/server/panel/install 分别创建名字为nginx_prepare.shnginx_configure.pl的文件,然后将两个文件的权限设置为600并且将所有者设置为root

nginx_prepare.sh 的内容

#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
  
wget -c -O LuaJIT-2.1.zip https://github.com/LuaJIT/LuaJIT/archive/refs/heads/v2.1.zip -T 10
unzip LuaJIT-2.1.zip
if [ -e LuaJIT-2.1 ]; then
    cd LuaJIT-2.1
    make linux
    make install
    export LUAJIT_LIB=/usr/local/lib
    export LUAJIT_INC=/usr/local/include/luajit-2.1/
    ln -sf /usr/local/lib/libluajit-5.1.so.2 /usr/local/lib64/libluajit-5.1.so.2
    if [ `grep -c /usr/local/lib /etc/ld.so.conf` -eq 0 ]; then
        echo "/usr/local/lib" >> /etc/ld.so.conf
    fi
    ldconfig
    cd ..
fi
rm -rf LuaJIT-2.1*

提醒:直接复制粘贴可能存在回车符,如果遇到编译失败请使用sed -i 's/\r//g' /www/server/panel/install/nginx_prepare.sh删除回车符。

nginx_configure.pl 的内容

--add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module

这里的LuaJIT源码来自GitHub
关于缺失的jemalloc,原作者经过测试需要 5.1.0 以上的版本才可以让Nginx 1.20.x正常编译,加载 jemalloc 之后单个 Nginx 的进程内存占用高达 2G(虽然这台 ARM 有 32G 的内存),所以放弃这个模块,如果你需要用到,就将下面代码追加到nginx_prepare.sh文件中。

if [ ! -f '/usr/local/lib/libjemalloc.so' ]; then
    wget -O jemalloc-5.2.1.tar.bz2 ${download_Url}/src/jemalloc-5.2.1.tar.bz2
    tar -xvf jemalloc-5.2.1.tar.bz2
    cd jemalloc-5.2.1
    ./configure
    make && make install
    ldconfig
    cd ..
    rm -rf jemalloc*
fi

同时在nginx_configure.pl追加一个空格后追加--with-ld-opt=-ljemalloc

2.最后在面板升级一下 Nginx,或者终端执行下面命令重新编译 Nginx,之后就可以愉快使用 LuaJIT 了。

cd /www/server/panel/install && bash install_soft.sh 0 update nginx 1.22

运行之前你需要稍作修改,将 1.22 修改成你需要升级或安装的版本,如果你需要升级则先看下自己的 Nginx 是什么版本,比如 1.18.1 则修改为 1.18,脚本运行完成后 Nginx 的版本也会升级到 1.18 的最新版本。另外,如果你的服务器未安装 Nginx,则需要将update修改为install

原作者使用的是Ubuntu,本人使用的是Oracle Linux。

参考链接:

让宝塔面板的 Nginx 在 ARM 下也能支持 LuaJIT

nginx配置ssl证书

本文最后更新于(2023-4-3 09:46:28),链接可能失效,内容可能难以复现。请注意甄别。
server {
# 证书
listen 443 ssl ;
server_name <domain1> <domain2>;
ssl_certificate /etc/nginx/crt/<webname>.pem;
ssl_certificate_key /etc/nginx/crt/<webname>.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;

# HTTPS跳转
server {
listen 80 ;
server_name <domain1> <domain2>;
return 301 https://$server_name$request_uri;
}