Oct 03

SNI 分流后获取客户端 IP 一般通过 proxy_protocol 来实现,但分流后的某些程序不能识别 proxy_protocol 怎么办?比如我的 DoH 服务器要 IP 地址,但某木头马并不支持,我开启 proxy_protocol 这马就死了。

我们看代码片段,注意注释。

nginx.conf 主配置文件片段:

stream {
    # 这里就是 SNI 识别,将域名映射成一个配置名
    map $ssl_preread_server_name $backend_name {
        我的域名.坑 web;
        马.我的域名.坑 马;
        # 域名都不匹配情况下的默认值
        default web;
    }
    # 转发到 web 服务器
        upstream web {
        server 127.0.0.1:444;
    }
    # 转发到 马 前置服务器
        upstream 马 {
        server 127.0.0.1:446;
    }
    # 为 马 去除 proxy_protocol
    server {
        #nginx server 443 开启 proxy_protocol 后,分流后的所有服务也必须开启 proxy_protocol,否则会报错
        listen 127.0.0.1:446 proxy_protocol so_keepalive=on;
        proxy_protocol off; #然而,我们在这儿把 proxy_protocol 关闭掉,因为 马 不支持!这是关键
        proxy_connect_timeout 300s;
        proxy_timeout 300s;
        proxy_pass 127.0.0.1:445; #这就是 马 实际吃草的地方
    }

     # 监听 443 并开启 ssl_preread
     server {
         listen 443 reuseport;
         listen [::]:443 reuseport;
         proxy_pass $backend_name;
         ssl_preread on; #开启了分流
         proxy_protocol on; #开启了 proxy_protocol
    }
}

虚拟站点配置文件代码块,大致如下:

server
{
     #nginx server 443 开启 proxy_protocol 后,分流后的所有服务也必须开启 proxy_protocol,否则会报错
    listen 127.0.0.1:444 ssl http2 reuseport proxy_protocol;
    #下面三行给反代的 DoH 服务器传递了客户端 IP
    set_real_ip_from 127.0.0.1;
    real_ip_recursive on;
    real_ip_header proxy_protocol;

    server_name 三达不溜.我的域名.坑 我的域名.坑;
    index index.html index.htm index.php default.html default.htm default.php;
    root  /home/wwwroot/我的域名.坑;

    ssl_certificate /usr/local/nginx/conf/ssl/fullchain.cer;
    ssl_certificate_key /usr/local/nginx/conf/ssl/我的域名.坑_ssl.key;

    #反代 DoH 服务器
    location /dns-query {
        proxy_pass       http://127.0.0.1:8053/dns-query;
        proxy_set_header Host      $host;
        proxy_set_header X-Real-IP $remote_addr; #我要,真实的,IP!
    }

差不多这样。 :evil: :twisted: :cool:

来自 https://github.com/trojan-gfw/trojan/issues/433#issuecomment-692878138 的方法更加精妙:

stream {
    log_format basic '$remote_addr - $remote_user [$time_local] '
                     '$protocol $status $bytes_sent $bytes_received '
                     '$session_time';
    map $ssl_preread_server_name $backend {
        trojan6.domain.com unix:/run/nginx-trojan-stream.sock;
        trojan.domain.com unix:/run/nginx-trojan-stream.sock;
        default 127.0.0.1:443;
    }
    server {
        listen unix:/run/nginx-trojan-stream.sock proxy_protocol;
        proxy_pass 127.0.0.1:8443;
    }
    server {
        listen 0.0.0.0:443;
        listen [::]:443;
        proxy_pass $backend;
        ssl_preread on;
        proxy_protocol on;
    }
}

http {
    log_format combined '$proxy_protocol_addr - $remote_user [$time_local] '
                        '"$request" $status $body_bytes_sent '
                        '"$http_referer" "$http_user_agent"';
    server {
        listen 127.0.0.1:80 proxy_protocol;
        listen [::1]:443 ssl proxy_protocol;
        ...
    }
}

http 的 log_format 中,原来的将原来的 $remote_addr 替换成 $proxy_protocol_addr 就成了。

stream 中的第一个 server 就是为了接收带 proxy_protocol 的 stream,然后发出不带 proxy_protocol 的 stream 给 trojan。

另外,我用的是在 Ubuntu 20.04上 的 Nginx v.1.18.0,来自官方 apt 源的。


Oct 27

养台本本也许不那么容易,公司,家里,外出,不同的网络环境,不停的进出网络属性,修改 IP、DNS、网关等等,确定后,说不定还给你个重启的提示,费时费力。就是台式机,我也不想每次为了改设置而去回忆那么多IP地址,DNS服务器地址,还要一个个数字去输入。

今天介绍的三个免费软件:IPChange,IPSwitch 和 IPWiz 就可以帮你从这种困境解脱出来的。它们的基本功能都是让你保存多套网络设置,选一个应用马上就可以切换过去,更改网络设置而不用重启计算机,包括网关、掩码、DNS、Proxy和打印机的设置,非常好用,也都支持多网卡。当然界面和一些细节稍有不同,你可以择一而用。

软件的使用都非常简单,其中还有两款是中文界面,我就不详细介绍了,看看截图就好。

The player will show in this paragraph

三个软件都打包在一起了,总共不过600K大小。

11.27 新增一个 IPHelper 4.6 ,界面比较清新。

IPHelper 4.6 Screenshot

IPHelper 4.6 中文版 IPHelper 4.6 英文版

04.29 新增 Mobile Net Switch,收费软件,所以功能比较强大,附件带了注册机。

Mobile Net Switch

继续添加 3 款:NetSetMan ,(IBM) Access Connection 3.71 (已破解,适用于任意机型),NetSwitcher 。

NetSetMan:

独有的支持脚本设置,(BAT, VS, JS, 等等);

NetSetMan

IBM Access Connection

原 IBM 笔记本专用软件,现已破解,对无线网和 Vista 支持特别好。

破解:
在“运行”中输入“regedit”打开注册表编辑器
定位到“HKEY_LOCAL_MACHINE\SOFTWARE\IBM\QConnect”
双击右侧窗口中键值“TPCHK”
把数据值该为“0”

NetSwitcher:

最轻巧简洁的设置软件,通过记录和导入原系统网络设置参数来工作,所以兼容性很好。

04.30 补充一个命令行方式,适用于 Windows 2000,XP 以及 Vista。

备份当前网络参数:

netsh interface ip dump > d:\adsl.txt

恢复备份的参数到本机:

netsh exec d:\adsl.txt

这样只需设置好不同参数后备份为不同的文件,然后需要更改的时候恢复某文件即可。