使用Cloudflare的Apache获取用户的真实IP

编辑Httpd设置,加入:


<IfModule remoteip_module> RemoteIPHeader X-Forwarded-For RemoteIPInternalProxy 127.0.0.1/24 RemoteIPInternalProxy ohter-ip/24 #CloudFlare IP Ranges RemoteIPInternalProxy 103.21.244.0/22 RemoteIPInternalProxy 103.22.200.0/22 RemoteIPInternalProxy 103.31.4.0/22 RemoteIPInternalProxy 104.16.0.0/12 RemoteIPInternalProxy 108.162.192.0/18 RemoteIPInternalProxy 131.0.72.0/22 RemoteIPInternalProxy 141.101.64.0/18 RemoteIPInternalProxy 162.158.0.0/15 RemoteIPInternalProxy 172.64.0.0/13 RemoteIPInternalProxy 173.245.48.0/20 RemoteIPInternalProxy 188.114.96.0/20 RemoteIPInternalProxy 190.93.240.0/20 RemoteIPInternalProxy 197.234.240.0/22 RemoteIPInternalProxy 198.41.128.0/17 </IfModule> <pre>

使用Directadmin的话在Custom HTTPD Configurations里设置。

解决DirectAdmin安装CSF防火墙后发邮件的问题

DirectAdmin,安装某自动发卡程序时发现无法连接Mailgun的SMTP服务器发邮件。发卡程序是用PHPmailer发邮件的,在另外一台DirectAdmin上运行良好。百思不得其解!甚至写了一段PHPMailer的程序对比两台DirectAdmin服务器,结果发现存在问题的服务器是安装了CSF(ConfigServer Security & Firewall)防火墙的。于是将CSF Disabled掉,邮件顺利发出。

最终调整CSF解决:

1)添加TCP_OUT端口,加入应用到的465端口:

2)

将SMTP_BLOCK关掉。

问题解决!

Docker部署haproxy

部署:


docker run -d --name haproxy \ -p 80:80 \ -p 443:443 \ -p 2222:2222 \ -p 9090:9090 \ --restart=always \ -v /home/haproxy:/usr/local/etc/haproxy \ haproxy:alpine

/home/haproxy下的配置文件名必须为:haproxy.cfg

配置参考:


global #daemon log 127.0.0.1 local0 log 127.0.0.1 local1 notice maxconn 4096 defaults mode http maxconn 2000 log global option dontlognull option http-server-close option redispatch retries 3 timeout connect 5s timeout client 50s timeout server 50s listen stats bind *:9090 balance mode http stats enable stats uri /stats stats auth admin:password frontend in_http_80 bind *:80 mode http default_backend backend_http acl is_1 hdr_beg(host) -i example.com use_backend backend_sz if is_1 frontend in_https_443 bind *:443 mode tcp default_backend backend_https frontend in_http_da bind *:2222 mode http default_backend backend_da backend backend_http balance roundrobin option forwardfor http-request set-header X-Forwarded-Port %[dst_port] http-request add-header X-Forwarded-Proto https if { ssl_fc } option httpchk HEAD / HTTP/1.1\r\nHost:localhost server node1 199.99.99.81:80 check backend backend_sz balance roundrobin option forwardfor http-request set-header X-Forwarded-Port %[dst_port] http-request add-header X-Forwarded-Proto https if { ssl_fc } option httpchk HEAD / HTTP/1.1\r\nHost:localhost server node2 199.99.99.82:8888 check backend backend_da mode http server srv1 199.99.99.81:2222 check backend backend_https mode tcp server srv2 199.99.99.81:443 check

此配置用于反代Directadmin,注意,后端要把Haproxy的IP置于白名单,一处是防火墙的白名单,根据防火墙设置;

另外一处是Directadmin的白名单,位于/usr/local/directadmin/data/admin/ip_whitelist

参考:https://help.directadmin.com/item.php?id=306

否则因为恶意扫描,反代的IP会被后端Ban。

如果后端需要获取真实IP,参考这里:

DirectAdmin使用Nginx_Apache模式,并获取Cloudflare后的真实IP

通过以下命令将Directadmin切换成Nginx_Apache模式,Nginx用于反代。


cd /usr/local/directadmin/custombuild ./build update ./build set webserver nginx_apache ./build nginx_apache

如果站点用了cloudflare的CDN或者置于Haproxy之后,会无法获取到用户的真实IP,因此,应修改Nginx配置:


nano /etc/nginx/nginx-includes.conf

set_real_ip_from 103.21.244.0/22; set_real_ip_from 103.22.200.0/22; set_real_ip_from 103.31.4.0/22; set_real_ip_from 104.16.0.0/12; set_real_ip_from 108.162.192.0/18; set_real_ip_from 131.0.72.0/22; set_real_ip_from 141.101.64.0/18; set_real_ip_from 162.158.0.0/15; set_real_ip_from 172.64.0.0/13; set_real_ip_from 173.245.48.0/20; set_real_ip_from 188.114.96.0/20; set_real_ip_from 190.93.240.0/20; set_real_ip_from 197.234.240.0/22; set_real_ip_from 198.41.128.0/17; set_real_ip_from 199.27.128.0/21; set_real_ip_from 2400:cb00::/32; set_real_ip_from 2606:4700::/32; set_real_ip_from 2803:f800::/32; set_real_ip_from 2405:b500::/32; set_real_ip_from 2405:8100::/32; set_real_ip_from 2c0f:f248::/32; set_real_ip_from 2a06:98c0::/29; #这里可以添加Haproxy的IP set_real_ip_from 210.88.88.88; # use any of the following two real_ip_header CF-Connecting-IP; #real_ip_header X-Forwarded-For;

Docker 运行带PHP的Caddy

Caddy是一个使用 Go语言写的 HTTP Server,上手非常简单,并且 Caddy支持 自动签订Let’s Encrypt SSL证书,只需要提供一个邮箱,剩下的他会自己申请、配置和续约 SSL证书!。这里用Docker来运行是因为可以直接运行集成PHP的docker分支,运行一些小的php应用非常方便。


docker run -d \
--name=caddy \
--restart=always \
-e ACME_AGREE=true \
-v /home/caddy/Caddyfile:/etc/Caddyfile \
-v /home/caddy/.caddy:/root/.caddy \
-v /home/caddy/www:/srv \
-p 80:80 -p 443:443 -p 2015:2015 \
abiosoft/caddy:php

Caddyfile 配置文件路径: /home/caddy/Caddyfile;

SSL证书存放路径:/home/caddy/.caddy;

网站程序存放路径/home/caddy/www,映射到Docker里的/srv,可以在此目录下建立子目录,Caddyfile文件里根据不同域名指定不同的子目录,建立多站点。

Caddyfile示例:


example.com {
gzip
root /srv
fastcgi / 127.0.0.1:9000 php # php variant only
on startup php-fpm7 # php variant only
}