你的位置:首页 > 互联网IT
gost,gost3,gost-v3,gost3配置文件教材,http代理,socks5代理,转发端口,shadowsocks代理,SS代理,负载均衡,中转服务,端口映射,gost3命令教材,探测防御
gost,gost3,gost-v3,gost3配置文件教材,http代理,socks5代理,转发端口,shadowsocks代理,SS代理,负载均衡,中转服务,端口映射,gost3命令教材,探测防御,PROXY Protocol,DNS代理,透明代理
系统:Windows/linux
软件:gost v3.0
功能:http代理,socks5代理,转发端口,shadowsocks代理,SS代理,负载均衡,中转服务,端口映射
项目地址:https://github.com/go-gost/gost
gost-v3-beta.6(使用很久,稳定版本)
本地下载1-Windows-32位:gost-windows-386-3.0.0-beta.6.zip
本地下载2-Windows-64位:gost-windows-amd64-3.0.0-beta.6.zip
本地下载3-linux-32位:gost-linux-386-3.0.0-beta.6.gz
本地下载4-linux-64位:gost-linux-amd64-3.0.0-beta.6.gz
gost-v3.0.0-rc8
本地下载5-Windows-32位:gost_3.0.0-rc8_windows_386.zip
本地下载6-Windows-64位:gost_3.0.0-rc8_windows_amd64.zip
本地下载7-linux-32位:gost_3.0.0-rc8_linux_386.tar.gz
本地下载8-linux-64位:gost_3.0.0-rc8_linux_amd64.tar.gz
项目地址下载地址:https://github.com/go-gost/gost/releases
本文内容:探测防御,PROXY Protocol,DNS代理,透明代理,多网络接口,TUN/TAP设备,ICMP通道,Unix Domain Socket重定向,串口重定向,监控指标,日志,Web API,动态配置
gost,gost3,gost-v3版本-配置文件文章
https://www.zhuguodong.com/?id=771
gost,gost3,gost-v3版本-命令文章
https://www.zhuguodong.com/?id=767
同类型gost-v2.0(gost2)版本
https://www.zhuguodong.com/?id=700
-----------------------------------------------------------
Windows隐藏运行软件,cmd隐藏运行,bat隐藏运行,命令窗口隐藏运行
https://www.zhuguodong.com/?id=520
linux隐藏运行软件
nohup /root/gost -L ss://aes-256-cfb:123456@:23333 >/dev/null 2>&1 &
nohup 《内容替换》 >/dev/null 2>&1 &
-----------------------------------------------------------
简单配置运行:
Windows:新建 gost.bat 文件
linux:命令窗口隐藏运行,gost要加入权限:chmod +x gost
启动参数:-c
Windows:start "" "gost.exe" -C gost.yaml
linux:gost -C gost.yaml
说明:.yaml配置文件不能有空行,或者不必要的空格,不然会运行不成功
启动参数:-c
Windows:start "" "gost.exe" -C gost.json
linux:gost -C gost.json
程序gost与文件同一目录下,说明:.json与.yaml配置文件格式(这个文件格式配置不能出现空格),教材就用.json格式演示
配置.json与.yaml格式可相互转换的
输出yaml格式配置
gost -L http://:8080 -O yaml
输出json格式配置
gost -L http://:8080 -O json
将json格式配置转成yaml格式
gost -C gost.json -O yaml
gost -C gost.yaml -O json
-----------------------------------------------------------
探测防御¶
GOST对HTTP/HTTPS/HTTP2代理提供了探测防御功能。当代理服务收到非法请求时,会按照探测防御策略返回对应的响应内容。
Note
只有当代理服务开启了用户认证,探测防御功能才有效。
命令行
gost -L=http://gost:gost@:8080?probeResistance=code:400&knock=www.example.com
配置文件
services:
- name: service-0
addr: :8080
handler:
type: http
auth:
username: gost
password: gost
metadata:
knock: www.example.com
probeResistance: code:404
listener:
type: tcp
probeResistance¶
代理服务通过probeResistance参数来指定防御策略。参数值的格式为:type:value。
type可选值有:
code - 对应value为HTTP响应码,代理服务器会回复客户端指定的响应码。例如:
gost -L=http://gost:gost@:8080?probeResistance=code:403
web - 对应的value为URL,代理服务器会使用HTTP GET方式访问此URL,并将响应返回给客户端。例如:
gost -L=http://gost:gost@:8080?probeResistance=web:example.com/page.html
host - 对应的value为主机地址,代理服务器会将客户端请求转发给设置的主机地址,并将主机的响应返回给客户端,代理服务器在这里相当于端口转发服务。例如:
gost -L=https://gost:gost@:443?probeResistance=host:www.example.com:8080
file - 对应的value为本地文件路径,代理服务器会回复客户端200响应码,并将指定的文件内容作为Body发送给客户端。例如:
gost -L=http2://gost:gost@:443?probeResistance=file:/send/to/client/file.txt
knock¶
开启了探测防御功能后,当认证失败时服务器默认不会响应407 Proxy Authentication Required,但某些情况下客户端需要服务器告知代理是否需要认证(例如Chrome中的SwitchyOmega插件)。通过knock参数设置一个私有地址,只有访问此地址时服务器才会发送407响应。
-----------------------------------------------------------
PROXY Protocol¶
GOST服务支持接收代理协议头(PROXY protocol v1/v2),当服务处于其他代理服务(例如Nginx)后面时,通过代理协议用于获取客户端真实IP。
命令行
gost -L=:8080?proxyProtocol=1
配置文件
services:
- name: service-0
addr: :8080
handler:
type: http
listener:
type: tcp
metadata:
proxyProtocol: 1
通过proxyProtocol选项开启接收代理协议功能。
Tip
代理协议功能开启后,并不强制客户端发送代理协议头,服务端会根据接收到的数据自动判断是否有代理协议数据。
示例¶
gost -L tcp://:8000/:8080 -L tcp://:8080/example.com:80?proxyProtocol=1
这里8000端口模拟一个反向代理服务,将数据转发给后面的8080服务。8080端口是一个端口转发服务。
curl -H"Host: example.com" http://192.168.100.100:8000
此时如果直接访问8000端口,8080端口的服务获取到的客户端IP为127.0.0.1。
{
"handler":"tcp",
"kind":"handler",
"level":"info",
"listener":"tcp",
"local":"127.0.0.1:8080",
"msg":"127.0.0.1:53574 <> 127.0.0.1:8080",
"remote":"127.0.0.1:53574",
"service":"service-1"
}
如果客户端发送代理协议头,8080端口服务就能获取到客户端的真是IP。
curl --haproxy-protocol -H"Host:example.com" http://192.168.100.100:8000
{
"handler":"tcp",
"kind":"handler",
"level":"info",
"listener":"tcp",
"local":"192.168.100.100:8080",
"msg":"192.168.100.100:57208 <> 192.168.100.100:8080",
"remote":"192.168.100.100:57208",
"service":"service-1"
}
-----------------------------------------------------------
DNS代理¶
与域名解析器类似,DNS代理服务支持多种协议类型,支持自定义域名解析(映射器),具有缓存功能,并支持转发链。
命令行
gost -L dns://:10053/1.1.1.1,tls://1.1.1.1:853?mode=udp
配置文件
services:
- name: service-0
addr: :10053
handler:
type: dns
# chain: chain-0
listener:
type: dns
metadata:
mode: udp
forwarder:
nodes:
- name: target-0
addr: 1.1.1.1
- name: target-1
addr: tls://1.1.1.1:853
mode (string, default=udp)
DNS代理模式
udp - UDP模式(DNS over UDP)
tcp - TCP模式(DNS over TCP)
tls - TLS模式(DNS over TLS)
https - HTTPS模式(DNS over HTTPS)
每个上级DNS服务的格式为:[protocol://]ip[:port]。
protocol支持的类型有udp,tcp,tls,https。默认值为udp。
port默认值为53。
例如:
udp://1.1.1.1:53,或udp://1.1.1.1
tcp://1.1.1.1:53
tls://1.1.1.1:853
https://1.0.0.1/dns-query
自定义域名解析¶
通过设置主机IP映射器,可以对域名进行自定义解析。
命令行
gost -L dns://:10053/1.1.1.1?hosts=example.org:127.0.0.1,example.org:::1,example.com:2001:db8::1
配置文件
services:
- name: service-0
addr: :10053
hosts: hosts-0
handler:
type: dns
listener:
type: dns
metadata:
mode: udp
forwarder:
nodes:
- name: target-0
addr: 1.1.1.1
hosts:
- name: hosts-0
mappings:
- ip: 127.0.0.1
hostname: example.org
- ip: ::1
hostname: example.org
- ip: 2001:db8::1
hostname: example.com
此时解析example.org会匹配到映射器而不会使用1.1.1.1查询。
DNS查询example.org(ipv4)
dig -p 10053 example.org
;; QUESTION SECTION:
;example.org. IN A
;; ANSWER SECTION:
example.org. 3600 IN A 127.0.0.1
DNS查询example.org(ipv6)
dig -p 10053 AAAA example.org
;; QUESTION SECTION:
;example.org. IN AAAA
;; ANSWER SECTION:
example.org. 3600 IN AAAA ::1
解析example.com时,由于ipv4在映射器中无对应项,因此会使用1.1.1.1进行解析。
DNS查询example.com(ipv4)
dig -p 10053 example.com
;; QUESTION SECTION:
;example.com. IN A
;; ANSWER SECTION:
example.com. 10610 IN A 93.184.216.34
DNS查询example.com(ipv6)
dig -p 10053 AAAA example.com
;; QUESTION SECTION:
;example.com. IN AAAA
;; ANSWER SECTION:
example.com. 3600 IN AAAA 2001:db8::1
分流¶
通过在DNS代理服务上和转发器的节点上设置分流器可以实现对DNS查询的分流。
服务上的分流器¶
当DNS代理服务本身设置了分流器,如果DNS查询的域名未通过分流器规则测试(未匹配白名单规则或匹配黑名单规则),则DNS代理服务返回空结果。
命令行
gost -L dns://:10053/1.1.1.1?bypass=example.com
配置文件
services:
- name: service-0
addr: :10053
bypass: bypass-0
handler:
type: dns
listener:
type: dns
forwarder:
nodes:
- name: target-0
addr: 1.1.1.1
bypasses:
- name: bypass-0
matchers:
- example.com
当查询example.com时,未通过服务上的分流器bypass-0,查询将返回空结果。
DNS查询example.com(ipv4)
dig -p 10053 example.com
;; QUESTION SECTION:
;example.com. IN A
当查询example.org时,通过服务上的分流器bypass-0,查询将正常返回结果。
DNS查询example.org(ipv4)
dig -p 10053 example.org
;; QUESTION SECTION:
;example.org. IN A
;; ANSWER SECTION:
example.org. 74244 IN A 93.184.216.34
目标节点上的分流器¶
类似于转发链节点上的分流器,DNS代理服务的转发器节点上也可以通过设置转发器来实现精细化分流。
配置文件
services:
- name: service-0
addr: :10053
handler:
type: dns
listener:
type: dns
forwarder:
nodes:
- name: target-0
addr: 1.1.1.1
bypass: bypass-0
- name: target-1
addr: 8.8.8.8
bypass: bypass-1
bypasses:
- name: bypass-0
matchers:
- example.org
- name: bypass-1
matchers:
- example.com
当查询example.org时,未通过目标节点target-0上的分流器bypass-0,通过了目标节点target-1的分流器bypass-1,查询将转发给节点target-1进行处理。
当查询example.com时,通过目标节点target-0上的分流器bypass-0,未通过目标节点target-1的分流器bypass-1,查询将转发给节点target-0进行处理。
缓存¶
通过ttl选项可以设置缓存时长,默认使用DNS查询返回结果中的TTL,当设置为负值则不使用缓存。
命令行
gost -L dns://:10053/1.1.1.1?ttl=60s
配置文件
services:
- name: service-0
addr: :10053
handler:
type: dns
metadata:
ttl: 60s
listener:
type: dns
forwarder:
nodes:
- name: target-0
addr: 1.1.1.1
异步查询¶
通过async选项设置对上级DNS服务的查询请求为异步,此时当缓存失效后仍旧返回客户端缓存中的结果,同时再向上级DNS代理服务异步发送查询请求并更新缓存。
命令行
gost -L dns://:10053/1.1.1.1?async=true
配置文件
services:
- name: service-0
addr: :10053
handler:
type: dns
metadata:
async: true
listener:
type: dns
forwarder:
nodes:
- name: target-0
addr: 1.1.1.1
ECS¶
通过clientIP选项设置客户端IP,开启ECS(EDNS Client Subnet)扩展功能。
命令行
gost -L dns://:10053/1.1.1.1?clientIP=1.2.3.4
配置文件
services:
- name: service-0
addr: :10053
handler:
type: dns
metadata:
clientIP: 1.2.3.4
listener:
type: dns
forwarder:
nodes:
- name: target-0
addr: 1.1.1.1
-----------------------------------------------------------
透明代理¶
透明代理支持REDIRECT和TPROXY两种方式,REDIRECT方式仅支持TCP。
系统限制
透明代理仅支持Linux系统。
流量嗅探
TCP透明代理支持对HTTP和TLS流量进行识别,识别后将使用HTTPHost头部信息或TLS的SNI扩展信息作为目标访问地址。
通过sniffing参数开启流量嗅探,默认不开启。
REDIRECT¶
采用REDIRECT方式的透明代理可以选择给数据包打标记(Mark)。使用Mark需要管理员权限运行。
不使用Mark¶
命令行
gost -L red://:12345?sniffing=true -F 192.168.1.1:1080
配置文件
services:
- name: service-0
addr: :12345
handler:
type: red
chain: chain-0
metadata:
sniffing: true
listener:
type: red
chains:
- name: chain-0
hops:
- name: hop-0
nodes:
- name: node-0
addr: 192.168.1.1:1080
connector:
type: http
dialer:
type: tcp
iptables-本地全局TCP代理
iptables -t nat -A OUTPUT -p tcp --match multiport ! --dports 12345,1080 -j DNAT --to-destination 127.0.0.1:12345
使用Mark¶
使用Mark可以避免出口流量被二次拦截造成死循环。
命令行
gost -L "red://:12345?sniffing=true&so_mark=100"
配置文件
services:
- name: service-0
addr: :12345
sockopts:
mark: 100
handler:
type: red
metadata:
sniffing: true
listener:
type: red
使用转发链¶
命令行
gost -L red://:12345?sniffing=true -F "http://192.168.1.1:1080?so_mark=100"
配置文件
services:
- name: service-0
addr: :12345
handler:
type: red
chain: chain-0
metadata:
sniffing: true
listener:
type: red
chains:
- name: chain-0
hops:
- name: hop-0
sockopts:
mark: 100
nodes:
- name: node-0
addr: 192.168.1.1:1080
# node level sockopts, will override hop level value.
# sockopts:
# mark: 100
connector:
type: http
dialer:
type: tcp
通过so_mark(命令行)或sockopts(配置文件)参数来设置mark值。
iptables规则
iptables -t nat -N GOST
# 忽略局域网流量,请根据实际网络环境进行调整
iptables -t nat -A GOST -d 192.168.0.0/16 -j RETURN
# 忽略出口流量
iptables -t nat -A GOST -p tcp -m mark --mark 100 -j RETURN
# 重定向TCP流量到12345端口
iptables -t nat -A GOST -p tcp -j REDIRECT --to-ports 12345
# 拦截局域网流量
iptables -t nat -A PREROUTING -p tcp -j GOST
# 拦截本机流量
iptables -t nat -A OUTPUT -p tcp -j GOST
TPROXY¶
TCP¶
命令行
gost -L "red://:12345?sniffing=true&tproxy=true&so_mark=100"
配置文件
services:
- name: service-0
addr: :12345
sockopts:
mark: 100
handler:
type: red
metadata:
sniffing: true
tproxy: true
listener:
type: red
metadata:
tproxy: true
使用转发链¶
命令行
gost -L "red://:12345?sniffing=true&tproxy=true" -F http://192.168.1.1:8080?so_mark=100
配置文件
services:
- name: service-0
addr: :12345
handler:
type: red
chain: chain-0
metadata:
sniffing: true
tproxy: true
listener:
type: red
metadata:
tproxy: true
chains:
- name: chain-0
hops:
- name: hop-0
sockopts:
mark: 100
nodes:
- name: node-0
addr: 192.168.1.1:8080
connector:
type: http
dialer:
type: tcp
routing和iptables规则
ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100
iptables -t mangle -N DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 1
iptables -t mangle -A DIVERT -j ACCEPT
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -N GOST
iptables -t mangle -A GOST -p tcp -d 127.0.0.0/8 -j RETURN
iptables -t mangle -A GOST -p tcp -d 192.168.0.0/16 -j RETURN
iptables -t mangle -A GOST -p tcp -m mark --mark 100 -j RETURN
iptables -t mangle -A GOST -p tcp -j TPROXY --tproxy-mark 0x1/0x1 --on-ip 127.0.0.1 --on-port 12345
iptables -t mangle -A PREROUTING -p tcp -j GOST
iptables -t mangle -N GOST_LOCAL
iptables -t mangle -A GOST_LOCAL -p tcp -d 127.0.0.0/8 -j RETURN
iptables -t mangle -A GOST_LOCAL -p tcp -d 255.255.255.255/32 -j RETURN
iptables -t mangle -A GOST_LOCAL -p tcp -d 192.168.0.0/16 -j RETURN
iptables -t mangle -A GOST_LOCAL -p tcp -m mark --mark 100 -j RETURN
iptables -t mangle -A GOST_LOCAL -p tcp -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -p tcp -j GOST_LOCAL
UDP¶
命令行
gost -L "redu://:12345?ttl=30s&so_mark=100"
配置文件
services:
- name: service-0
addr: :12345
sockopts:
mark: 100
handler:
type: redu
listener:
type: redu
metadata:
ttl: 30s
使用转发链¶
命令行
gost -L redu://:12345?ttl=30s -F relay://192.168.1.1:8421?so_mark=100
配置文件
services:
- name: service-0
addr: :12345
handler:
type: redu
chain: chain-0
listener:
type: redu
metadata:
ttl: 30s
chains:
- name: chain-0
hops:
- name: hop-0
sockopts:
mark: 100
nodes:
- name: node-0
addr: 192.168.1.1:8421
connector:
type: relay
dialer:
type: tcp
ttl (duration, default=30s)
传输通道超时时长。
routing和iptables规则
ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100
iptables -t mangle -N GOST
iptables -t mangle -A GOST -p udp -d 127.0.0.0/8 -j RETURN
iptables -t mangle -A GOST -p udp -d 255.255.255.255/32 -j RETURN
iptables -t mangle -A GOST -p udp -d 192.168.0.0/16 -j RETURN
iptables -t mangle -A GOST -p udp -m mark --mark 100 -j RETURN
iptables -t mangle -A GOST -p udp -j TPROXY --tproxy-mark 0x1/0x1 --on-ip 127.0.0.1 --on-port 12345
iptables -t mangle -A PREROUTING -p udp -j GOST
iptables -t mangle -N GOST_LOCAL
iptables -t mangle -A GOST_LOCAL -p udp -d 127.0.0.0/8 -j RETURN
iptables -t mangle -A GOST_LOCAL -p udp -d 255.255.255.255/32 -j RETURN
iptables -t mangle -A GOST_LOCAL -p udp -d 192.168.0.0/16 -j RETURN
iptables -t mangle -A GOST_LOCAL -p udp -m mark --mark 100 -j RETURN
iptables -t mangle -A GOST_LOCAL -p udp -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -p udp -j GOST_LOCAL
-----------------------------------------------------------
多网络接口¶
当主机具有多个网络接口(Multi-homed host)时,可以根据需要对不同服务的路由指定不同的网络出口。
系统限制
多网络接口配置仅支持Linux系统。
interface选项¶
通过interface选项来指定所使用的网络出口。interface选项的值可以是网络接口名(例如eth0),也可以是网络接口的IP地址(IPv4或IPv6),或,分割的IP地址列表。
命令行
gost -L :8080?interface=eth0
配置文件
services:
- name: service-0
addr: ":8080"
metadata:
interface: eth0
# or use IP address
# interface: 192.168.0.123
# or IP address list
# interface: fd::1,192.168.0.123
handler:
type: auto
listener:
type: tcp
严格模式
当指定接口列表时,可以在每一项后面添加!来标记为严格模式, 例如interface=192.168.0.100,192.168.0.101!,192.168.0.102,如果通过192.168.0.101建立连接失败则不会继续尝试192.168.0.102。
转发链¶
如果使用了转发链,则需要在转发链的第一层级跳跃点上或其中的节点上设置网络出口。 如果节点上未设置interface参数,则使用跳跃点上的参数。 命令行中的interface参数对应于跳跃点上的参数。
命令行
gost -L :8080 -F :8000?interface=192.168.0.1
配置文件
services:
- name: service-0
addr: ":8080"
handler:
type: auto
chain: chain-0
listener:
type: tcp
chains:
- name: chain-0
hops:
- name: hop-0
# hop level interface
interface: 192.168.0.1
nodes:
- name: node-0
addr: :8000
# node level interface
interface: eth0
connector:
type: http
dialer:
type: tcp
- name: node-1
addr: :8001
# node level interface
interface: eth1
connector:
type: http
dialer:
type: tcp
直连模式¶
如果不使用上级代理,则可以通过虚拟节点让服务使用多网口进行负载均衡。
配置文件
services:
- name: service-0
addr: ":8080"
handler:
type: auto
chain: chain-0
listener:
type: tcp
chains:
- name: chain-0
hops:
- name: hop-0
nodes:
- name: node-0
addr: :0
interface: eth0
connector:
type: virtual
dialer:
type: virtual
- name: node-1
addr: :0
interface: eth1
connector:
type: virtual
dialer:
type: virtual
-----------------------------------------------------------
TUN/TAP设备¶
TUN¶
TUN的实现依赖于wireguard-go。
Windows系统
Windows需要下载wintun。
关于TUN设备更详细的使用示例可以参考这篇博文。
使用说明¶
gost -L="tun://[local_ip]:port[/remote_ip:port]?net=192.168.123.2/24&name=tun0&mtu=1350&route=10.100.0.0/16&gw=192.168.123.1"
local_ip:port (string, required)
本地监听的UDP隧道地址。
remote_ip:port (string)
目标UDP地址。本地TUN设备收到的IP包会通过UDP转发到此地址。
net (string, required)
指定TUN设备的地址(net=192.168.123.1/24),也可以是逗号(,)分割的多地址(net=192.168.123.1/24,fd::1/64)。
name (string)
指定TUN设备的名字,默认值为系统预设。
mtu (int, default=1350)
设置TUN设备的MTU值。
gw (string)
设置TUN设备路由默认网关IP。
route (string)
逗号分割的路由列表,例如:10.100.0.0/16,172.20.1.0/24,1.2.3.4/32
routes (list)
特定网关路由列表,列表每一项为空格分割的CIDR地址和网关,例如:10.100.0.0/16 192.168.123.2
peer (string)
对端IP地址,仅MacOS系统有效
bufferSize (int)
数据读缓存区大小,默认1500字节
keepAlive (bool)
开启心跳,仅客户端有效
ttl (duration)
心跳间隔时长,默认10s
passphrase (string)
客户端认证码,最多16个字符,仅客户端有效
使用示例¶
服务端¶
命令行
gost -L=tun://:8421?net=192.168.123.1/24
配置文件
services:
- name: service-0
addr: :8421
handler:
type: tun
metadata:
bufferSize: 1500
listener:
type: tun
metadata:
name: tun0
net: 192.168.123.1/24
mtu: 1350
客户端¶
命令行(Linux/Windows)
gost -L=tun://:0/SERVER_IP:8421?net=192.168.123.2/24/64
命令行(MacOS)
gost -L="tun://:0/SERVER_IP:8421?net=192.168.123.2/24&peer=192.168.123.1"
配置文件
services:
- name: service-0
addr: :0
handler:
type: tun
metadata:
bufferSize: 1500
keepAlive: true
ttl: 10s
listener:
type: tun
metadata:
net: 192.168.123.2/24
# peer: 192.168.123.1 # MacOS only
forwarder:
nodes:
- name: target-0
addr: SERVER_IP:8421
服务端路由¶
服务端可以通过设置路由表和网关,来访问客户端所在的网络。
默认网关¶
服务端可以通过gw参数设置默认网关,来指定route参数的路由路径。
命令行
gost -L="tun://:8421?net=192.168.123.1/24&gw=192.168.123.2&route=172.10.0.0/16,10.138.0.0/16"
配置文件
services:
- name: service-0
addr: :8421
handler:
type: tun
listener:
type: tun
metadata:
net: 192.168.123.1/24
gw: 192.168.123.2
route: 172.10.0.0/16,10.138.0.0/16
发往172.10.0.0/16和10.138.0.0/16网络的数据会通过TUN隧道转发给IP为192.168.123.2的客户端。
特定网关路由¶
如果要针对每个路由设置特定的网关,可以通过routes参数来指定。
配置文件
services:
- name: service-0
addr: :8421
handler:
type: tun
listener:
type: tun
metadata:
net: 192.168.123.1/24
routes:
- 72.10.0.0/16 192.168.123.2
- 10.138.0.0/16 192.168.123.3
发往172.10.0.0/16网络的数据会通过TUN隧道转发给IP为192.168.123.2的客户端。发往10.138.0.0/16网络的数据会通过TUN隧道转发给IP为192.168.123.3的客户端。
认证¶
服务端可以使用认证器来对客户端进行认证。
服务端¶
services:
- name: service-0
addr: :8421
handler:
type: tun
auther: tun
listener:
type: tun
metadata:
net: 192.168.123.1/24
authers:
- name: tun
auths:
- username: 192.168.123.2
password: userpass1
- username: 192.168.123.3
password: userpass2
认证器的用户名为给客户端分配的IP。
客户端¶
命令行
gost -L "tun://:0/SERVER_IP:8421?net=192.168.123.2/24&passphrase=userpass1"
配置文件
services:
- name: service-0
addr: :8421
handler:
type: tun
metadata:
bufferSize: 1500
keepAlive: true
ttl: 10s
passphrase: "userpass1"
listener:
type: tun
metadata:
net: 192.168.123.2/24
forwarder:
nodes:
- name: target-0
addr: SERVER_IP:8421
客户端通过passphrase选项指定认证码。
认证与心跳
当使用认证时,建议客户端开启心跳,认证信息会在心跳包中一起发送给服务端。当服务端重启后,心跳包会让连接恢复。
认证码长度限制
认证码最长支持16个字符,当客户端超过此长度限制时只会使用前16个字符。
多IP与认证
如果客户端通过net参数指定了多个网络,例如net=192.168.123.2/24,fd::2/64,当服务端开启认证后,客户端的所有IP均通过认证(使用相同的passphrase)才认为是认证通过。
安全传输
TUN隧道的数据均为明文传输,包括认证信息。可以使用转发链利用加密隧道来使数据传输更安全。
构建基于TUN设备的VPN (Linux)¶
Tip
net所指定的地址可能需要根据实际情况进行调整。
创建TUN设备并建立UDP隧道¶
服务端¶
命令行
gost -L=tun://:8421?net=192.168.123.1/24
配置文件
services:
- name: service-0
addr: :8421
handler:
type: tun
listener:
type: tun
metadata:
net: 192.168.123.1/24
客户端¶
命令行
gost -L=tun://:0/SERVER_IP:8421?net=192.168.123.2/24
配置文件
services:
- name: service-0
addr: :8421
handler:
type: tun
listener:
type: tun
metadata:
net: 192.168.123.1/24
forwarder:
nodes:
- name: target-0
addr: SERVER_IP:8421
当以上命令运行正常后,可以通过ip addr命令来查看创建的TUN设备:
$ ip addr show tun0
2: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1350 qdisc pfifo_fast state UNKNOWN group default qlen 500
link/none
inet 192.168.123.2/24 scope global tun0
valid_lft forever preferred_lft forever
inet6 fe80::d521:ad59:87d0:53e4/64 scope link flags 800
valid_lft forever preferred_lft forever
可以通过在客户端执行ping命令来测试一下隧道是否连通:
$ ping 192.168.123.1
64 bytes from 192.168.123.1: icmp_seq=1 ttl=64 time=9.12 ms
64 bytes from 192.168.123.1: icmp_seq=2 ttl=64 time=10.3 ms
64 bytes from 192.168.123.1: icmp_seq=3 ttl=64 time=7.18 ms
如果能ping通,说明隧道已经成功建立。
iperf3测试¶
服务端¶
$ iperf3 -s
客户端¶
$ iperf3 -c 192.168.123.1
路由规则和防火墙设置¶
如果想让客户端访问到服务端的网络,还需要根据需求设置相应的路由和防火墙规则。例如可以将客户端的所有外网流量转发给服务端处理
服务端¶
开启IP转发并设置防火墙规则
$ sysctl -w net.ipv4.ip_forward=1
$ iptables -t nat -A POSTROUTING -s 192.168.123.0/24 ! -o tun0 -j MASQUERADE
$ iptables -A FORWARD -i tun0 ! -o tun0 -j ACCEPT
$ iptables -A FORWARD -o tun0 -j ACCEPT
客户端¶
设置路由规则
谨慎操作
以下操作会更改客户端的网络环境,除非你知道自己在做什么,请谨慎操作!
$ ip route add SERVER_IP/32 dev eth0 # 请根据实际情况替换SERVER_IP和eth0
$ ip route del default # 删除默认的路由
$ ip route add default via 192.168.123.2 # 使用新的默认路由
TAP¶
TAP的实现依赖于songgao/water库。
Windows系统
Windows下需要安装tap驱动后才能使用,可以选择安装OpenVPN/tap-windows6或OpenVPN client,也可以直接从这里下载安装包。
注意
TAP目前不支持MacOS。
使用说明¶
gost -L="tap://[local_ip]:port[/remote_ip:port]?net=192.168.123.2/24&name=tap0&mtu=1350&route=10.100.0.0/16&gw=192.168.123.1"
local_ip:port (string, required)
本地监听的UDP隧道地址。
remote_ip:port (string)
目标UDP地址。本地TAP设备收到的数据会通过UDP转发到此地址。
net (string)
指定TAP设备的地址。
name (string)
指定TAP设备的名字,默认值为系统预设。
mtu (int, default=1350)
设置TAP设备的MTU值。
gw (string)
设置TAP设备路由默认网关IP。
route (string)
逗号分割的路由列表,例如:10.100.0.0/16,172.20.1.0/24,1.2.3.4/32
routes (list)
特定网关路由列表,列表每一项为空格分割的CIDR地址和网关,例如:10.100.0.0/16 192.168.123.2
bufferSize (int)
数据读缓存区大小,默认1500字节
使用示例¶
服务端¶
命令行
gost -L=tap://:8421?net=192.168.123.1/24
配置文件
services:
- name: service-0
addr: :8421
handler:
type: tap
metadata:
bufferSize: 1500
listener:
type: tap
metadata:
name: tap0
net: 192.168.123.1/24
mtu: 1350
客户端¶
命令行
gost -L=tap://:0/SERVER_IP:8421?net=192.168.123.2/24
配置文件
services:
- name: service-0
addr: :0
handler:
type: tap
metadata:
bufferSize: 1500
listener:
type: tap
metadata:
net: 192.168.123.2/24
forwarder:
nodes:
- name: target-0
addr: SERVER_IP:8421
基于TCP的TUN/TAP隧道¶
GOST中的TUN/TAP隧道默认是基于UDP协议进行数据传输。
如果想使用TCP传输,可以选择采用以下几种方式:
转发链¶
可以通过使用转发链进行转发,用法与UDP本地端口转发类似。
此方式比较灵活通用,推荐使用。
服务端¶
命令行
gost -L=tun://:8421?net=192.168.123.1/24 -L relay+wss://:8443?bind=true
配置文件
services:
- name: service-0
addr: :8421
handler:
type: tun
listener:
type: tun
metadata:
net: 192.168.123.1/24
- name: service-1
addr: :8443
handler:
type: relay
metadata:
bind: true
listener:
type: wss
客户端¶
命令行
gost -L=tun://:0/:8421?net=192.168.123.2/24 -F relay+wss://SERVER_IP:8443
配置文件
services:
- name: service-0
addr: :8421
handler:
type: tun
chain: chain-0
listener:
type: tun
metadata:
net: 192.168.123.2/24
forwarder:
nodes:
- name: target-0
addr: :8421
chains:
- name: chain-0
hops:
- name: hop-0
nodes:
- name: node-0
addr: SERVER_IP:8443
connector:
type: relay
dialer:
type: wss
第三方转发工具¶
udp2raw-tunnel。
-----------------------------------------------------------
GO Simple Tunnel
GO语言实现的安全隧道
功能特性
多端口监听
多级转发链
多协议支持
TCP/UDP端口转发
TCP/UDP透明代理
DNS解析和代理
TUN/TAP设备
反向代理
负载均衡
路由控制
限速限流
准入控制
动态配置
插件系统
Prometheus监控指标
Web API
Web UI
Telegram讨论群:https://t.me/gogost
Google讨论组:https://groups.google.com/d/forum/go-gost
提交Issue:https://github.com/go-gost/gost/issues
旧版入口:v2.gost.run
下载安装
二进制文件
https://github.com/go-gost/gost/releases
源码编译
git clone https://github.com/go-gost/gost.git
cd gost/cmd/gost
go build
Docker
docker run --rm gogost/gost -V
Shadowsocks Android插件
xausky/ShadowsocksGostPlugin
https://github.com/xausky/ShadowsocksGostPlugin
发表评论: