你的位置:首页 > 互联网IT

gost,gost3,gost-v3,gost3配置文件教材,http代理,socks5代理,转发端口,shadowsocks代理,SS代理,负载均衡,中转服务,端口映射,gost3命令教材,探测防御,PROXY Protocol,DNS代理,透明代理

系统:Windows/linux

软件:gost v3.0

功能:http代理,socks5代理,转发端口,shadowsocks代理,SS代理,负载均衡,中转服务,端口映射

官网:https://gost.run/

项目地址: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,gost3,gost-v3,gost3配置文件教材,http代理,socks5代理,转发端口,shadowsocks代理,SS代理,负载均衡,中转服务,端口映射,gost3命令教材,探测防御 互联网IT

-----------------------------------------------------------


探测防御¶


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



  • 发表评论
  • 查看评论
【暂无评论!】

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。