新版frp内网穿透
1.frp下载地址
Releases · fatedier/frp (github.com)
2.解压后,将文件夹里面的文件放到 /root/frp 目录下、
———————————————证书配置————————————————————
2、请求证书
证数各参数含义如下:
C-----国家(Country Name)
ST----省份(State or Province Name)
L----城市(Locality Name)
O----公司(Organization Name)
OU----部门(Organizational Unit Name)
CN----产品名(Common Name)
emailAddress----邮箱(Email Address)
openssl
req -new -sha256 -key ca.key -out ca.csr -subj
"/C=CN/ST=SD/L=JN/O=QDZY/OU=www.test.com/CN=CA/emailAddress=admin@test.com"
https://gofrp.org/zh-cn/docs/features/common/network/network-tls/
3.客户端端配置:
将 frps.toml 文件修改为如下内容
#此配置文件仅供参考。请不要直接使用此配置来运行程序,因为它可能存在各种问题。 #您的代理名称将更改为{user}。代理 user=“your_name” #IPv6的文字地址或主机名必须包含在内 #方括号中,如“[::1]:80”、“[ipv6-host]:http”或“[ipv6host%zone]:80” #对于单个serverAddr字段,不需要方括号,如serverAddr=“:”。 serverAddr = "0.0.0.0" serverPort = 7000 # STUN server to help penetrate NAT hole. # natHoleStunServer = "stun.easyvoip.com:3478" # Decide if exit program when first login failed, otherwise continuous relogin to frps # default is true loginFailExit = true # console or real logFile path like ./frpc.log log.to = "./frpc.log" # trace, debug, info, warn, error log.level = "info" log.maxDays = 3 # disable log colors when log.to is console, default is false log.disablePrintColor = false auth.method = "token" # auth.additionalScopes specifies additional scopes to include authentication information. # Optional values are HeartBeats, NewWorkConns. # auth.additionalScopes = ["HeartBeats", "NewWorkConns"] # auth token auth.token = "12345678" # oidc.clientID specifies the client ID to use to get a token in OIDC authentication. # auth.oidc.clientID = "" # oidc.clientSecret specifies the client secret to use to get a token in OIDC authentication. # auth.oidc.clientSecret = "" # oidc.audience specifies the audience of the token in OIDC authentication. # auth.oidc.audience = "" # oidc.scope specifies the permissions of the token in OIDC authentication if AuthenticationMethod == "oidc". By default, this value is "". # auth.oidc.scope = "" # oidc.tokenEndpointURL specifies the URL which implements OIDC Token Endpoint. # It will be used to get an OIDC token. # auth.oidc.tokenEndpointURL = "" # oidc.additionalEndpointParams specifies additional parameters to be sent to the OIDC Token Endpoint. # For example, if you want to specify the "audience" parameter, you can set as follow. # frp will add "audience=<value>" "var1=<value>" to the additional parameters. # auth.oidc.additionalEndpointParams.audience = "https://dev.auth.com/api/v2/" # auth.oidc.additionalEndpointParams.var1 = "foobar" # Set admin address for control frpc's action by http api such as reload webServer.addr = "127.0.0.1" webServer.port = 7400 webServer.user = "admin" webServer.password = "admin" # Admin assets directory. By default, these assets are bundled with frpc. # webServer.assetsDir = "./static" # Enable golang pprof handlers in admin listener. webServer.pprofEnable = false #拨号到服务器等待连接完成的最长时间。默认值为10秒。 # transport.dialServerTimeout = 10 #dialServerKeepalive指定frpc和frps之间活动网络连接的保持活动探测之间的间隔。 #如果为f负数,则禁用保活探针。 # transport.dialServerKeepalive = 7200 #连接将提前建立,默认值为零 transport.poolCount = 5 #如果使用tcp流复用,默认值为true,则必须与frps相同 # transport.tcpMux = true #指定tcp mux的保持活动间隔。 #仅当tcpMux已启用时有效。 # transport.tcpMuxKeepaliveInterval = 60 #用于连接到服务器的通信协议 #现在支持tcp、kcp、quic、websocket和wss,默认为tcp transport.protocol = "tcp" #在连接服务器时设置客户端绑定ip,默认为空。 #只有当protocol=tcp或websocket时,才会使用该值。 transport.connectServerLocalIP = "0.0.0.0" # if you want to connect frps by http proxy or socks5 proxy or ntlm proxy, you can set proxyURL here or in global environment variables # it only works when protocol is tcp # transport.proxyURL = "http://user:passwd@192.168.1.128:8080" # transport.proxyURL = "socks5://user:passwd@192.168.1.128:1080" # transport.proxyURL = "ntlm://user:passwd@192.168.1.128:2080" # quic protocol options # transport.quic.keepalivePeriod = 10 # transport.quic.maxIdleTimeout = 30 # transport.quic.maxIncomingStreams = 100000 #如果tls.enable为true,则frpc将通过tls连接frps。 #自v0.50.0以来,默认值已更改为true,并且默认情况下启用tls。 transport.tls.enable = true # transport.tls.certFile = "client.crt" # transport.tls.keyFile = "client.key" # transport.tls.trustedCaFile = "ca.crt" # transport.tls.serverName = "example.com" #如果disableCustomTLSFirstByte设置为false,则frpc将使用启用tls时的第一个自定义字节。 #自v0.50.0以来,默认值已更改为true,并且默认情况下禁用第一个自定义字节。 # transport.tls.disableCustomTLSFirstByte = true #心跳配置,不建议修改默认值。 #heartbeatInterval的默认值为10,heartbeatTimeout为90。设置负值禁用它. # transport.heartbeatInterval = 30 # transport.heartbeatTimeout = 90 # Specify a dns server, so frpc will use this instead of default one # dnsServer = "8.8.8.8" # Proxy names you want to start. # Default is empty, means all proxies. # start = ["ssh", "dns"] # Specify udp packet size, unit is byte. If not set, the default value is 1500. # This parameter should be same between client and server. # It affects the udp and sudp proxy. udpPacketSize = 1500 # Additional metadatas for client. metadatas.var1 = "abc" metadatas.var2 = "123" # Include other config files for proxies. # includes = ["./confd/*.ini"] [[proxies]] #“ssh”是唯一的代理名称 #如果全局用户不为空,它将被更改为{user}.{proxy},如“your_name.ssh” name = "ssh" type = "tcp" localIP = "127.0.0.1" localPort = 22 #限制此代理的带宽,单位为KB和MB transport.bandwidthLimit = "1MB" #限制此代理的带宽,单位为KB和MB#限制此代理的带宽,单位为KB和MB#限制此代理的带宽,单位为KB和MB transport.bandwidthLimitMode = "client" #如果为true,则此代理的流量将被加密,默认为false transport.useEncryption = false #如果为true,则流量将被压缩 transport.useCompression = false #通过frp进行远程端口侦听 remotePort = 6001 #frp将对同一组中的代理进行负载平衡连接 loadBalancer.group = "test_group" #组应具有相同的组密钥 loadBalancer.groupKey = "123456" #启用后端服务的健康检查,它现在支持“tcp”和“http”。 #frpc将连接本地服务的端口以检测其健康状态 healthCheck.type = "tcp" # Health check connection timeout healthCheck.timeoutSeconds = 3 #如果连续3次失败,代理将从frps中删除 healthCheck.maxFailed = 3 #每10秒进行一次健康检查 healthCheck.intervalSeconds = 10 #每个代理的附加元信息 metadatas.var1 = "abc" metadatas.var2 = "123" [[proxies]] name = "ssh_random" type = "tcp" localIP = "192.168.31.100" localPort = 22 # If remotePort is 0, frps will assign a random port for you remotePort = 0 [[proxies]] name = "dns" type = "udp" localIP = "114.114.114.114" localPort = 53 remotePort = 6002 # Resolve your domain names to [serverAddr] so you can use http://web01.yourdomain.com to browse web01 and http://web02.yourdomain.com to browse web02 [[proxies]] name = "web01" type = "http" localIP = "127.0.0.1" localPort = 80 # http username and password are safety certification for http protocol # if not set, you can access this customDomains without certification httpUser = "admin" httpPassword = "admin" # if domain for frps is frps.com, then you can access [web01] proxy by URL http://web01.frps.com subdomain = "web01" customDomains = ["web01.yourdomain.com"] # locations is only available for http type locations = ["/", "/pic"] # route requests to this service if http basic auto user is abc # routeByHTTPUser = abc hostHeaderRewrite = "example.com" requestHeaders.set.x-from-where = "frp" healthCheck.type = "http" # frpc will send a GET http request '/status' to local http service # http service is alive when it return 2xx http response code healthCheck.path = "/status" healthCheck.intervalSeconds = 10 healthCheck.maxFailed = 3 healthCheck.timeoutSeconds = 3 [[proxies]] name = "web02" type = "https" localIP = "127.0.0.1" localPort = 8000 subdomain = "web02" customDomains = ["web02.yourdomain.com"] # if not empty, frpc will use proxy protocol to transfer connection info to your local service # v1 or v2 or empty transport.proxyProtocolVersion = "v2" [[proxies]] name = "tcpmuxhttpconnect" type = "tcpmux" multiplexer = "httpconnect" localIP = "127.0.0.1" localPort = 10701 customDomains = ["tunnel1"] # routeByHTTPUser = "user1" [[proxies]] name = "plugin_unix_domain_socket" type = "tcp" remotePort = 6003 # if plugin is defined, localIP and localPort is useless # plugin will handle connections got from frps [proxies.plugin] type = "unix_domain_socket" unixPath = "/var/run/docker.sock" [[proxies]] name = "plugin_http_proxy" type = "tcp" remotePort = 6004 [proxies.plugin] type = "http_proxy" httpUser = "abc" httpPassword = "abc" [[proxies]] name = "plugin_socks5" type = "tcp" remotePort = 6005 [proxies.plugin] type = "socks5" username = "abc" password = "abc" [[proxies]] name = "plugin_static_file" type = "tcp" remotePort = 6006 [proxies.plugin] type = "static_file" localPath = "/var/www/blog" stripPrefix = "static" httpUser = "abc" httpPassword = "abc" [[proxies]] name = "plugin_https2http" type = "https" customDomains = ["test.yourdomain.com"] [proxies.plugin] type = "https2http" localAddr = "127.0.0.1:80" crtPath = "./server.crt" keyPath = "./server.key" hostHeaderRewrite = "127.0.0.1" requestHeaders.set.x-from-where = "frp" [[proxies]] name = "plugin_https2https" type = "https" customDomains = ["test.yourdomain.com"] [proxies.plugin] type = "https2https" localAddr = "127.0.0.1:443" crtPath = "./server.crt" keyPath = "./server.key" hostHeaderRewrite = "127.0.0.1" requestHeaders.set.x-from-where = "frp" [[proxies]] name = "plugin_http2https" type = "http" customDomains = ["test.yourdomain.com"] [proxies.plugin] type = "http2https" localAddr = "127.0.0.1:443" hostHeaderRewrite = "127.0.0.1" requestHeaders.set.x-from-where = "frp" [[proxies]] name = "secret_tcp" # If the type is secret tcp, remotePort is useless # Who want to connect local port should deploy another frpc with stcp proxy and role is visitor type = "stcp" # secretKey is used for authentication for visitors secretKey = "abcdefg" localIP = "127.0.0.1" localPort = 22 # If not empty, only visitors from specified users can connect. # Otherwise, visitors from same user can connect. '*' means allow all users. allowUsers = ["*"] [[proxies]] name = "p2p_tcp" type = "xtcp" secretKey = "abcdefg" localIP = "127.0.0.1" localPort = 22 # If not empty, only visitors from specified users can connect. # Otherwise, visitors from same user can connect. '*' means allow all users. allowUsers = ["user1", "user2"] # frpc role visitor -> frps -> frpc role server [[visitors]] name = "secret_tcp_visitor" type = "stcp" # the server name you want to visitor serverName = "secret_tcp" secretKey = "abcdefg" # connect this address to visitor stcp server bindAddr = "127.0.0.1" # bindPort can be less than 0, it means don't bind to the port and only receive connections redirected from # other visitors. (This is not supported for SUDP now) bindPort = 9000 [[visitors]] name = "p2p_tcp_visitor" type = "xtcp" # if the server user is not set, it defaults to the current user serverUser = "user1" serverName = "p2p_tcp" secretKey = "abcdefg" bindAddr = "127.0.0.1" # bindPort can be less than 0, it means don't bind to the port and only receive connections redirected from # other visitors. (This is not supported for SUDP now) bindPort = 9001 # when automatic tunnel persistence is required, set it to true keepTunnelOpen = false # effective when keepTunnelOpen is set to true, the number of attempts to punch through per hour maxRetriesAnHour = 8 minRetryInterval = 90 # fallbackTo = "stcp_visitor" # fallbackTimeoutMs = 500
4.服务端配置:
#此配置文件仅供参考。请不要直接使用此配置来运行程序,因为它可能存在各种问题。 #IPv6的文字地址或主机名必须包含在内 #方括号中,如“[::1]:80”、“[ipv6-host]:http”或“[ipv6host%zone]:80” #对于单个“bindAddr”字段,不需要方括号,如`bindAddr=“::”`。 bindAddr = "0.0.0.0" bindPort = 7000 #用于kcp协议的udp端口,它可以与“bindPort”相同。 #如果未设置,则在frp中禁用kcp。 kcpBindPort = 7000 # udp port used for quic protocol. # if not set, quic is disabled in frps. # quicBindPort = 7002 #指定代理将侦听的地址,默认值与bindAddr相同 # proxyBindAddr = "127.0.0.1" # quic protocol options # transport.quic.keepalivePeriod = 10 # transport.quic.maxIdleTimeout = 30 # transport.quic.maxIncomingStreams = 100000 # Heartbeat configure, it's not recommended to modify the default value # The default value of heartbeatTimeout is 90. Set negative value to disable it. # transport.heartbeatTimeout = 90 #每个代理中的池计数将保持不超过maxPoolCount。 transport.maxPoolCount = 5 # If tcp stream multiplexing is used, default is true # transport.tcpMux = true #指定tcp mux的保持活动间隔。 #仅当tcpMux为true时有效. # transport.tcpMuxKeepaliveInterval = 60 #tcpKeepalive指定frpc和frps之间活动网络连接的保持活动探测之间的间隔。 #如果为阴性,则禁用保活探针。 # transport.tcpKeepalive = 7200 #transport.tls.force指定是否只接受tls加密的连接。默认情况下,该值为false。 transport.tls.force = false # transport.tls.certFile = "server.crt" # transport.tls.keyFile = "server.key" # transport.tls.trustedCaFile = "ca.crt" #如果要支持虚拟主机,则必须设置用于侦听的http端口(可选) #注意:http端口和https端口可以与bindPort相同 vhostHTTPPort = 80 vhostHTTPSPort = 443 #vhosthttp服务器的响应标头超时(秒),默认值为60s # vhostHTTPTimeout = 60 #tcpmuxHTTPConnectPort指定服务器侦听TCP的端口 #HTTP CONNECT请求。如果该值为0,则服务器将不会多路传输TCP #一个端口上的请求。如果不是,它将侦听的此值 #HTTP CONNECT请求。默认情况下,此值为0。 # tcpmuxHTTPConnectPort = 1337 # If tcpmuxPassthrough is true, frps won't do any update on traffic. # tcpmuxPassthrough = false #配置web服务器以启用frps的仪表板。 #只有在设置了webServer.port时,仪表板才可用。 webServer.addr = "127.0.0.1" webServer.port = 7500 webServer.user = "admin" webServer.password = "admin" # webServer.tls.certFile = "server.crt" # webServer.tls.keyFile = "server.key" # dashboard assets directory(only for debug mode) # webServer.assetsDir = "./static" # Enable golang pprof handlers in dashboard listener. # Dashboard port must be set first webServer.pprofEnable = false # enablePrometheus will export prometheus metrics on webServer in /metrics api. enablePrometheus = true # console or real logFile path like ./frps.log log.to = "./frps.log" # trace, debug, info, warn, error log.level = "info" log.maxDays = 3 # disable log colors when log.to is console, default is false log.disablePrintColor = false #DetailedErrorsToClient定义是否将特定错误(带有调试信息)发送到frpc。默认情况下,此值为true。 detailedErrorsToClient = true # auth.method specifies what authentication method to use authenticate frpc with frps. # If "token" is specified - token will be read into login message. # If "oidc" is specified - OIDC (Open ID Connect) token will be issued using OIDC settings. By default, this value is "token". auth.method = "token" # auth.additionalScopes specifies additional scopes to include authentication information. # Optional values are HeartBeats, NewWorkConns. # auth.additionalScopes = ["HeartBeats", "NewWorkConns"] # auth token auth.token = "12345678" # oidc issuer specifies the issuer to verify OIDC tokens with. auth.oidc.issuer = "" # oidc audience specifies the audience OIDC tokens should contain when validated. auth.oidc.audience = "" # oidc skipExpiryCheck specifies whether to skip checking if the OIDC token is expired. auth.oidc.skipExpiryCheck = false # oidc skipIssuerCheck specifies whether to skip checking if the OIDC token's issuer claim matches the issuer specified in OidcIssuer. auth.oidc.skipIssuerCheck = false # userConnTimeout specifies the maximum time to wait for a work connection. # userConnTimeout = 10 #只允许frpc绑定您列出的端口。默认情况下,不会有任何限制。 allowPorts = [ { start = 2000, end = 3000 }, { single = 3001 }, { single = 3003 }, { start = 4000, end = 50000 } ] # Max ports can be used for each client, default value is 0 means no limit maxPortsPerClient = 0 # If subDomainHost is not empty, you can set subdomain when type is http or https in frpc's configure file # When subdomain is test, the host used by routing is test.frps.com subDomainHost = "frps.com" # custom 404 page for HTTP requests # custom404Page = "/path/to/404.html" # specify udp packet size, unit is byte. If not set, the default value is 1500. # This parameter should be same between client and server. # It affects the udp and sudp proxy. udpPacketSize = 1500 # Retention time for NAT hole punching strategy data. natholeAnalysisDataReserveHours = 168 # ssh tunnel gateway # If you want to enable this feature, the bindPort parameter is required, while others are optional. # By default, this feature is disabled. It will be enabled if bindPort is greater than 0. # sshTunnelGateway.bindPort = 2200 # sshTunnelGateway.privateKeyFile = "/home/frp-user/.ssh/id_rsa" # sshTunnelGateway.autoGenPrivateKeyPath = "" # sshTunnelGateway.authorizedKeysFile = "/home/frp-user/.ssh/authorized_keys" [[httpPlugins]] name = "user-manager" addr = "127.0.0.1:9000" path = "/handler" ops = ["Login"] [[httpPlugins]] name = "port-manager" addr = "127.0.0.1:9001" path = "/handler" ops = ["NewProxy"]
服务端配置和自动设置
创建服务脚本并编辑 vi /etc/systemd/system/frps.service
内容如下:(注意,代码中的frps.ini是服务端配置文件,请依据自己的实际情况做相应修改)
[Unit] Dcription=The nginx HTTP and reverse proxy server After=network.target remote-fs.target nss-lookup.target [Service] Type=simple User=root Restart=on-failure ExecStart=/root/frp/frps -c /root/frp/frps.toml ExecReload=/root/frp/frps -c /root/frp/frps.toml KillSignal=SIGQUIT TimeoutStopSec=5 KillMode=process PrivateTmp=true StandardOutput=syslog StandardError=inherit [Install] WantedBy=multi-user.target
加入服务列表并设置自启动
#重新加载服务列表 systemctl daemon-reload #将frps加入开机自启动 systemctl enable frps.service #启动服务 systemctl start frps.service #以下是其他常用命令 #关闭服务 systemctl stop frps.service #重启服务 systemctl restart frps.service #显示服务的状态 systemctl status frps.service #禁用服务开机启动 systemctl disable frps.service #查看服务是否开机启动 systemctl is-enabled frps.service #查看已经启动的服务列表 systemctl list-unit-files|grep enable #查看启动失败的服务列表 systemctl --failed配置和自启动设置
客户端配置和自动设置
客户端与服务端配置方法完全一致,代码如下:
创建服务脚本并编辑 vi /etc/systemd/system/frpc.service
内容如下:(注意,代码中的frpc.ini是服务端配置文件,请依据自己的实际情况做相应修改)
[Unit] Dcription=The nginx HTTP and reverse proxy server After=network.target remote-fs.target nss-lookup.target [Service] Type=simple User=root Restart=on-failure ExecStart=/root/frp/frpc -c /root/frp/frpc.toml ExecReload=/root/frp/frpc -c /root/frp/frpc.toml KillSignal=SIGQUIT TimeoutStopSec=5 KillMode=process PrivateTmp=true StandardOutput=syslog StandardError=inherit [Install] WantedBy=multi-user.target
加入服务列表并设置自启动
#重新加载服务列表 systemctl daemon-reload #将frpc加入开机自启动 systemctl enable frpc.service #启动服务 systemctl start frpc.service #以下是其他常用命令 #关闭服务 systemctl stop frpc.service #重启服务 systemctl restart frpc.service #显示服务的状态 systemctl status frpc.service #禁用服务开机启动 systemctl disable frpc.service #查看服务是否开机启动 systemctl is-enabled frpc.service #查看已经启动的服务列表 systemctl list-unit-files|grep enable #查看启动失败的服务列表 systemctl --failed