内网穿透工具frp使用

如何访问局域网之内的主机呢?
我们有时候回家想看看公司局域网之内的服务怎么样,或者利用买的性能强悍的电脑做web service,但是如何让局域网之外的人访问呢?
这就要利用内网穿透工具了,这里介绍2016年十大开源软件之一的内网穿透工具:frp

查看源码:https://github.com/fatedier/frp

下载合适的二进制包:https://github.com/fatedier/frp/releases

内网穿透示例一,SSH远程登录内网主机:

部署服务端,frps.ini:

    [common]
    bind_port = 7000
    dashboard_port = 7500
    dashboard_user = gamelife
    dashboard_pwd = nopassword

    [ssh]
    listen_port = 6000
    auth_token = noauthtoken

启动服务端:./frps -c ./frps.ini

部署客户端,frpc.ini:

    [common]
    server_addr = 139.129.xxx.xxx # frps绑定的公网IP地址
    server_port = 7000
    auth_token = noauthtoken

    [ssh]
    type=tcp
    local_ip = 192.168.1.103
    local_port = 22
    use_encryption = false
    use_gzip = false

启动客户端:./frpc -c ./frpc.ini

添加ssh密钥到你的公网机器和内网机器上,同一对密钥对,例如:id_rsa, id_rsa.pub
将 id_rsa.pub 添加到 公网和内网机器上的文件:/root/.ssh/authorized_keys 中

以上两个操作我都是在root用户下进行,实际中为了安全,应该使用其他用户操作

登录命令:ssh -p 6000 -i ~/.ssh/id_rsa root@139.129.xxx.xxx,这样就登录到frpc所在的内网主机了

frpc控制脚本

frpc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/bin/sh
#
# frpc 内网穿透工具客户端
#
# chkconfig: 2345 20 10
# description: Redis is an open source, advanced key-value store.
#
# processname: frpc
# config: /usr/local/frp/frpc.ini
# pidfile: /var/run/frpc.pid

PROCESSNAME=frpc
PROCESS=/usr/local/frp/frpc
CONF=/usr/local/frp/frpc.ini
PIDFILE=/var/run/frpc.pid

function start() {
if [ -f $PIDFILE ]
then
echo -ne "$PIDFILE exists, process is already running or crashed\n"
else
echo -ne "Starting frpc client...\n"
nohup $PROCESS -c $CONF >> /dev/null 2>&1 &
PID=$(pidof $PROCESSNAME)
echo -e "$PID" >> $PIDFILE
fi
}

function stop() {
if [ ! -f $PIDFILE ]
then
echo -ne "$PIDFILE does not exist, process is not running\n"
else
PID=$(cat $PIDFILE)
kill -9 $PID
rm -f $PIDFILE
fi
}

case "$1" in
start) start
;;
stop) stop
;;
restart)
stop
start
;;
esac

管理命令:frpc start|stop|restart

加入系统服务

文件:/usr/local/frp/init.d/frpc 就是上面编写的控制脚本

frpc.service

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=frpc
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/frp/init.d/frpc start
ExecReload=/usr/local/frp/init.d/frpc restart
ExecStop=/usr/local/frp/init.d/frpc stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target

保存至目录:/usr/lib/systemd/system

执行命令:

systemctl daemon-reload 重新加载系统服务
systemctl enable frpc 开机自动重启frpc

管理命令:

systemctl status|stop|start|restart frpc

例如: systemctl status frpc

1
2
3
4
5
6
7
8
9
10
11
● frpc.service - frpc
Loaded: loaded (/usr/lib/systemd/system/frpc.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2017-03-24 11:36:52 CST; 5s ago
Process: 3126 ExecStart=/usr/local/frp/init.d/frpc start (code=exited, status=0/SUCCESS)
Main PID: 3127 (frpc)
CGroup: /system.slice/frpc.service
└─3127 /usr/local/frp/frpc -c /usr/local/frp/frpc.ini

Mar 24 11:36:52 spider-host-001 systemd[1]: Starting frpc...
Mar 24 11:36:52 spider-host-001 frpc[3126]: Starting frpc client...
Mar 24 11:36:52 spider-host-001 systemd[1]: Started frpc.