apernet / hysteria

Hysteria is a powerful, lightning fast and censorship resistant proxy.
https://v2.hysteria.network/
MIT License
14.97k stars 1.67k forks source link

使用ss-tproxy 搭建透明代理 , 无法使用tproxy_udp, 仅代理 TCP流量无问题 #228

Closed xtccc closed 2 years ago

xtccc commented 2 years ago

使用 ss-tproxy 搭建透明代理 , 无法使用tproxy_udp, 仅代理 TCP流量无问题

# hysteria client.json
{
  "server": "vps_ip:36712",
    "server_name": "vps_domain",
    "auth_str": "48134f9b1337c7998e833cdc9ce2a7c4",
  "up_mbps": 100,
    "down_mbps": 500,
    "protocol": "udp",
    "retry": -1,
    "retry_interval": 5,
    "recv_window_conn": 15728640,
    "recv_window": 67108864,
    "resolver": "1.1.1.1:53",
  "socks5": {
    "listen": "127.0.0.1:1088"
  },
  "http": {
    "listen": "0.0.0.0:8088"
  },
  "tproxy_tcp": {
    "listen": ":60080", 
    "timeout": 300
  },
    "tproxy_udp": {
    "listen": ":60080", 
    "timeout": 300
  }

}

使用hysteria tcponly 为true 时,可以使用透明代理上网, 使用hysteria tcponly 为false 时,不可以使用透明代理上网, 使用xray 在 tcponly 为false 时,仍可以使用透明代理上网, 判断是hysteria 的tproxy_udp 的问题

# /etc/ss-tproxy/ss-tproxy.conf
## mode
#mode='global'  # global 模式 (不分流)
#mode='gfwlist' # gfwlist 模式 (黑名单)
mode='chnroute' # chnroute 模式 (白名单)

## ipv4/6
ipv4='true'     # true:启用ipv4透明代理; false:关闭ipv4透明代理
ipv6='false'    # true:启用ipv6透明代理; false:关闭ipv6透明代理

## tproxy
tproxy='true'  # true:TPROXY+TPROXY; false:REDIRECT+TPROXY

## tcponly
tcponly='true' # true:仅代理TCP流量; false:代理TCP和UDP流量

## selfonly
selfonly='false' # true:仅代理本机流量; false:代理本机及"内网"流量

## proxy
# user/group(#1,推荐) vs svraddr+port(#2), user/group选其中一个填写(允许同时填写)
proxy_procuser=''        # 本机代理进程的 user/uid,用来放行本机代理进程传出的流量
proxy_procgroup='23333'       # 本机代理进程的 group/gid,用来放行本机代理进程传出的流量
proxy_svraddr4=() # 服务器的 IPv4 地址或域名,允许填写多个服务器地址,空格隔开
proxy_svraddr6=()        # 服务器的 IPv6 地址或域名,允许填写多个服务器地址,空格隔开
proxy_svrport='0'   # 服务器的监听端口,可填多个端口,格式同 ipts_proxy_dst_port
proxy_tcpport='60080'    # ss/ssr/v2ray 等本机进程的 TCP 监听端口,该端口支持透明代理
proxy_udpport='60080'    # ss/ssr/v2ray 等本机进程的 UDP 监听端口,该端口支持透明代理
proxy_startcmd='sudo systemctl start hysteria ; sleep 3s'     # 用于启动本机代理进程的 shell 命令,该命令应该能立即执行完毕
proxy_stopcmd='sudo systemctl stop  hysteria'      # 用于关闭本机代理进程的 shell 命令,该命令应该能立即执行完毕
#proxy_startcmd='sudo systemctl start  xray'     # 用于启动本机代理进程的 shell 命令,该命令应该能立即执行完毕
#proxy_stopcmd='sudo systemctl stop  xray'      # 用于关闭本机代理进程的 shell 命令,该命令应该能立即执行完毕

## dns
dns_direct='114.114.115.115'          # 本地 IPv4 DNS,不能指定端口,也可以填组织、公司内部 DNS
#dns_direct6='240C::6666'              # 本地 IPv6 DNS,不能指定端口,也可以填组织、公司内部 DNS
dns_remote='1.1.1.1#53'               # 远程 IPv4 DNS,必须指定端口,提示:访问远程 DNS 会走代理
#dns_remote6='2606:4700:4700::1111#53' # 远程 IPv6 DNS,必须指定端口,提示:访问远程 DNS 会走代理

## dnsmasq
dnsmasq_bind_port='53'                  # dnsmasq 服务器监听端口,见 README
dnsmasq_cache_size='4096'               # DNS 缓存大小,大小为 0 表示禁用缓存
dnsmasq_cache_time='3600'               # DNS 缓存时间,单位是秒,最大 3600 秒
dnsmasq_query_maxcnt='1024'             # 设置并发 DNS 查询的最大数量,默认为 150
dnsmasq_log_enable='false'              # 记录详细日志,除非进行调试,否则不建议启用
dnsmasq_log_file='/var/log/dnsmasq.log' # 日志文件,如果不想保存日志可以改为 /dev/null
dnsmasq_conf_dir=()                     # `--conf-dir` 选项的参数,可以填多个,空格隔开
dnsmasq_conf_file=()                    # `--conf-file` 选项的参数,可以填多个,空格隔开
dnsmasq_conf_string=()                  # 自定义配置,一个数组元素就是一行配置,空格隔开

## chinadns
chinadns_bind_port='65353'               # chinadns-ng 服务器监听端口,通常不用改动
chinadns_timeout='5'                     # 等待上游 DNS 返回响应的超时时间,单位为秒
chinadns_repeat='1'                      # 向可信 DNS 发送几次 DNS 查询请求,默认为 1
chinadns_fairmode='false'                # 使用公平模式,具体看 chinadns-ng 的 README
chinadns_gfwlist_mode='false'            # gfwlist 模式,加载 gfwlist.txt/gfwlist.ext
chinadns_noip_as_chnip='false'           # 启用 chinadns-ng 的 `--noip-as-chnip` 选项
chinadns_verbose='false'                 # 记录详细日志,除非进行调试,否则不建议启用
chinadns_logfile='/var/log/chinadns.log' # 日志文件,如果不想保存日志可以改为 /dev/null
chinadns_privaddr4=()                    # IPv4 私有地址段,多个用空格隔开,具体见 README
chinadns_privaddr6=()                    # IPv6 私有地址段,多个用空格隔开,具体见 README

## dns2tcp
dns2tcp_bind_port='65454'               # dns2tcp 转发服务器监听端口,如有冲突请修改
dns2tcp_tcp_syncnt=''                   # dns2tcp 的 `-s` 选项,留空表示不设置此选项
dns2tcp_tcp_quickack='false'            # dns2tcp 的 `-a` 选项,选项取值为true/false
dns2tcp_tcp_fastopen='false'            # dns2tcp 的 `-f` 选项,选项取值为true/false
dns2tcp_verbose='false'                 # 记录详细日志,除非进行调试,否则不建议启用
dns2tcp_logfile='/var/log/dns2tcp.log'  # 日志文件,如果不想保存日志可以改为 /dev/null

## ipts
ipts_if_lo='lo'                 # 环回接口的名称,在标准发行版中,通常为 lo,如果不是请修改
ipts_rt_tab='233'               # iproute2 路由表名或表 ID,除非产生冲突,否则不建议改动该选项
ipts_rt_mark='0x2333'           # iproute2 策略路由的防火墙标记,除非产生冲突,否则不建议改动该选项
ipts_set_snat='false'           # 设置 iptables 的 MASQUERADE 规则,布尔值,`true/false`,详见 README
ipts_set_snat6='false'          # 设置 ip6tables 的 MASQUERADE 规则,布尔值,`true/false`,详见 README
ipts_reddns_onstop='true'       # ss-tproxy stop 后,是否将其它主机发至本机的 DNS 重定向至直连 DNS,详见 README
ipts_proxy_dst_port='1:65535'   # 黑名单 IP 的哪些端口走代理,多个用逗号隔开,冒号为端口范围(含边界),详见 README

## opts
opts_ss_netstat='auto'                  # auto/ss/netstat,用哪个端口检测工具,见 README
opts_ping_cmd_to_use='auto'             # auto/standalone/parameter,ping 相关,见 README
opts_hostname_resolver='auto'           # auto/dig/getent/ping,用哪个解析工具,见 README
opts_overwrite_resolv='false'           # true/false/留空,如何操作 resolv.conf,见 README
opts_ip_for_check_net='114.114.114.114' # 检测外网是否可访问的 IP,ping,留空表示跳过此检查

## file
file_gfwlist_txt='/etc/ss-tproxy/gfwlist.txt'      # gfwlist/chnlist 模式预置文件
file_gfwlist_ext='/etc/ss-tproxy/gfwlist.ext'      # gfwlist/chnlist 模式扩展文件
file_ignlist_ext='/etc/ss-tproxy/ignlist.ext'      # global/chnroute 模式扩展文件
file_chnroute_set='/etc/ss-tproxy/chnroute.set'    # chnroute 地址段文件 (iptables)
file_chnroute6_set='/etc/ss-tproxy/chnroute6.set'  # chnroute6 地址段文件 (ip6tables)
file_dnsserver_pid='/etc/ss-tproxy/.dnsserver.pid' # dns 服务器进程的 pid 文件 (shell)
AmberisMyShiba commented 2 years ago

thanks for @tobyxdd ‘s time to pay attention to this issue.I am a ss-tproxy user,and encounted the same issue recently. It seems like dns query in udp protocol can't transport by tproxy mode,but in socks5 mode udp dns query is OK.