README.md 11.0 KB
Newer Older
F
fatedier 已提交
1
# frp
2

F
fatedier 已提交
3
[![Build Status](https://travis-ci.org/fatedier/frp.svg?branch=master)](https://travis-ci.org/fatedier/frp)
4

F
fatedier 已提交
5 6
[README](README.md) | [中文文档](README_zh.md)

F
fatedier 已提交
7 8
## What is frp?

F
fatedier 已提交
9
frp is a fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet. Now, it supports tcp, udp, http and https protocol when requests can be forwarded by domains to backward web services.
F
fatedier 已提交
10

F
fatedier 已提交
11
## Table of Contents
F
fatedier 已提交
12

F
fatedier 已提交
13
<!-- vim-markdown-toc GFM -->
F
fatedier 已提交
14 15 16
* [What can I do with frp?](#what-can-i-do-with-frp)
* [Status](#status)
* [Architecture](#architecture)
E
Eric Larssen 已提交
17
* [Example Usage](#example-usage)
F
fatedier 已提交
18
    * [Access your computer in LAN by SSH](#access-your-computer-in-lan-by-ssh)
F
fatedier 已提交
19 20
    * [Visit your web service in LAN by custom domains](#visit-your-web-service-in-lan-by-custom-domains)
    * [Forward DNS query request](#forward-dns-query-request)
F
fatedier 已提交
21
* [Features](#features)
F
fatedier 已提交
22 23 24 25 26 27
    * [Dashboard](#dashboard)
    * [Authentication](#authentication)
    * [Encryption and Compression](#encryption-and-compression)
    * [Reload configures without frps stopped](#reload-configures-without-frps-stopped)
    * [Privilege Mode](#privilege-mode)
        * [Port White List](#port-white-list)
F
fatedier 已提交
28
    * [TCP Stream Multiplexing](#tcp-stream-multiplexing)
F
fatedier 已提交
29 30 31 32
    * [Connection Pool](#connection-pool)
    * [Rewriting the Host Header](#rewriting-the-host-header)
    * [Password protecting your web service](#password-protecting-your-web-service)
    * [Custom subdomain names](#custom-subdomain-names)
F
fatedier 已提交
33
    * [URL routing](#url-routing)
F
fatedier 已提交
34
    * [Connect frps by HTTP PROXY](#connect-frps-by-http-proxy)
F
fatedier 已提交
35 36
* [Development Plan](#development-plan)
* [Contributing](#contributing)
F
fatedier 已提交
37
* [Donation](#donation)
F
fatedier 已提交
38 39
    * [AliPay](#alipay)
    * [Paypal](#paypal)
F
fatedier 已提交
40

F
fatedier 已提交
41 42
<!-- vim-markdown-toc -->

F
fatedier 已提交
43 44
## What can I do with frp?

F
fatedier 已提交
45
* Expose any http and https service behind a NAT or firewall to the internet by a server with public IP address(Name-based Virtual Host Support).
F
fatedier 已提交
46
* Expose any tcp or udp service behind a NAT or firewall to the internet by a server with public IP address.
F
fatedier 已提交
47

F
fatedier 已提交
48 49
## Status

E
Eric Larssen 已提交
50
frp is under development and you can try it with latest release version. Master branch for releasing stable version when dev branch for developing.
F
fatedier 已提交
51

E
Eric Larssen 已提交
52
**We may change any protocol and can't promise backward compatible. Please check the release log when upgrading.**
F
fatedier 已提交
53

F
fatedier 已提交
54
## Architecture
F
fatedier 已提交
55

F
fatedier 已提交
56
![architecture](/doc/pic/architecture.png)
F
fatedier 已提交
57

F
fatedier 已提交
58
## Example Usage
F
fatedier 已提交
59

F
fatedier 已提交
60
Firstly, download the latest programs from [Release](https://github.com/fatedier/frp/releases) page according to your os and arch.
F
fatedier 已提交
61

F
fatedier 已提交
62
Put **frps** and **frps.ini** to your server with public IP.
F
fatedier 已提交
63

F
fatedier 已提交
64 65
Put **frpc** and **frpc.ini** to your server in LAN.

F
fatedier 已提交
66
### Access your computer in LAN by SSH
F
fatedier 已提交
67

F
fatedier 已提交
68
1. Modify frps.ini:
F
fatedier 已提交
69 70 71 72 73 74 75 76 77 78 79

  ```ini
  # frps.ini
  [common]
  bind_port = 7000
  ```

2. Start frps:

  `./frps -c ./frps.ini`

F
fatedier 已提交
80
3. Modify frpc.ini, `server_addr` is your frps's server IP:
F
fatedier 已提交
81 82 83 84 85 86 87 88

  ```ini
  # frpc.ini
  [common]
  server_addr = x.x.x.x
  server_port = 7000

  [ssh]
F
fatedier 已提交
89 90
  type = tcp
  local_ip = 127.0.0.1
F
fatedier 已提交
91
  local_port = 22
F
fatedier 已提交
92
  remote_port = 6000
F
fatedier 已提交
93 94 95 96 97 98 99 100 101 102
  ```

4. Start frpc:

  `./frpc -c ./frpc.ini`

5. Connect to server in LAN by ssh assuming that username is test:

  `ssh -oPort=6000 test@x.x.x.x`

F
fatedier 已提交
103
### Visit your web service in LAN by custom domains
F
fatedier 已提交
104

F
fatedier 已提交
105
Sometimes we want to expose a local web service behind a NAT network to others for testing with your own domain name and unfortunately we can't resolve a domain name to a local ip.
F
fatedier 已提交
106

F
fatedier 已提交
107
However, we can expose a http or https service using frp.
F
fatedier 已提交
108

F
fatedier 已提交
109
1. Modify frps.ini, configure http port 8080:
F
fatedier 已提交
110 111 112 113 114 115 116 117 118 119 120 121

  ```ini
  # frps.ini
  [common]
  bind_port = 7000
  vhost_http_port = 8080
  ```

2. Start frps:

  `./frps -c ./frps.ini`

F
fatedier 已提交
122
3. Modify frpc.ini and set remote frps server's IP as x.x.x.x. The `local_port` is the port of your web service:
F
fatedier 已提交
123 124 125 126 127 128 129 130 131 132

  ```ini
  # frpc.ini
  [common]
  server_addr = x.x.x.x
  server_port = 7000

  [web]
  type = http
  local_port = 80
F
fatedier 已提交
133
  custom_domains = www.yourdomain.com
F
fatedier 已提交
134 135 136 137 138 139
  ```

4. Start frpc:

  `./frpc -c ./frpc.ini`

F
fatedier 已提交
140
5. Resolve A record of `www.yourdomain.com` to IP `x.x.x.x` or CNAME record to your origin domain.
F
fatedier 已提交
141

F
fatedier 已提交
142
6. Now visit your local web service using url `http://www.yourdomain.com:8080`.
F
fatedier 已提交
143

F
fatedier 已提交
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
### Forward DNS query request

1. Modify frps.ini, configure a reverse proxy named [dns]:

  ```ini
  # frps.ini
  [common]
  bind_port = 7000
  ```

2. Start frps:

  `./frps -c ./frps.ini`

3. Modify frpc.ini, set remote frps's server IP as x.x.x.x, forward dns query request to google dns server `8.8.8.8:53`:

  ```ini
  # frpc.ini
  [common]
  server_addr = x.x.x.x
  server_port = 7000

  [dns]
  type = udp
  local_ip = 8.8.8.8
  local_port = 53
F
fatedier 已提交
170
  remote_port = 6000
F
fatedier 已提交
171 172 173 174 175 176 177 178 179 180
  ```

4. Start frpc:

  `./frpc -c ./frpc.ini`

5. Send dns query request by dig:

  `dig @x.x.x.x -p 6000 www.goolge.com`

F
fatedier 已提交
181 182
## Features

F
fatedier 已提交
183 184 185 186 187 188 189 190 191
### Dashboard

Check frp's status and proxies's statistics information by Dashboard.

Configure a port for dashboard to enable this feature:

```ini
[common]
dashboard_port = 7500
E
Eric Larssen 已提交
192
# dashboard's username and password are both optional,if not set, default is admin.
F
fatedier 已提交
193 194
dashboard_user = admin
dashboard_pwd = admin
F
fatedier 已提交
195 196
```

E
Eric Larssen 已提交
197
Then visit `http://[server_addr]:7500` to see dashboard, default username and password are both `admin`.
F
fatedier 已提交
198 199 200

![dashboard](/doc/pic/dashboard.png)

F
fatedier 已提交
201 202
### Authentication

F
fatedier 已提交
203
Since v0.10.0, you only need to set `privilege_token` in frps.ini and frpc.ini.
F
fatedier 已提交
204

F
fatedier 已提交
205
Note that time duration between server of frpc and frps mustn't exceed 15 minutes because timestamp is used for authentication.
F
fatedier 已提交
206

F
fatedier 已提交
207 208
Howerver, this timeout duration can be modified by setting `authentication_timeout` in frps's configure file. It's defalut value is 900, means 15 minutes. If it is equals 0, then frps will not check authentication timeout.

F
fatedier 已提交
209 210
### Encryption and Compression

F
fatedier 已提交
211
Defalut value is false, you could decide if the proxy will use encryption or compression:
F
fatedier 已提交
212 213 214 215 216

```ini
# frpc.ini
[ssh]
type = tcp
F
fatedier 已提交
217 218
local_port = 22
remote_port = 6000
F
fatedier 已提交
219
use_encryption = true
F
fatedier 已提交
220
use_compression = true
F
fatedier 已提交
221 222 223 224
```

### Reload configures without frps stopped

F
fatedier 已提交
225
This feature is removed since v0.10.0.
F
fatedier 已提交
226 227 228

### Privilege Mode

F
fatedier 已提交
229
Privilege mode is the default and only mode support in frp since v0.10.0. All proxy configurations are set in client.
F
fatedier 已提交
230

F
fatedier 已提交
231 232
#### Port White List

F
fatedier 已提交
233
`privilege_allow_ports` in frps.ini is used for preventing abuse of ports:
F
fatedier 已提交
234 235 236 237 238 239 240

```ini
# frps.ini
[common]
privilege_allow_ports = 2000-3000,3001,3003,4000-50000
```

F
fatedier 已提交
241
`privilege_allow_ports` consists of a specific port or a range of ports divided by `,`.
F
fatedier 已提交
242

F
fatedier 已提交
243 244 245 246 247 248 249 250 251 252 253 254
### TCP Stream Multiplexing

frp support tcp stream multiplexing since v0.10.0 like HTTP2 Multiplexing. All user requests to same frpc can use only one tcp connection.

You can disable this feature by modify frps.ini and frpc.ini:

```ini
# frps.ini and frpc.ini, must be same
[common]
tcp_mux = false
```

F
fatedier 已提交
255 256 257 258 259 260 261 262
### Connection Pool

By default, frps send message to frpc for create a new connection to backward service when getting an user request.If a proxy's connection pool is enabled, there will be a specified number of connections pre-established.

This feature is fit for a large number of short connections.

1. Configure the limit of pool count each proxy can use in frps.ini:

F
fatedier 已提交
263
  ```ini
F
fatedier 已提交
264 265
  # frps.ini
  [common]
F
fatedier 已提交
266
  max_pool_count = 5
F
fatedier 已提交
267 268 269 270
  ```

2. Enable and specify the number of connection pool:

E
Eric Larssen 已提交
271
  ```ini
F
fatedier 已提交
272
  # frpc.ini
F
fatedier 已提交
273 274
  [common]
  pool_count = 1
F
fatedier 已提交
275 276 277 278 279 280
  ```

### Rewriting the Host Header

When forwarding to a local port, frp does not modify the tunneled HTTP requests at all, they are copied to your server byte-for-byte as they are received. Some application servers use the Host header for determining which development site to display. For this reason, frp can rewrite your requests with a modified Host header. Use the `host_header_rewrite` switch to rewrite incoming HTTP requests.

F
fatedier 已提交
281 282
```ini
# frpc.ini
E
Eric Larssen 已提交
283
[web]
F
fatedier 已提交
284 285 286 287 288 289 290 291
type = http
local_port = 80
custom_domains = test.yourdomain.com
host_header_rewrite = dev.yourdomain.com
```

If `host_header_rewrite` is specified, the Host header will be rewritten to match the hostname portion of the forwarding address.

F
fatedier 已提交
292 293 294 295 296 297
### Password protecting your web service

Anyone who can guess your tunnel URL can access your local web server unless you protect it with a password.

This enforces HTTP Basic Auth on all requests with the username and password you specify in frpc's configure file.

F
fatedier 已提交
298
It can only be enabled when proxy type is http.
F
fatedier 已提交
299 300 301 302 303 304 305 306 307 308 309

```ini
# frpc.ini
[web]
type = http
local_port = 80
custom_domains = test.yourdomain.com
http_user = abc
http_pwd = abc
```

F
fatedier 已提交
310
Visit `http://test.yourdomain.com` and now you need to input username and password.
F
fatedier 已提交
311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334

### Custom subdomain names

It is convenient to use `subdomain` configure for http、https type when many people use one frps server together.

```ini
# frps.ini
subdomain_host = frps.com
```

Resolve `*.frps.com` to the frps server's IP.

```ini
# frpc.ini
[web]
type = http
local_port = 80
subdomain = test
```

Now you can visit your web service by host `test.frps.com`.

Note that if `subdomain_host` is not empty, `custom_domains` should not be the subdomain of `subdomain_host`.

F
fatedier 已提交
335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356
### URL routing

frp support forward http requests to different backward web services by url routing.

`locations` specify the prefix of URL used for routing. frps first searches for the most specific prefix location given by literal strings regardless of the listed order.

```ini
# frpc.ini
[web01]
type = http
local_port = 80
custom_domains = web.yourdomain.com
locations = /

[web02]
type = http
local_port = 81
custom_domains = web.yourdomain.com
locations = /news,/about
```
Http requests with url prefix `/news` and `/about` will be forwarded to **web02** and others to **web01**.

F
fatedier 已提交
357 358 359 360 361 362 363 364 365 366 367
### Connect frps by HTTP PROXY

frpc can connect frps using HTTP PROXY if you set os environment `HTTP_PROXY` or configure `http_proxy` param in frpc.ini file.

```ini
# frpc.ini
server_addr = x.x.x.x
server_port = 7000
http_proxy = http://user:pwd@192.168.1.128:8080
```

F
fatedier 已提交
368 369
## Development Plan

F
fatedier 已提交
370 371
* Log http request information in frps.
* Direct reverse proxy, like haproxy.
F
fatedier 已提交
372
* Load balance to different service in frpc.
F
fatedier 已提交
373 374
* Frpc can directly be a webserver for static files.
* Full control mode, dynamically modify frpc's configure with dashboard in frps.
F
fatedier 已提交
375
* P2p communicate by make udp hole to penetrate NAT.
F
fatedier 已提交
376 377 378
* Client Plugin (http proxy).
* kubernetes ingress support.

379 380 381

## Contributing

F
fatedier 已提交
382
Interested in getting involved? We would like to help you!
383

F
fatedier 已提交
384 385 386
* Take a look at our [issues list](https://github.com/fatedier/frp/issues) and consider sending a Pull Request to **dev branch**.
* If you want to add a new feature, please create an issue first to describe the new feature, as well as the implementation approach. Once a proposal is accepted, create an implementation of the new features and submit it as a pull request.
* Sorry for my poor english and improvement for this document is welcome even some typo fix.
F
fatedier 已提交
387
* If you have some wanderful ideas, send email to fatedier@gmail.com.
F
fatedier 已提交
388

F
fatedier 已提交
389 390
**Note: We prefer you to give your advise in [issues](https://github.com/fatedier/frp/issues), so others with a same question can search it quickly and we don't need to answer them repeatly.**

F
fatedier 已提交
391 392 393 394
## Donation

If frp help you a lot, you can support us by:

F
fatedier 已提交
395 396
frp QQ group: 606194980

F
fatedier 已提交
397 398 399 400 401 402 403
### AliPay

![donation-alipay](/doc/pic/donate-alipay.png)

### Paypal

Donate money by [paypal](https://www.paypal.me/fatedier) to my account **fatedier@gmail.com**.