cybmp3 发表于 2021-5-3 21:18:33

共用443解决方案(非proxy_protocol,web和trojan都可以拿到真实ip)

nginx作为tcp7层代理的时候并不是直接转发流量而是建立一个新的连接,而某些软件对7层的协议支持并不完整比如proxy_protocol 协议,导致显示的IP来源都是127.0.0.1或者干脆不能正常工作。所以我们现在要支持tcp 4层转发,让数据包直接去到后端。

我们可以在百度里看到各种文章,里面大部分都是在

1
2
3
stream {
    server {
       proxy_protocol on;#在这里加上这个配置
但是这个配置我觉得不是特别友好,特别是对于不支持7层的后端来说,你的来源全部都是127.0.0.1,很多分析无法进行。所以我们要用下面这个配置

1
2
user root;#原来这里是www-data或者nginx的
worker_processes auto;
1
2
3
4
5
stream {
    server {
      listen 443;
      listen [::]:443;
      proxy_bind $remote_addr transparent; #加上这条
现在我们要创建IP透明代理路由。并且代理和后端要跑在一同台服务器上。

如果你能看到这篇文章的话估计你已经找了很多类似文章了。通常文档都是介绍代理和后端不是在同一台服务器上的。

系统一般不允许将具有非本地源的数据包发送到环回地址,除非启用了route_localnet,如果具有环回地址的伪造数据包可能到达公共接口,这会产生安全问题。

但是这个限制仅适用于127/8地址范围,我们可以为环回接口分配别的的地址。从而绕过这个限制

1
ip addr add 192.168.127.1/24 dev lo scope host
debian系也可以在/etc/network/interfaces里改成这样。RH系很久没操作了,就用上面这个凑活吧,你们自己找持久化方法。

1
2
3
4
5
6
7
auto lo lo:10
iface lo inet loopback

iface lo:10 inet static
      address 192.168.127.40
      netmask 255.255.255.0
      network 192.168.127.0
这样,我们给回环地址分配一个192.168.127.40的地址和一个192.168.127.0/24的可达网段。

为了匹配返回数据包,我们需要查看OUTPUT链而不是PREROUTING链。

在不是同一主机的方案里,我们会用PREROUTING去匹配。就像别的教程里

1
2
3
4
5
6
iptables -t mangle -N DIVERT
iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 1
iptables -t mangle -A DIVERT -j ACCEPT
ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100
但是,由于我们的流量来自本地主机,并且可以通过源地址轻松识别,因此我们可以放弃整个iptables匹配和基于标记的路由规则,将其替换为基于源的简单路由规则。

1
2
ip rule add from 192.168.127.0/24 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100
debian系可以用以下持久化方法

1
2
3
4
5
6
iface lo:10 inet static
      address 192.168.127.40
      netmask 255.255.255.0
      network 192.168.127.0
    up ip rule add from 192.168.127.0/24 lookup 100 #新增这两条1
    up ip route add local 0.0.0.0/0 dev lo table 100 #新增这两条2
然后可以nginx/trojan服务器行以连接到在此新地址范围上侦听的本地服务。
必须注意将环回接口用于透明代理连接,否则数据包将无法传递。 这是通过使用新的本地地址做为监听地址而不是*或者0.0.0.0来完成的。

nginx配置---stream部分

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
stream {
    根据sni分流
    map $ssl_preread_server_name $backend_name {
      yourname.comtrojan;
      default      web;
    }

    # web
    upstream web {
      server 192.168.127.40:444;
    }
   
    # trojan
    upstream trojan {
      server 192.168.127.40:445;
    }
   

    server {
      listen 443;
      listen [::]:443;
      proxy_pass$backend_name;
      proxy_bind $remote_addr transparent;#4层转发模式
      ssl_preread on;
    }
}
nginx-server虚拟服务器部分,也就是你正常网站的部分

1
2
3
4
5
6
server {
    listen 444 http2 ssl;
    listen 192.168.127.40:444 http2 ssl;
    listen [::]:444 http2 ssl;
    server_name balabalayourname.com;
}
某些不能完整支持7层协议的软件,也一定要指定监听192.168.127.40或者特定IP,你指定*或者0.0.0.0是不管用的。

END
手机只能发成这样了
排版过的可以看博客https://blog.memotz.com/?p=801

KallyDev 发表于 2021-5-3 21:20:43

周润发 发表于 2021-5-3 21:22:29

你的账号不想要了吗

akatom 发表于 2021-5-3 21:24:29

大佬可以帮我转发一下我的 本地trojan么 我要上转发

hostloc@ 发表于 2021-5-3 21:26:00

cybmp3 发表于 2021-5-3 22:16:24

hostloc@ 发表于 2021-5-3 21:26
不仅限于运维上下手,要进入代码实践。

我觉得这个用运维方法挺好的,如果你要给trojan代码里加上支持protocol的代码。说实话我没想过。但是我觉得这个方法也很不错。

zylntxx 发表于 2021-5-3 22:56:03

没太看懂回程的数据包怎么走的:hug:
需要向路由器这样维护一个路由表来处理回程的数据包?

cybmp3 发表于 2021-5-3 23:16:49

zylntxx 发表于 2021-5-3 22:56
没太看懂回程的数据包怎么走的
需要向路由器这样维护一个路由表来处理回程的数据包? ...

给回环接口分配个额外的ip,不是127/8的,然后这个ip指定走路由表100。

zylntxx 发表于 2021-5-3 23:24:07

cybmp3 发表于 2021-5-3 23:16
给回环接口分配个额外的ip,不是127/8的,然后这个ip指定走路由表100。

给你blog+1IP:lol
如果对于局域网内不同主机,一台作为proxy,一台作为后端,有什么推荐实现方法吗

cybmp3 发表于 2021-5-3 23:44:29

本帖最后由 cybmp3 于 2021-5-3 23:46 编辑

zylntxx 发表于 2021-5-3 23:24
给你blog+1IP
如果对于局域网内不同主机,一台作为proxy,一台作为后端,有什么推荐实现方法吗 ...

那个看nginx官方文档就行。
https://www.nginx.com/blog/ip-transparency-direct-server-return-nginx-plus-transparent-proxy/

中文翻译版本我觉得比较好的
https://cloud.tencent.com/developer/article/1449427
页: [1] 2
查看完整版本: 共用443解决方案(非proxy_protocol,web和trojan都可以拿到真实ip)