搭建FRP内网穿透服务

随着 全球IPV4 地址的枯竭,IPV6在中国又推广应用得很慢。现在的运营商都限制家庭用户通过PPPOE拨号获取公网IP了,我家的宽带也很杯具的给分配了内网的拨号IP

但因为我家有NAS,上面有跑ARIA2与TRANSMISION 和监控的服务,以前一直用路由的端口转发来访问内网数据 ,自从被强奸成内网IP后不能实现了。无奈之下只能通过搭建内网穿透应用来实现访问内网主机的服务 。

内网穿透作用

大家都知道如果家里有nas 或监控主机而且需要从外网访问到家里的各种服务的话,以前我们都是直接通过路由器的端口映射或dmz主机设置来实现应用。
但上面说的端口映射与dmz要求路由拨号时有公网ip,如果获取不到公网ip的话只能通过内网穿透来实现了。

内网穿透的原理其实就是 当用户要访问内网服务时 ,服务端与客户端间建立一条通讯隧道供客户访问

目前比较流行的内网穿透有:
1. 商业化的 花生壳内网穿透
2. 老外开源的 ngrok
3. 新面世不久的 frp

这里我们只讲frp ,因为花生壳流量有限制要钱, 而ngrok 最后一个开源版本有内存泄露问题。新出的frp 功能比较单纯,内存也控制得很好,最主要是容易搭建配置,完全不用再次编译。

什么是FRP

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。

作用

  • 利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务。
  • 对于 http, https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。
  • 利用处于内网或防火墙后的机器,对外网环境提供 tcp 和 udp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机。

架构

功能解读

如何查看公网内网

先登陆你自己的路由器,查看PPPOE 获取 的IP地址。然后再登陆任何一个可以查出口IP的网站,例如 ip138.com ,对比两个IP。如果对不上的话,恭喜你,也给强奸成内网IP了。

利用FRP 实现的功能

假设我们要把家中内网的一个网站端口80与ssh的端口22暴露出去让外网可以访问。
这样我们就可以在外网用 http://web.house.frp.com的形式直接访问内网网站,而用 web.house.frp.com:22 的形式用于访问内网的ssh服务。

配置要求

  1. 一台服务器,linux或windows皆可(或者网上免费的frp 服务)
  2. 一个可管理的域名(因为得做域名泛解析)
  3. 任意操作系统的一台客户机(frp 是一款跨平台的穿透服务)

安装与配置

frp程序下载网址:

https://github.com/fatedier/frp/releases/

官方文档

https://github.com/fatedier/frp/

域名配置

假设我们的域名是frps.com ,我们需要做两条DNS 解析记录

house.frp.com 解析到 Frp的服务端IP地址
*.house.frp.com 泛解析到Frp的服务端IP地址 #泛解析是为了后面客户端请求开启web服务穿透时用的三级域名

Frp服务端安装

我们以centos 为例来安装frp的服务端来演示一下如何安装

如果要复制本站的代码直接粘贴使用的话请记得去掉 #及后面的注释,不然有可能会发生错误

wget https://github.com/fatedier/frp/releases/download/v0.12.0/frp_0.12.0_linux_amd64.tar.gz
tar zxvf frp_0.12.0_linux_amd64.tar.gz
cd frp_0.12.0_linux_amd64

以下代码分别是下载FRP程序并解压后进入目录
FRP程序包含以下几个文件

1. frpc 客户端程序
2. frpc.ini 客户端配置文件
3. frpc_full.ini 客户端所有配置示例
4. frps 服务端程序
5. frps.ini 服务端配置文件
6. frps_full.ini 服务端所有配置示例

最简易功能服务端配置请编辑

编辑frps.ini

vi frps.ini

编辑内容如下

[common]
bind_addr = 0.0.0.0 #绑定地址
bind_port = 7000 #设置frp服务端的通讯端口
# 内网http服务穿透端口
vhost_http_port = 80
# frp服务的网页监控面板端口,设置后可通过 http://ip地址:7500 查看相应客户端frp服务的连接状态与流量统计
dashboard_port = 7500
# 网页监控面板的用户名与密码,默认都为admin
dashboard_user = admin
dashboard_pwd = admin
# 特权模式的密码:用以客户端与服务端连接时的验证密码
privilege_token = 12345678
# 如果没有配置子域名的话,则可以在客户端配置里面指定泛解析的域名
# 设置用于解析的子域名
subdomain_host = house.frp.com

保存配置后启动服务端

chmod +x frps 
./frps -c frps.ini

启动显示以下服务信息就证明服务端成功运行了

Frp客户端安装

客户端我们照旧用linux的系统来做示例,windows 系统的操作方法一样的配置文件,只不过下载windows专用的程序就行。
比方我想把frp的客户端安装在我的x64软路由器上,系统是openwrt的。(其它的操作系统请选择相应的程序包)

wget https://github.com/fatedier/frp/releases/download/v0.12.0/frp_0.12.0_linux_amd64.tar.gz
tar zxvf frp_0.12.0_linux_amd64.tar.gz
cd frp_0.12.0_linux_amd64

解压缩出来的文件与服务端的一样,只不过这里我们只需要配置客户端的配置文件

vi frpc.ini

输入以下内容

[common]
server_addr = frp服务端ip地址
server_port = 7000
#连接服务端的验证密码,必须与服务端配置的一样
privilege_token = 12345678
# ssh  的端口穿透配置
[ssh]
# 可选 tcp | udp | http | https, 默认是tcp 
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 2202 # 服务端用来中转的端口
# 内网网站暴露配置
[web01]
type = http
local_ip = 192.168.1.22 #要穿透的主机ip
local_port = 80 #暴露的端口
subdomain = web #配置三级域名, 后面可以通过web.house.frp.com 访问

保存配置后运行客户端

chmod +x frpc
./frpc -c frpc.ini

客户端启动后会显示如下信息

接收到客户端请求的服务端则显示

使用内网服务

现在开始就可以在外网使用 http://web.house.frp.com 访问内网的网站
连接frp服务端的2202 端口以访问内网的SSH服务了

查看FRP服务情况

直接浏览器输入 http://你的frp服务端ip地址:7500/
输入验证的用户与密码后可查看frp客户端与服务端连接的类型与统计流量

其他功能

frp 做为一个新的内网穿透服务功能其实不止用来暴露网站或端口,它还可用做http代理,未来还可能会开发udp打洞功能。其它详细的功能配置请查看作者的github 主页。

转载请注明出处

LNMP1.3环境下ALPN的支持方法

编译时指定上 –with-openssl=openssl源码目录全路径
lnmp 1.3可以直接修改lnmp.conf 里的Nginx_Modules_Options=” ,引号中加上–with-openssl=openssl源码目录全路径 ,然后重新升级一下nginx就行

cd /root/
wget https://www.openssl.org/source/openssl-1.0.2i.tar.gz
tar zxf openssl-1.0.2i.tar.gz
修改lnmp.conf 里的Nginx_Modules_Options=” 为 Nginx_Modules_Options=’–with-openssl=/root/openssl-1.0.2i’
./upgrade.sh nginx

Google BBR 优化算法,实现TCP加速,一键安装BBR

2016年12月25日,秋水逸冰做的一键安装脚本
系统支持:CentOS 6+,Debian 7+,Ubuntu 12+
虚拟技术:OpenVZ 以外的(KVM、Xen、VMware等)
内存要求:≥128M
日期  :2016 年 12 月 24 日

关于本脚本
1、本脚本已在 Vultr 上的 VPS 全部测试通过。
2、当脚本检测到 VPS 的虚拟方式为 OpenVZ 时,会提示错误,并自动退出安装。
3、某些服务商(如 DigitalOcean)可能需要首先将 VPS 配置为可自定义内核,然后 grub2 的配置才会生效。
4、脚本运行完重启发现开不了机的,打开 VPS 后台控制面板的 VNC, 开机卡在 grub 引导, 手动选择内核即可。
5、由于是使用最新版系统内核,最好请勿在生产环境安装,以免产生不可预测之后果。

使用方法:

使用root用户登录,运行以下命令:

wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh
chmod +x bbr.sh
./bbr.sh

查看内核版本,含有 4.9.0 就表示 OK 了

uname -r
sysctl net.ipv4.tcp_available_congestion_control

返回值一般为:

net.ipv4.tcp_available_congestion_control = bbr cubic reno
sysctl net.ipv4.tcp_congestion_control

返回值一般为:

net.ipv4.tcp_congestion_control = bbr
sysctl net.core.default_qdisc

返回值一般为:

net.core.default_qdisc = fq
lsmod | grep bbr

返回值有 tcp_bbr 模块即说明bbr已启动。

centos6 安装TIGERVNC

CENTOS 6 安装 KDE 桌面环境,执行指令,

yum groupinstall "X Window System" "KDE Desktop" Desktop

即可,同时安装了 3 个软件包。注意,因为 KDE Desktop 和 X Window System 两个软件包名称中间都包含空格,需要用引号引起来才行。

要安装 Gnome 桌面环境,执行指令,

yum groupinstall "X Window System" "Desktop Platform" Desktop

即可,也是同时安装了 3 个软件包,其中 X Window System 是必须的,不管是 Gnome 还是 KDE。

卸载GNOME桌面环境

yum groupremove "GNOME Desktop Environment"

卸载KDE桌面环境

yum groupremove "KDE (K Desktop Environment)"

手动启动,由文本界面切换到图形界面:

运行命令

startx

开机自动启动图形桌面,修改/etc/inittab文件中的

id:3:initdefault , 将3改为5 ,重新启动系统

如果需要中文语言

yum groupinstall "Chinese Support"
vi /etc/sysconfig/i18n #编辑
export LC_ALL=zh_CN.UTF-8 #修改或者添加 

图形桌面安装完成后,如需图形、管理工具之类,

yum -y groupinstall "Graphical Administration Tools"
yum -y groupinstall "Internet Browser"
yum -y groupinstall "General Purpose Desktop"
yum -y groupinstall "Office Suite and Productivity"
yum -y groupinstall "Graphics Creation Tools"

首次创建 /.vnc/xstartup 时,指定的窗口管理器是twn,它是一个极小的窗口管理器,几乎每台xwindows系统及其上都有twn 。下面是修改过的实例。

vi .vnc/xstartup
DISPPLAY=:1 gnome-session &  #在最下面添加一行

增加开机自动启动TIGERVNC,

a. 在/etc/rc.d/rc.local文件中加入下面行

/etc/init.d/vncserver start

b. 编辑/etc/sysconfig/vncservers

VNCSERVERS="1:root"
VNCSERVERARGS[1]="-geometry 1024x768"  #配置启动的桌面

加入防火墙规则

-A INPUT -p tcp -m tcp --dport 5900:6000 -j ACCEPT

多个用户可以这样写:

VNCSERVERS= "1:user 2:user2 3:user3"

修改swappiness参数

–临时性修改:

# sysctl vm.swappiness=10

vm.swappiness = 10

# cat /proc/sys/vm/swappiness

10

这里我们的修改已经生效,但是如果我们重启了系统,又会变成60.

–永久修改:

在/etc/sysctl.conf 文件里添加如下参数:

vm.swappiness=10

Linux服务器下配置exif功能

先找一下LINUX服务器上php的安装目录,例如为:/root/lnmp1.3-full/php-5.2.10/

执行:

cd /root/lnmp0.4-full/php-7.0.6/ext/

我们要安装exif模块,执行

cd exif/

再执行

/usr/local/php/bin/phpize

会返回如下信息:
Configuring for:
PHP Api Version: 20041225
Zend Module Api No: 20060613
Zend Extension Api No: 220060519

再执行以下命令:

 ./configure --with-php-config=/usr/local/php/bin/php-config
make && make install

执行完返回:
Build complete.
Don’t forget to run ‘make test’.Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/

表示已经成功,再修改
/usr/local/php/etc/php.ini

查找:extension = 再最后一个extension= 后面添加上

extension = “exif.so”

保存,执行/root/lnmp restart 重启。

lnmp下防夸目录其他方式

lnmp在web目录下有一个.user.ini文件,这个文件是为了防跨目录,如果想要修改或者删除,可以用

chattr -i /网站目录/.user.ini

如果不想要这个文件,可以在nginx 每个server下,加上

fastcgi_param  PHP_VALUE  "open_basedir=$document_root:/home/wwwroot/web:/tmp/:/proc/:/dev/urandom";

一定要加上”$document_root:” 否则其他的站点目录会打不开。

nginx下配置owncloud所解决的几个小问题

官方说明文件称apache更加适合owncloud,尽管给出了nginx的配置文档,但是过于简略,以下是配置过程中所解决问题的总结。

主机配置代码:

upstream php-handler {
#server 127.0.0.1:9000;
server unix:/tmp/php-cgi.sock;
}

server {
listen 80;
server_name mycloud.nancybox.com;
# enforce https
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name mycloud.nancybox.com;

ssl_certificate /etc/ssl/ssl.crt;
ssl_certificate_key /etc/ssl/ssl.key;

# Add headers to serve security related headers
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
# Path to the root of your installation
root /home/wwwroot/icloud/;

# set max upload size
client_max_body_size 10G;
fastcgi_buffers 64 4K;

# Disable gzip to avoid the removal of the ETag header
gzip off;

# Uncomment if your server is build with the ngx_pagespeed module
# This module is currently not supported.
#pagespeed off;

index index.php;
error_page 403 /core/templates/403.php;
error_page 404 /core/templates/404.php;

rewrite ^/.well-known/carddav /remote.php/carddav/ permanent;
rewrite ^/.well-known/caldav /remote.php/caldav/ permanent;

# The following 2 rules are only needed for the user_webfinger app.
# Uncomment it if you're planning to use this app.
#rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
#rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}

location ~ ^/(build|tests|config|lib|3rdparty|templates|data)/ {
deny all;
}

location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
deny all;
}

location / {

rewrite ^/remote/(.*) /remote.php last;

rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;

try_files $uri $uri/ =404;
}
location ~ \.php(?:$|/) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param HTTPS on;
fastcgi_param modHeadersAvailable true; #Avoid sending the security headers twice
fastcgi_pass php-handler;
fastcgi_intercept_errors on;
}

# Adding the cache control header for js and css files
# Make sure it is BELOW the location ~ \.php(?:$|/) { block
location ~* \.(?:css|js)$ {
add_header Cache-Control "public, max-age=7200";
# Add headers to serve security related headers
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
# Optional: Don't log access to assets
access_log off;
}

# Optional: Don't log access to other assets
location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|swf)$ {
access_log off;
}
}

php-fpm.conf 配置代码

[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
log_level = notice

[www]
listen = /tmp/php-cgi.sock
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 6
request_terminate_timeout = 100
request_slowlog_timeout = 0
slowlog = var/log/slow.log
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

php.ini 防跨文件

open_basedir=/home/wwwroot:/tmp/:/proc/:/dev/urandom