luci-app-shadowsocks icon indicating copy to clipboard operation
luci-app-shadowsocks copied to clipboard

可以添加V4,V6双栈支持

Open DuanJie315 opened this issue 6 years ago • 13 comments

当地电信已下发原生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 avatar Nov 19 '18 02:11 DuanJie315

说说自己周末折腾的过程和结果给大家点思路. 自己用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

DuanJie315 avatar Nov 19 '18 03:11 DuanJie315

尝试 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网络下,配置路由器下面客户端免配置翻墙现在还没找到好用的解决方案。

shNanChen avatar Nov 19 '18 03:11 shNanChen

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

moralrebuild avatar Nov 28 '18 03:11 moralrebuild

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

MeIsReallyBa avatar Dec 20 '18 03:12 MeIsReallyBa

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

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

MeIsReallyBa avatar Dec 20 '18 08:12 MeIsReallyBa

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

Old-Pussy avatar Mar 18 '19 16:03 Old-Pussy

mark

fbion avatar Mar 05 '20 06:03 fbion

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

wyf88 avatar Mar 21 '20 13:03 wyf88

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服务端.

DuanJie315 avatar Mar 27 '20 20:03 DuanJie315

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.

tenwx avatar Apr 17 '20 09:04 tenwx

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模块.

DuanJie315 avatar Apr 17 '20 09:04 DuanJie315

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

moralrebuild avatar Aug 12 '20 02:08 moralrebuild

第二条用的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上网是正常的,就是不能翻墙。

tianlichunhong avatar Aug 18 '20 02:08 tianlichunhong