frp开启安全地暴露内网服务

frp开启安全地暴露内网服务

 

被访问端配置

[secret_ssh]
type = stcp
sk = *****
local_ip = 127.0.0.1
local_port = 22

 

访客端配置

[secret_ssh_visitor]
type = stcp
role = visitor
server_name = secret_ssh
sk = *****
bind_addr = 127.0.0.1
bind_port = 6000

 

 

解决ssh_exchange_identificationread connection reset by peer

被访问端配置

vi /etc/hosts.allow

添加

sshd: ALL

然后重启

systemctl restart sshd.service

 

访客端如果是win系统,可以安装openssh实现cmd中执行ssh命令

https://www.mls-software.com/opensshd.html

    OpenSSH可以作为客户端和服务端,安装时按需选择即可.

 

 

php中header函数跳转页面的相关用法

header("refresh:0;url=a.php")

refresh:1;

支持设置跳转时间

同时支持跳转前进行echo输出

这样就可以操作在跳转前进行提示

echo "<script>alert('我要跳转了')</script>";

header("refresh:0;url=a.php")

 

间隔刷新也可以使用

header("refresh:1;");

每隔1秒刷新当前页面.

 

 

header('Location: ./a.php');

Location:

立即跳转

不支持跳转前进行echo输出

 

如果不输出内容

以下是相等的

header("refresh:0;url=a.php")

header('Location: ./a.php');

 

特别提示,跳转后面建议添加 一行exit();进行退出代码执行,避免出错.

 

 

当然,也可以通过封闭函数的方式进行跳转的更多玩法.

 

了解更多关于header的用法

 

header('HTTP/1.1 200 OK'); // ok 正常访问
header('HTTP/1.1 404 Not Found'); //通知浏览器 页面不存在
header('HTTP/1.1 301 Moved Permanently'); //设置地址被永久的重定向 301
header('Location: http://www.ithhc.cn/'); //跳转到一个新的地址
header('Refresh: 10; url=http://www.ithhc.cn/'); //延迟转向 也就是隔几秒跳转
header('X-Powered-By: PHP/6.0.0'); //修改 X-Powered-By信息
header('Content-language: en'); //文档语言
header('Content-Length: 1234'); //设置内容长度
header('Last-Modified: '.gmdate('D, d M Y H:i:s', $time).' GMT'); //告诉浏览器最后一次修改时间
header('HTTP/1.1 304 Not Modified'); //告诉浏览器文档内容没有发生改变

###内容类型###
header('Content-Type: text/html; charset=utf-8'); //网页编码
header('Content-Type: text/plain'); //纯文本格式
header('Content-Type: image/jpeg'); //JPG、JPEG
header('Content-Type: application/zip'); // ZIP文件
header('Content-Type: application/pdf'); // PDF文件
header('Content-Type: audio/mpeg'); // 音频文件
header('Content-type: text/css'); //css文件
header('Content-type: text/javascript'); //js文件
header('Content-type: application/json'); //json
header('Content-type: application/pdf'); //pdf
header('Content-type: text/xml'); //xml
header('Content-Type: application/x-shockw**e-flash'); //Flash动画

######

###声明一个下载的文件###
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="ITblog.zip"');
header('Content-Transfer-Encoding: binary');
readfile('test.zip');
######

###对当前文档禁用缓存###
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
######

###显示一个需要验证的登陆对话框###
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Top Secret"');
######

###声明一个需要下载的xls文件###
header('Content-Disposition: attachment; filename=ithhc.xlsx');
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Length: '.filesize('./test.xls'));
header('Content-Transfer-Encoding: binary');
header('Cache-Control: must-revalidate');
header('Pragma: public');
readfile('./test.xls');
######

centos7搭建postfix邮件服务器

 在使用qq等邮件服务器厂商提供的邮件服务后,发现他们的邮件发送数量是有限制的,随着公司的业务的需求下,我们需要搭建一个邮件服务器,邮件服务器可以帮助我们在一些提醒方面和消息推送方面起到帮助。

理论性语句:

1. 邮件系统的简单介绍:

电子邮件系统基于邮件协议来完成电子邮件的传输,常见的邮件协议有下面这些。

  简单邮件传输协议(Simple Mail Transfer Protocol,SMTP):用于发送和中转发出的电子邮件,占用服务器的25/TCP端口。

  邮局协议版本3(Post Office Protocol 3):用于将电子邮件存储到本地主机,占用服务器的110/TCP端口。

  Internet消息访问协议版本4(Internet Message Access Protocol 4):用于在本地主机上访问邮件,占用服务器的143/TCP端口。

一个最基础的电子邮件系统肯定要能提供发件服务和收件服务,为此需要使用基于SMTP协议的Postfix服务程序提供发件服务功能,并使用基于POP3协议的Dovecot服务程序提供收件服务功能。这样一来,用户就可以使用Outlook Express或Foxmail等客户端服务程序正常收发邮件了。

实际操作:

  1. 准备环境 ,开放需要的端口,并卸载sedmail,域名解析配置,修改hostname
  2. 安装并且配置好postfix发件服务
  3. 安装并且配置好dovect收件服务
  4. 测试,检查发送情况。

2. 准备环境:

   首先我们检查我们的服务器能否telnet通我们要发送的一些邮件服务商的端口,比如qq,163,gmail等,如果不通的话需要更换服务器,因为此服务器商将这些给拦截了,

正常的现象是:

 

        我们需要开放我们需要的端口,端口有25(SMTP服务,用于发送邮件),110(pop3服务,用于接收邮件)143(imap服务,用于接收邮件)

如果你只想用pop3服务,那么我们只需要打开110和25端口即可,如果我们使用了ssl的话,

pop3就需要开放我们的465(发件) 995(收件)端口

imap就需要开放我们的465(发件) 993(收件)端口

  2.1 开放端口:

firewall-cmd --add-port=25/tcp --permanent

firewall-cmd –-add-port=110/tcp --permanent

firewall-cmd --reload

  2.2 移除sendmail

rpm -e sendmail 或者 yum remove sendmail

  2.3 域名解析配置

我们需要添加A记录和mx记录。首先添加A记录解析到我们的服务器ip。

   2.4 mx 记录

在需要填入值的地方填入我图片中的对应字符。

  2.5 修改hostname

hostnamectl  set-hostname   mail.域名

  2.6 修改MTA(默认邮件传输代理)

alternatives --config mta

然后直接回车即可。

检查一下是不是已经设置成功了。

alternatives --display mta

第一行可以看到mta的状态。 例如:mat - status is manual.就是ok了。

3. POSTFIX

postfix是提供发件服务的(注意:修改配置文件需备份,以下步骤未包含备份。)

postfix服务程序主配置文件中的重要参数。

参数 作用
myhostname 邮局系统的主机名
mydomain 邮局系统的域名
myorigin 从本机发出邮件的域名名称
inet_interfaces 监听的网卡接口
mydestination 可接收邮件的主机名或域名
mynetworks 设置可转发哪些主机的邮件
relay_domains 设置可转发哪些网域的邮件

  3.1 安装 postfix

在centos7里我们的postfix是系统自带的,但是centos7以前的版本是默认不带的,centos7版本以前是sendmail

如果没有则安装 :

yum install postfix

  3.2 配置:

1
vim /etc/postfix/main.cf

修改内容:

# 75行: 取消注释,设置hostname 
myhostname = mail.abc.com 
# 83行: 取消注释,设置域名 
mydomain = abc.com 
# 99行: 取消注释 
myorigin = $mydomain 
# 116行: 默认是localhost,我们需要修改成all
inet_interfaces = all 
# 119行: 推荐ipv4,如果支持ipv6,则可以为all 
inet_protocols = ipv4 
# 164行: 添加 
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain 
# 264行: 取消注释,指定内网和本地的IP地址范围 
mynetworks = 127.0.0.0/8
# 419行: 取消注释,邮件保存目录
 home_mailbox = Maildir/ 
# 571行: 添加 
smtpd_banner = $myhostname ESMTP 
# 添加到最后 
# 规定邮件最大尺寸为10M 
message_size_limit = 10485760 
# 规定收件箱最大容量为1G 
mailbox_size_limit = 1073741824 
# SMTP认证 
smtpd_sasl_type = dovecot 
smtpd_sasl_path = private/auth 
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous 
smtpd_sasl_local_domain = $myhostname 
smtpd_recipient_restrictions = permit_mynetworks,permit_auth_destination,permit_sasl_authenticated,reject

以上对应的对应的行数位置可能随着版本不同会有差异。具体的一些参数含义在本小节前面有解释

  3.3 开启postfix服务并添加到系统自启。

systemctl  restart  postfix
systemctl  enable  postfix

4. 安装并配置dovecot

       4.1 安装dovecot

yum install dovecot

  4.2 配置dovect

编辑文件dovecot.conf

vim /etc/dovecot/dovecot.conf

更改内容:

# 26行: 如果不使用IPv6,请修改为* 
listen = *
#在主配置文件中的第48行,设置允许登录的网段地址,也就是说我们可以在这里限制只有来自于某个网段的用户才能使用电子邮件系统。如果想允许所有人都能使用,则不用修改本参数
login_trusted_networks = 192.168.10.0/24更改内容

编辑文件10-auth.conf

vim /etc/dovecot/conf.d/10-auth.conf

更改内容:

# 9行: 取消注释并修改 disable_plaintext_auth = no 
# 97行: 添加 auth_mechanisms = plain login

编辑文件10-mail.conf

vim /etc/dovecot/conf.d/10-mail.conf

更改内容:

# 30行: 取消注释并添加 mail_location = maildir:~/Maildir

编辑文件10-master.conf

vim /etc/dovecot/conf.d/10-master.conf

更改内容:

# 88-90行: 取消注释并添加 # Postfix smtp验证 
unix_listener /var/spool/postfix/private/auth { 
mode = 0666 
user = postfix
group = postfix
}

注意:如果我们没有使用ssl的话需要进行下面的操作。使用了则不需要。

编辑文件10-ssl.conf

vim /etc/dovecot/conf.d/10-ssl.conf

更改内容

# 8行: 将ssl的值修改为 ssl = no

启动dovecot并添加到开机自启。

systemctl restart dovecot
systemctl enable dovecot

5. 收发邮件测试

   5.1 创建用户

  邮件的用户是和系统用户一致的,也就是说系统用户可以当做邮件用户。

创建用户并设置密码

useradd admin
passwd admin

   5.2 使用foxmail进行登陆

 

1中我们需要选择我们之前开放端口对应的服务器类型。

2中 我们只需要填入我们的用户名,例如admin,root

3中 我们收件和发件都填入我们的mail.域名。例 mail.abc.com

4 中 我们如果使用了ssl的话就需要勾选,如果没有使用的话就不需要勾选

填入相应信息后我们即可登陆了。然后我们可以进行收发邮件了,我们可以测试给自己的qq发一封邮件.

如果我们查看日志发现 status=bounced ,那么就意味着qq的邮件服务器将我们这个服务器IP设为恶意IP,不接收这个IP发送的邮件。也就意味着如果我们要发邮件到qq邮箱的话,就需要更换服务器ip。

如果状态是上面的话,就意味着可以正常发送,还要注意一点的就是我们邮件服务器的邮件很多时候会被放在垃圾箱里,所以当你发送了邮件你在收件箱没看到,你可以去垃圾箱里面看看有没有。接收方面一般没有什么问题,用qq邮箱发送给自己即可(admin@abc.com

如果你想邮件服务器配置SSL,那么你可以看看centos7邮件服务器SSL配置

 注意事项:

我们邮件服务器在设定mynetworks 这个值的时候,一行不要设置all,因为会有很多服务器会将你的服务器作为中转邮件服务器,最终导致的你的邮件服务器发送的邮件被qq,163,gamil,这些邮件服务商标记为垃圾邮件。

当某天我们检查我们的mail日志(/var/log/maillog)时发现很多邮件发送,而且邮件不是我们自己产生的话,那么我们的邮件服务器是出了问题的

这时我们服务器一定有很多邮件堆积,然后自己邮件会发不出去。

我们需要做的操作:检查

du -sh /var/spool/postfix/*

查看目录下的defer和deferred的目录大小,通过postqueue –p来查看队列的邮件,通过postsuper -d ALL 删除所有的队列邮件。

 最后附上屏蔽刷postfix的 IP脚本

#!/bin/bash

LOGFILE="/var/log/maillog"

#统计maillog中authentication failure的IP个数与IP
grep "authentication failure" $LOGFILE|awk '{print $7}'|grep -E -o "[0-9] .[0-9] .[0-9] .[0-9] "|sort|uniq -c > af_iplist.txt

#取出AF出现大于300次时的IP
awk '$1>300 {print $2}' af_iplist.txt > block_ip_list.txt

#大于300次AF的IP添加到iptables中
cat block_ip_list.txt|while read line
do
/sbin/iptables -nL | grep $line
if [ $? != 0 ]
then
    iptables -I INPUT -s $line -j DROP
fi
done

参考文档:

http://lomu.me/post/linux-email-server

http://lomu.me/post/SPF-DKIM-DMARC-PTR

 

PHP版极简反向访问网站源码

直接上代码

<?php
ignore_user_abort(true);
ob_start();
ob_clean();
$init = init();
function init()
{
  $init = null;
  $init['server'] = 'www.gua64.com';
  $init['method'] = strtolower(@$_SERVER['REQUEST_METHOD']);
  $init['host'] = explode(':', @$_SERVER['HTTP_HOST'])[0];
  $init['url'] = @$_SERVER['REQUEST_URI'];
  return $init; 
}
function getdata()
{
  global $init;
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_URL, 'https://' . $init['server'] . $init['url']);
  curl_setopt($curl, CURLOPT_HEADER, FALSE);
  curl_setopt($curl, CURLOPT_TIMEOUT, 9);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
  curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
  curl_setopt($curl, CURLOPT_ENCODING, '');
  if ($init['method'] == 'post')
  {
    curl_setopt($curl, CURLOPT_POST, TRUE);
    curl_setopt($curl, CURLOPT_POSTFIELDS, @file_get_contents('php://input'));
  }
  $body = curl_exec($curl);
  curl_close($curl);
  return $body; 
}
/*********************
如果环境不支持 CURL 或者抓取失败可以使用 GET_FILE_CONTENTS 方法代替
function getdata()
{
  global $init;
  $content = @file_get_contents('php://input');
  $header = @stream_context_create(['http' => ['method' => strtoupper($init['method']), 'content' => $content]]);
  $body = @file_get_contents('https://' . $init['server'] . $init['url'], false, $header);
  return $body; 
}
*********************/
$htmls = getdata();
$htmls = str_replace($init['server'], $init['host'], $htmls);
if (is_numeric(strpos($init['url'], '.ico'))) header('Content-type: image/x-icon');
else if (is_numeric(strpos($init['url'], '.css'))) header('Content-type: text/css');
else if (is_numeric(strpos($init['url'], '.js'))) header('Content-type: application/x-javascript');
else if (is_numeric(strpos($init['url'], '.jpg'))) header('Content-type: image/jpeg');
else if (is_numeric(strpos($init['url'], '.png'))) header('Content-type: image/png');
echo $htmls;
ob_flush();
flush();
?>

 

 

配套.htaccess文件

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . / [L]
</IfModule>

 

配套nginx伪静态

if (!-f $request_filename){
    set $rule_0 1$rule_0;
}
if ($rule_0 = "1"){
 rewrite ^/ /index.php last;
}

 

web.config

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
      <rewrite>
        <rules>
          <rule name="a" stopProcessing="true">
            <match url="." ignoreCase="false" />
            <conditions>
              <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
            </conditions>
            <action type="Rewrite" url="/" />
          </rule>
        </rules>
      </rewrite>
    </system.webServer>
</configuration>

 

2020.09.11更新

 

另推荐7ghost,有后台的反代php源码

https://github.com/shadoweb/7ghost

已修复大部分问题

 

 

Centos7 systemctl添加service服务参数说明

Centos7可以通过systemctl执行服务命令,同时支持自定义service服务文件来进行一系列的标准执行.

常用命令

systemctl daemon-reload

systemctl enable aria2.service

systemctl disable aria2.service

systemctl stop aria2.service

systemctl start aria2.service

systemctl status aria2.service -l

 

这里aria2.service是aria2的service服务文件

enable 是加入开机服务,开机可以启动

disable 是从开机服务中删除

daemon-reload 为修改service服务文件后,重新加载.

 

service服务文件分为3部分:【Unit】【Service】 【Install】

【Unit】部分主要是对这个服务的说明。

Description 用于描述服务
After 用于描述服务类别
【Service】部分是服务的关键,是服务的一些具体运行参数的设置。

Type=forking 是后台运行的形式
User=users 是设置服务运行的用户
Group=users 是设置服务运行的用户组
PIDFile为存放PID的文件路径
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True 表示给服务分配独立的临时空间
*注意: 【Service】部分的启动,重启,停止命令全部要求使用绝对路径。使用相对路径则会报错的。

【Install】部分是服务安装的相关设置,可设置为多用户的

 

 

参考:

https://www.cnblogs.com/feixiablog/p/10245411.html

php通过header设置cookie的安全

代码如下

 

 

define('COOKIES_PATH', '/');
define('COOKIES_EXPIRES',gmstrftime("%A, %d-%b-%Y %H:%M:%S GMT",time()+9600));

 

header("Set-Cookie:user[userid]=123;path =".COOKIES_PATH.";httpOnly;SameSite=Strict;expires=".COOKIES_EXPIRES.";",false);
header("Set-Cookie:user[username]=123;path =".COOKIES_PATH.";httpOnly;SameSite=Strict;expires=".COOKIES_EXPIRES.";",false);
header("Set-Cookie:user[password]=123;path =".COOKIES_PATH.";httpOnly;SameSite=Strict;expires=".COOKIES_EXPIRES.";",false);

 

 

header("Set-Cookie:admin[username]='';path =".COOKIES_PATH.";expires=".gmdate('D, d M Y H:i:s GMT', time()-1).";",false);
header("Set-Cookie:admin[password]='';path =".COOKIES_PATH.";expires=".gmdate('D, d M Y H:i:s GMT', time()-1).";",false);

 

可以通过设置httpOnly;和SameSite=Strict;对cookie进行禁止JS读取和禁止跨域读取.达到基础性的XSS和CSRF防护.

内网wordpress带端口网址FRP后的问题解决

 

内网搭建了wordpress博客,内网地址是带端口的,通过FRP服务绑定域名

通过域名访问,一直有问题.

通过wordpress的配置来解决本次问题

在文件wp-config.php中添加以下代码

define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST']);
define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST']);