Skip to content

Commit

Permalink
Add native_ip field to ProxyNode model and update clash proxy provide…
Browse files Browse the repository at this point in the history
…r URLs
  • Loading branch information
Ehco1996 committed Mar 14, 2024
1 parent 3c6979a commit 7f28594
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 34 deletions.
13 changes: 8 additions & 5 deletions apps/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,10 @@ def get_user_and_nodes(self, request):
return None, HttpResponseBadRequest("user not found")

node_list = m.ProxyNode.get_user_active_nodes(user)
if len(node_list) == 0:
native_ip = request.GET.get("native_ip")
if native_ip:
node_list = node_list.filter(native_ip=True)
if node_list.count() == 0:
return None, HttpResponseBadRequest("no active nodes for you")

return user, node_list
Expand All @@ -89,7 +92,7 @@ def get_user_and_nodes(self, request):
class SubscribeView(UserNodeBaseView):
def get(self, request):
user, response_or_nodes = self.get_user_and_nodes(request)
if response_or_nodes is not HttpResponse:
if not isinstance(response_or_nodes, HttpResponse):
node_list = response_or_nodes

if protocol := request.GET.get("protocol"):
Expand All @@ -115,7 +118,7 @@ def get(self, request):
class ClashProxyProviderView(UserNodeBaseView):
def get(self, request):
user, response_or_nodes = self.get_user_and_nodes(request)
if response_or_nodes is not HttpResponse:
if not isinstance(response_or_nodes, HttpResponse):
node_list = response_or_nodes
providers = UserSubManager(user, node_list).get_clash_proxy_providers()
return HttpResponse(
Expand Down Expand Up @@ -143,7 +146,7 @@ def get_rule_set(self, node_list, is_ip: bool):
class ClashDirectDomainRuleSetView(ClashDirectRuleSetBaseView):
def get(self, request):
_, response_or_nodes = self.get_user_and_nodes(request)
if response_or_nodes is not HttpResponse:
if not isinstance(response_or_nodes, HttpResponse):
node_list = response_or_nodes
domain_list = self.get_rule_set(node_list, is_ip=False)
context = {"domain_list": domain_list}
Expand All @@ -160,7 +163,7 @@ def get(self, request):
class ClashDirectIPRuleSetView(ClashDirectRuleSetBaseView):
def get(self, request):
_, response_or_nodes = self.get_user_and_nodes(request)
if response_or_nodes is not HttpResponse:
if not isinstance(response_or_nodes, HttpResponse):
node_list = response_or_nodes
ip_list = self.get_rule_set(node_list, is_ip=True)
context = {"ip_list": ip_list}
Expand Down
17 changes: 17 additions & 0 deletions apps/proxy/migrations/0029_proxynode_native_ip.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 4.2.6 on 2024-03-14 06:49

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("proxy", "0028_relaynode_relay_sync_duration_and_more"),
]

operations = [
migrations.AddField(
model_name="proxynode",
name="native_ip",
field=models.BooleanField(default=False, verbose_name="是否为原生 ip"),
),
]
1 change: 1 addition & 0 deletions apps/proxy/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,7 @@ class ProxyNode(BaseNodeModel, SequenceMixin):
enable_udp = models.BooleanField("是否开启UDP 转发", default=True)
xray_grpc_port = models.IntegerField("xray grpc port", default=23456)
provider_remark = models.CharField("vps备注", max_length=64, default="")
native_ip = models.BooleanField("是否为原生 ip", default=False)

ehco_listen_host = models.CharField(
"隧道监听地址", max_length=64, blank=True, null=True
Expand Down
5 changes: 3 additions & 2 deletions apps/sspanel/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -247,9 +247,10 @@ def used_percentage(self):
def remain_percentage(self):
return 100.00 - self.used_percentage

@property
def clash_proxy_provider_endpoint(self):
def get_clash_proxy_provider_endpoint(self, native_ip=False):
params = {"uid": self.uid}
if native_ip:
params["native_ip"] = "true"
return (
settings.SITE_HOST
+ f"/api/subscribe/clash/proxy_providers/?{urlencode(params)}"
Expand Down
8 changes: 6 additions & 2 deletions apps/sub.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,10 @@ def __init__(self, user, node_list, sub_client=CLIENT_CLASH):

def _get_clash_sub_yaml(self):
user: User = self.user
user_proxy_provider_url = user.clash_proxy_provider_endpoint
all_proxy_provider_url = user.get_clash_proxy_provider_endpoint()
native_ip_proxy_provider_url = user.get_clash_proxy_provider_endpoint(
native_ip=True
)
direct_ip_rule_set_url = user.direct_ip_rule_set_endpoint
direct_domain_rule_set_url = user.direct_domain_rule_set_endpoint

Expand All @@ -41,7 +44,8 @@ def _get_clash_sub_yaml(self):
{
"sub_client": self.sub_client,
"provider_name": settings.SITE_TITLE,
"proxy_provider_url": user_proxy_provider_url,
"all_proxy_provider_url": all_proxy_provider_url,
"native_ip_proxy_provider_url": native_ip_proxy_provider_url,
"direct_ip_rule_set_url": direct_ip_rule_set_url,
"direct_domain_rule_set_url": direct_domain_rule_set_url,
},
Expand Down
65 changes: 40 additions & 25 deletions templates/clash/main.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,28 +7,17 @@ allow-lan: true
log-level: info
external-controller: 0.0.0.0:9090

proxy-providers:
{{ provider_name }}:
type: http
url: {{ proxy_provider_url }}
interval: 3600
path: ./providers/{{ provider_name }}.yaml
health-check:
enable: true
interval: 300
tolerance: 150
lazy: true
url: http://www.gstatic.com/generate_204


proxy-groups:
- name: PROXY
type: select
proxies:
- auto
use:
- {{ provider_name }}

- {{ provider_name }}-all
- name: PROXY-NATIVE-IP
type: select
use:
- {{ provider_name }}-native-ip
- name: auto
type: url-test
use:
Expand All @@ -37,12 +26,36 @@ proxy-groups:
interval: 300
tolerance: 150
lazy: true

- name: Final
type: select
proxies:
- DIRECT
- PROXY
- PROXY-NATIVE-IP

proxy-providers:
{{ provider_name }}-all:
type: http
url: {{ all_proxy_provider_url|safe }}
interval: 3600
path: ./providers/{{ provider_name }}-all.yaml
health-check:
enable: true
interval: 300
tolerance: 150
lazy: true
url: http://www.gstatic.com/generate_204
{{ provider_name }}-native-ip:
type: http
url: {{ native_ip_proxy_provider_url|safe }}
interval: 3600
path: ./providers/{{ provider_name }}-native-ip.yaml
health-check:
enable: true
interval: 300
tolerance: 150
lazy: true
url: http://www.gstatic.com/generate_204

rule-providers:
reject:
Expand Down Expand Up @@ -137,24 +150,26 @@ rule-providers:
direct_domain_list:
type: http
behavior: domain
url: "{{ direct_domain_rule_set_url }}"
url: "{{ direct_domain_rule_set_url |safe }}"
path: ./ruleset/direct_domain_list.yaml
interval: 86400
direct_ip_list:
type: http
behavior: ipcidr
url: "{{ direct_ip_rule_set_url }}"
url: "{{ direct_ip_rule_set_url |safe }}"
path: ./ruleset/direct_ip_list.yaml
interval: 86400

rules:
# OPENAI check https://github.com/v2fly/domain-list-community/blob/master/data/openai
- DOMAIN,chatgpt.com,PROXY
- DOMAIN,oaistatic.com,PROXY
- DOMAIN,oaiusercontent.com,PROXY
- DOMAIN,openai.com,PROXY
- DOMAIN-KEYWORD,openai,PROXY
- DOMAIN-KEYWORD,openaiapi,PROXY
- DOMAIN,chatgpt.com,PROXY-NATIVE-IP
- DOMAIN,oaistatic.com,PROXY-NATIVE-IP
- DOMAIN,oaiusercontent.com,PROXY-NATIVE-IP
- DOMAIN,openai.com,PROXY-NATIVE-IP
- DOMAIN-KEYWORD,openai,PROXY-NATIVE-IP
- DOMAIN-KEYWORD,openaiapi,PROXY-NATIVE-IP
- RULE-SET,netflix,PROXY-NATIVE-IP
- RULE-SET,netflixcidr,PROXY-NATIVE-IP

- RULE-SET,reject,REJECT
- RULE-SET,direct_domain_list,DIRECT
Expand Down

0 comments on commit 7f28594

Please sign in to comment.