Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

可以添加V4,V6双栈支持 #213

Open
DuanJie315 opened this issue Nov 19, 2018 · 13 comments
Open

可以添加V4,V6双栈支持 #213

DuanJie315 opened this issue Nov 19, 2018 · 13 comments
Labels

Comments

@DuanJie315
Copy link

当地电信已下发原生V6地址.现已有公网V4,V6双栈地址.服务器也是公网双栈地址.
了解v6和v4最大的区别就是不需要net.但为了正常使用代理在路由使用V6 net模式.
查询相关资料在使用gfwlist需要ip6tables,ipset create hash:ip family inet6来创建ipv6地址集(实在没找到如何创建v4,v6双地址合集的办法).
请问能否在ss-rules加入v6支持的选项.或如何修改ss-rules来创建V6地址集及关联SS_SPEC_WAN_AC,SS_SPEC_WAN_FW等.
谢谢.

@DuanJie315
Copy link
Author

说说自己周末折腾的过程和结果给大家点思路.
自己用gfwlist,只说gfwlist模式.

尝试ip6tables,ipset ipset create gfwlistv6 hash:net hashsize family inet6 4096 maxelem 99999 来创建ipv6地址集----->可以正常创建

尝试 ip6tables(iptables) -t mangle -I SS_SPEC_WAN_AC 1 -m set --match-set gfwlist6 dst -j SS_SPEC_WAN_FW----->报错can not,没有深扒原因.

至于dnsmasq那边从查询到的资料来看,可以在创建一个gfwlist6的.conf文件或者修改现有的gfwlist的规则
server=/.google.com/127.0.0.1#1984(确保你使用的dns可以返回AAAA的解析)
ipset=/.google.com/gfwlist,gfwlist6

@shNanChen
Copy link

shNanChen commented Nov 19, 2018

尝试 ip6tables(iptables) -t mangle -I SS_SPEC_WAN_AC 1 -m set --match-set gfwlist6 dst -j SS_SPEC_WAN_FW----->报错can not,没有深扒原因.

Transparent Proxy 透明代理是需要配置在 nat 表,不应该在 mangle表吧
前提也是你得先有ipv6 的 nat 表

引1个stackoverflow的问题:Transparent Proxy for IPv6 traffic under Linux

NAT simply does not exist in IPv6. By Design.
Given that transparency/interception is actually a feature gained 
by secretly twisting NAT routes inside out and back on themselves. 
It's quite logical that a protocol without NAT cannot do transparency 
and interception that way.

既然从ipv6设计角度就没有考虑nat,所以我之前试了ipv6vpn
通过dnsmasp解析被屏蔽域名至ipset,然后配置策略路由至vpn通道,
但还是有2个问题:shadowsocksVPN好久没更新啦 openwrt-shadowvpnvpn因为源地址的问题好像也不能摆脱ipv6 nat

总之ipv6网络下,配置路由器下面客户端免配置翻墙现在还没找到好用的解决方案。

@moralrebuild
Copy link

中國大陸三大寬帶運營商都全面部署IPv6,需要真正支持才能說得上是科學上網。希望開發者努力攀登科學高峰!

@MeIsReallyBa
Copy link

第二条用的nat
ip6tables -t nat -A PREROUTING -p tcp -m set --match-set gfwlist6 dst -j REDIRECT --to-port 1234
试了下可以转发gfwlist6的流量到ssredir端口上了

@MeIsReallyBa
Copy link

nat,所以我之前试了ipv6vpn
通过dnsmasp解析被屏蔽

linux 新点的内核都支持ipv6 nat的特性了吧

@Old-Pussy
Copy link

如果 ipv6 还走 nat 感觉有点没意思。但不用 nat 表的话,只能加钩子了。加钩子好像需要写内核模块?那就很麻烦了。

@WordlessEcho WordlessEcho mentioned this issue Apr 9, 2019
@fbion
Copy link

fbion commented Mar 5, 2020

mark

@DuanJie315
Copy link
Author

DuanJie315 commented Mar 27, 2020

https://github.com/openwrt/packages/blob/master/net/shadowsocks-libev/files/ss-rules
https://github.com/zfl9/ss-tproxy/blob/master/ss-tproxy

https://github.com/openwrt/packages/blob/master/net/shadowsocks-libev/files/ss-rules
https://github.com/zfl9/ss-tproxy/blob/master/ss-tproxy

哈哈哈 感谢 感谢.我都快忘记这茬了(因为一直用隔壁的那个).

赶上疫情这段时间好好的研究了下(V4一直都是公网,所以一直关着V6,除了BT也没感觉啥好的,哈哈哈),脚本啥玩的也不溜,因为我只用gfwlist模式,所以逆向思维了下.前端dns返回支持返回 A AAAA记录,保存到两张表里面(gfwlist,gfwlist6),再参照老一套v4的写法利用openwrt netfilter 的特性(我承认我参照了隔壁tproxy透明代的思路,哈哈哈)再原有脚本里面"加(抄)"了点作业,对我来说用起来也没啥问题(gfwlist模式).不管网关还是局域网设备都可以V4 V6双栈透明代理,当然仅限使用gfwlist模式,比如白名单我不用所以也没折腾.有需要的小伙伴自取.

PS:如果写的有啥问题或者可以更精简的话希望大神指点.

参照wiki gfwlist模式以及创建v4 v6合集:
gfwlist_init() {
ipt="iptables -t nat"
setname=$(ipset -n list | grep -w "gfwlist")
if [ ! "$setname" ]; then
ipset create gfwlist hash:net hashsize 4096 maxelem 99999
ipset create gfwlist6 hash:net family inet6 hashsize 4096 maxelem 99999
fi
$ipt -I SS_SPEC_WAN_AC 1 -m set --match-set gfwlist dst -j SS_SPEC_WAN_FW
return 0
}

创建v6 iptables规则:
gfwlist6_init() {
ipt6="ip6tables -t mangle"
setname=$(ip6tables -L -t mangle | grep -w "match-set gfwlist6 dst TPROXY")
if [ ! "$setname" ]; then
ip -6 rule add fwmark 1 table 100
ip -6 route add local ::/0 dev lo table 100
$ipt6 -A OUTPUT -m mark --mark 0xff -j RETURN
$ipt6 -A OUTPUT -p tcp -m set --match-set gfwlist6 dst -j MARK --set-mark 0x01/0x01
$ipt6 -A OUTPUT -p udp -m set --match-set gfwlist6 dst -j MARK --set-mark 0x01/0x01
$ipt6 -A PREROUTING -m mark --mark 0xff -j RETURN
$ipt6 -A PREROUTING -p tcp -m set --match-set gfwlist6 dst -j TPROXY --on-port 1029 --tproxy-mark 0x01/0x01
$ipt6 -A PREROUTING -p udp -m set --match-set gfwlist6 dst -j TPROXY --on-port 1029 --tproxy-mark 0x01/0x01
fi
return 0
}

拦截局域网所有DNS解析(可加可不加看个人需求我有chromecast所以加着在):
chromecast_init() {
ipt="iptables -t nat"
ipt6="ip6tables -t nat"
setname=$(iptables -L -t nat | grep -w "domain to:192.168.1.1")
if [ ! "$setname" ]; then
$ipt -A PREROUTING -s 192.168.1.0/27 -p tcp --dport 53 -j DNAT --to 192.168.1.1
$ipt -A PREROUTING -s 192.168.1.0/27 -p udp --dport 53 -j DNAT --to 192.168.1.1
$ipt -A PREROUTING -s 192.168.1.0/27 -p tcp --dport 853 -j DNAT --to 192.168.1.1
$ipt -A PREROUTING -s 192.168.1.0/27 -p udp --dport 853 -j DNAT --to 192.168.1.1
$ipt -A PREROUTING -s 192.168.1.0/27 -p tcp --dport 5353 -j DNAT --to 192.168.1.1
$ipt -A PREROUTING -s 192.168.1.0/27 -p udp --dport 5353 -j DNAT --to 192.168.1.1
$ipt6 -A PREROUTING -s fdc3:8dba:82e1::0/64 -p tcp --dport 53 -j DNAT --to fdc3:8dba:82e1::1
$ipt6 -A PREROUTING -s fdc3:8dba:82e1::0/64 -p udp --dport 53 -j DNAT --to fdc3:8dba:82e1::1
$ipt6 -A PREROUTING -s fdc3:8dba:82e1::0/64 -p tcp --dport 853 -j DNAT --to fdc3:8dba:82e1::1
$ipt6 -A PREROUTING -s fdc3:8dba:82e1::0/64 -p udp --dport 853 -j DNAT --to fdc3:8dba:82e1::1
$ipt6 -A PREROUTING -s fdc3:8dba:82e1::0/64 -p tcp --dport 5353 -j DNAT --to fdc3:8dba:82e1::1
$ipt6 -A PREROUTING -s fdc3:8dba:82e1::0/64 -p udp --dport 5353 -j DNAT --to fdc3:8dba:82e1::1
fi
return 0
}

最后改为:
flush_rules && ipset_init && ipt_nat && ipt_mangle && gfwlist_init && gfwlist6_init && chromecast_init && export_ipt_rules

搭配的dnsmasq规则格式:
ipset=/.angela-merkel.de/gfwlist,gfwlist6 //无污染返回A AAAA加入到前面创建的合集内.
server=/.angola.org/127.0.0.1#1027 //无污染可返回A AAAA的dns服务端.

@tenwx
Copy link

tenwx commented Apr 17, 2020

https://github.com/openwrt/packages/blob/master/net/shadowsocks-libev/files/ss-rules
https://github.com/zfl9/ss-tproxy/blob/master/ss-tproxy

https://github.com/openwrt/packages/blob/master/net/shadowsocks-libev/files/ss-rules
https://github.com/zfl9/ss-tproxy/blob/master/ss-tproxy

哈哈哈 感谢 感谢.我都快忘记这茬了(因为一直用隔壁的那个).

赶上疫情这段时间好好的研究了下(V4一直都是公网,所以一直关着V6,除了BT也没感觉啥好的,哈哈哈),脚本啥玩的也不溜,因为我只用gfwlist模式,所以逆向思维了下.前端dns返回支持返回 A AAAA记录,保存到两张表里面(gfwlist,gfwlist6),再参照老一套v4的写法利用openwrt netfilter 的特性(我承认我参照了隔壁tproxy透明代的思路,哈哈哈)再原有脚本里面"加(抄)"了点作业,对我来说用起来也没啥问题(gfwlist模式).不管网关还是局域网设备都可以V4 V6双栈透明代理,当然仅限使用gfwlist模式,比如白名单我不用所以也没折腾.有需要的小伙伴自取.

PS:如果写的有啥问题或者可以更精简的话希望大神指点.

参照wiki gfwlist模式以及创建v4 v6合集:
gfwlist_init() {
ipt="iptables -t nat"
setname=$(ipset -n list | grep -w "gfwlist")
if [ ! "$setname" ]; then
ipset create gfwlist hash:net hashsize 4096 maxelem 99999
ipset create gfwlist6 hash:net family inet6 hashsize 4096 maxelem 99999
fi
$ipt -I SS_SPEC_WAN_AC 1 -m set --match-set gfwlist dst -j SS_SPEC_WAN_FW
return 0
}

创建v6 iptables规则:
gfwlist6_init() {
ipt6="ip6tables -t mangle"
setname=$(ip6tables -L -t mangle | grep -w "match-set gfwlist6 dst TPROXY")
if [ ! "$setname" ]; then
ip -6 rule add fwmark 1 table 100
ip -6 route add local ::/0 dev lo table 100
$ipt6 -A OUTPUT -m mark --mark 0xff -j RETURN
$ipt6 -A OUTPUT -p tcp -m set --match-set gfwlist6 dst -j MARK --set-mark 0x01/0x01
$ipt6 -A OUTPUT -p udp -m set --match-set gfwlist6 dst -j MARK --set-mark 0x01/0x01
$ipt6 -A PREROUTING -m mark --mark 0xff -j RETURN
$ipt6 -A PREROUTING -p tcp -m set --match-set gfwlist6 dst -j TPROXY --on-port 1029 --tproxy-mark 0x01/0x01
$ipt6 -A PREROUTING -p udp -m set --match-set gfwlist6 dst -j TPROXY --on-port 1029 --tproxy-mark 0x01/0x01
fi
return 0
}

拦截局域网所有DNS解析(可加可不加看个人需求我有chromecast所以加着在):
chromecast_init() {
ipt="iptables -t nat"
ipt6="ip6tables -t nat"
setname=$(iptables -L -t nat | grep -w "domain to:192.168.1.1")
if [ ! "$setname" ]; then
$ipt -A PREROUTING -s 192.168.1.0/27 -p tcp --dport 53 -j DNAT --to 192.168.1.1
$ipt -A PREROUTING -s 192.168.1.0/27 -p udp --dport 53 -j DNAT --to 192.168.1.1
$ipt -A PREROUTING -s 192.168.1.0/27 -p tcp --dport 853 -j DNAT --to 192.168.1.1
$ipt -A PREROUTING -s 192.168.1.0/27 -p udp --dport 853 -j DNAT --to 192.168.1.1
$ipt -A PREROUTING -s 192.168.1.0/27 -p tcp --dport 5353 -j DNAT --to 192.168.1.1
$ipt -A PREROUTING -s 192.168.1.0/27 -p udp --dport 5353 -j DNAT --to 192.168.1.1
$ipt6 -A PREROUTING -s fdc3:8dba:82e1::0/64 -p tcp --dport 53 -j DNAT --to fdc3:8dba:82e1::1
$ipt6 -A PREROUTING -s fdc3:8dba:82e1::0/64 -p udp --dport 53 -j DNAT --to fdc3:8dba:82e1::1
$ipt6 -A PREROUTING -s fdc3:8dba:82e1::0/64 -p tcp --dport 853 -j DNAT --to fdc3:8dba:82e1::1
$ipt6 -A PREROUTING -s fdc3:8dba:82e1::0/64 -p udp --dport 853 -j DNAT --to fdc3:8dba:82e1::1
$ipt6 -A PREROUTING -s fdc3:8dba:82e1::0/64 -p tcp --dport 5353 -j DNAT --to fdc3:8dba:82e1::1
$ipt6 -A PREROUTING -s fdc3:8dba:82e1::0/64 -p udp --dport 5353 -j DNAT --to fdc3:8dba:82e1::1
fi
return 0
}

最后改为:
flush_rules && ipset_init && ipt_nat && ipt_mangle && gfwlist_init && gfwlist6_init && chromecast_init && export_ipt_rules

搭配的dnsmasq规则格式:
ipset=/.angela-merkel.de/gfwlist,gfwlist6 //无污染返回A AAAA加入到前面创建的合集内.
server=/.angola.org/127.0.0.1#1027 //无污染可返回A AAAA的dns服务端.

请问你的ip6tables和tproxy分别是什么版本的?我的版本是:ip6tables v1.4.14 NF_TPROXY 4.1.0,iptables下正常,ip6tables报错No chain/target/match by that name.

@DuanJie315
Copy link
Author

https://github.com/openwrt/packages/blob/master/net/shadowsocks-libev/files/ss-rules
https://github.com/zfl9/ss-tproxy/blob/master/ss-tproxy

https://github.com/openwrt/packages/blob/master/net/shadowsocks-libev/files/ss-rules
https://github.com/zfl9/ss-tproxy/blob/master/ss-tproxy

哈哈哈 感谢 感谢.我都快忘记这茬了(因为一直用隔壁的那个).
赶上疫情这段时间好好的研究了下(V4一直都是公网,所以一直关着V6,除了BT也没感觉啥好的,哈哈哈),脚本啥玩的也不溜,因为我只用gfwlist模式,所以逆向思维了下.前端dns返回支持返回 A AAAA记录,保存到两张表里面(gfwlist,gfwlist6),再参照老一套v4的写法利用openwrt netfilter 的特性(我承认我参照了隔壁tproxy透明代的思路,哈哈哈)再原有脚本里面"加(抄)"了点作业,对我来说用起来也没啥问题(gfwlist模式).不管网关还是局域网设备都可以V4 V6双栈透明代理,当然仅限使用gfwlist模式,比如白名单我不用所以也没折腾.有需要的小伙伴自取.
PS:如果写的有啥问题或者可以更精简的话希望大神指点.
参照wiki gfwlist模式以及创建v4 v6合集:
gfwlist_init() {
ipt="iptables -t nat"
setname=$(ipset -n list | grep -w "gfwlist")
if [ ! "$setname" ]; then
ipset create gfwlist hash:net hashsize 4096 maxelem 99999
ipset create gfwlist6 hash:net family inet6 hashsize 4096 maxelem 99999
fi
$ipt -I SS_SPEC_WAN_AC 1 -m set --match-set gfwlist dst -j SS_SPEC_WAN_FW
return 0
}
创建v6 iptables规则:
gfwlist6_init() {
ipt6="ip6tables -t mangle"
setname=$(ip6tables -L -t mangle | grep -w "match-set gfwlist6 dst TPROXY")
if [ ! "$setname" ]; then
ip -6 rule add fwmark 1 table 100
ip -6 route add local ::/0 dev lo table 100
$ipt6 -A OUTPUT -m mark --mark 0xff -j RETURN
$ipt6 -A OUTPUT -p tcp -m set --match-set gfwlist6 dst -j MARK --set-mark 0x01/0x01
$ipt6 -A OUTPUT -p udp -m set --match-set gfwlist6 dst -j MARK --set-mark 0x01/0x01
$ipt6 -A PREROUTING -m mark --mark 0xff -j RETURN
$ipt6 -A PREROUTING -p tcp -m set --match-set gfwlist6 dst -j TPROXY --on-port 1029 --tproxy-mark 0x01/0x01
$ipt6 -A PREROUTING -p udp -m set --match-set gfwlist6 dst -j TPROXY --on-port 1029 --tproxy-mark 0x01/0x01
fi
return 0
}
拦截局域网所有DNS解析(可加可不加看个人需求我有chromecast所以加着在):
chromecast_init() {
ipt="iptables -t nat"
ipt6="ip6tables -t nat"
setname=$(iptables -L -t nat | grep -w "domain to:192.168.1.1")
if [ ! "$setname" ]; then
$ipt -A PREROUTING -s 192.168.1.0/27 -p tcp --dport 53 -j DNAT --to 192.168.1.1
$ipt -A PREROUTING -s 192.168.1.0/27 -p udp --dport 53 -j DNAT --to 192.168.1.1
$ipt -A PREROUTING -s 192.168.1.0/27 -p tcp --dport 853 -j DNAT --to 192.168.1.1
$ipt -A PREROUTING -s 192.168.1.0/27 -p udp --dport 853 -j DNAT --to 192.168.1.1
$ipt -A PREROUTING -s 192.168.1.0/27 -p tcp --dport 5353 -j DNAT --to 192.168.1.1
$ipt -A PREROUTING -s 192.168.1.0/27 -p udp --dport 5353 -j DNAT --to 192.168.1.1
$ipt6 -A PREROUTING -s fdc3:8dba:82e1::0/64 -p tcp --dport 53 -j DNAT --to fdc3:8dba:82e1::1
$ipt6 -A PREROUTING -s fdc3:8dba:82e1::0/64 -p udp --dport 53 -j DNAT --to fdc3:8dba:82e1::1
$ipt6 -A PREROUTING -s fdc3:8dba:82e1::0/64 -p tcp --dport 853 -j DNAT --to fdc3:8dba:82e1::1
$ipt6 -A PREROUTING -s fdc3:8dba:82e1::0/64 -p udp --dport 853 -j DNAT --to fdc3:8dba:82e1::1
$ipt6 -A PREROUTING -s fdc3:8dba:82e1::0/64 -p tcp --dport 5353 -j DNAT --to fdc3:8dba:82e1::1
$ipt6 -A PREROUTING -s fdc3:8dba:82e1::0/64 -p udp --dport 5353 -j DNAT --to fdc3:8dba:82e1::1
fi
return 0
}
最后改为:
flush_rules && ipset_init && ipt_nat && ipt_mangle && gfwlist_init && gfwlist6_init && chromecast_init && export_ipt_rules
搭配的dnsmasq规则格式:
ipset=/.angela-merkel.de/gfwlist,gfwlist6 //无污染返回A AAAA加入到前面创建的合集内.
server=/.angola.org/127.0.0.1#1027 //无污染可返回A AAAA的dns服务端.

请问你的ip6tables和tproxy分别是什么版本的?我的版本是:ip6tables v1.4.14 NF_TPROXY 4.1.0,iptables下正常,ip6tables报错No chain/target/match by that name.

版本没注意,一直自己编译的openwrt从18-19都正常.
个人觉得不是版本的问题.估计是ipt6模块不全,ipt和ipt6是两个东西.ipt能用不等于有ipt6模块.

@moralrebuild
Copy link

两年后,SS依然没有这方面的进步,准备被wireguard淘汰吗?

@tianlichunhong
Copy link

第二条用的nat
ip6tables -t nat -A PREROUTING -p tcp -m set --match-set gfwlist6 dst -j REDIRECT --to-port 1234
试了下可以转发gfwlist6的流量到ssredir端口上了

我的不可以。发现这个规则没有起作用。不知道是否因为没有用nat的模式的原因。gfwlist6获得是正常的,就是流量没有转到1234端口。IPv4的是正常的。也许是没有安装kmod-ipt-nat6的原因?但是IPv6上网是正常的,就是不能翻墙。

@aa65535 aa65535 removed the pending label May 24, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

10 participants