开了warp之后不能SSH登录

问题:

Abhi, [2023/1/17 11:08]
Hello, how can I use wg-quick up in my gcp server and then ssh back to it???
Abhi, [2023/1/17 11:08]
I want to add warp ip in my gcp server. But when I do wg-quick up, then I am unable to ssh into server
Abhi, [2023/1/17 11:09]
And my open vpn stop working

这看上去和woiden当时的情况很像 (开了warp以后就不能通过IPv4 SSH登录了)

所以解决方案也一样:

解决方案

https://github.com/crazypeace/warp.sh/blob/main/wgcf_postup_postdown.sh


原理

脚本

内容很简单:

sed -i '/PostUp/d' /etc/wireguard/wgcf.conf
sed -i '/PostDown/d' /etc/wireguard/wgcf.conf
sed -i "7 s/^/PostUp = ip -4 rule add from $(ip route get 1.1.1.1 | grep -oP 'src \K\S+') lookup main\n/" /etc/wireguard/wgcf.conf
sed -i "8 s/^/PostDown = ip -4 rule delete from $(ip route get 1.1.1.1 | grep -oP 'src \K\S+') lookup main\n/" /etc/wireguard/wgcf.conf

效果就是在 wgcf.conf 文件里添加两行:

PostUp = ip -4 rule add from 192.168.0.6 lookup main
PostDown = ip -4 rule delete from 192.168.0.6 lookup main

(上面这个例子是woiden里面跑起来的效果, 如果在 RackNerd 或者 CloudCone 上面跑起来是下面这样)

PostUp = ip -4 rule add from 64.27.22.164 lookup main
PostDown = ip -4 rule delete from 64.27.22.164 lookup main


IP地址

如果你用 ip a 命令查一下,你会发现这个蓝色的IP地址就是你SSH要进入这个VPS的IP。对于woiden来说,因为是NAT机,所以IP地址是个内网地址。对于RackNerd和Cloudcone来说,就是公网IP地址了。

ip a

PostUp PostDown

https://manpages.debian.org/unstable/wireguard-tools/wg-quick.8.en.html

Bing翻译:
PreUp, PostUp, PreDown, PostDown — 在设置/拆除接口之前/之后由 bash(1) 执行的脚本片段,最常用于配置自定义 DNS 选项或防火墙规则。特殊字符串 '%i' 扩展为 INTERFACE。每个命令都可以多次指定,在这种情况下,命令将按顺序执行。

意思就是说在up之后,执行这行脚本

ip -4 rule add from SSH要连进来的IP地址 lookup main

在down之后,执行

ip -4 rule delete from SSH要连进来的IP地址 lookup main

ip命令

这两个ip命令与路由有关。具体谈起来水就深了。

你可以在warp启动后和关闭后,用 ip 命令看一下rule的变化。 

ip -4 rule show

perl 正则里面的 \K 

观察脚本,你会发现用到 grep -oP 命令。参数 -o 表示只留下匹配的部分;-P 表示使用perl正则表达式。

参考:https://www.cnblogs.com/f-ck-need-u/p/7462706.html

而在 perl 正则表达式中,\K 表示丢弃匹配的部分。

参考:https://junmajinlong.com/perl/perl_re/

'src \K\S+' 的意思是先匹配 src ,然后把src丢弃,然后开始匹配多个\S即非空字符。


思维拓展

以上谈的是在IPv4的环境下,用warp开一个IPv4的出站,导致不能从原有的IPv4进来的问题。

如果是在IPv6的环境下,用warp开一个IPv6的出站,也可能导致不能从原有的IPv6进来。

这时候在 wgcf.conf 里面

PostUp = ip -6 rule add from SSH要连进来的IPv6地址 lookup main
PostDown = ip -6 rule delete from SSH要连进来的IPv6地址 lookup main
当你去查rule变化的时候,也要用 ip -6
ip -6 rule show

同样要注意, 如果你通过 ip a 查出来的IPV6地址并不是公网地址的话, 用这样的方法来查询 SSH连进来的IP地址

ip route get 2606:4700:4700::1111 | grep -oP 'src \K\S+'

然后再参考上面的PostUp PostDown去写到wgcf.conf里面

评论

The Hot3 in Last 30 Days

ClouDNS .asia免费域名 托管到CloudFlare开CDN白嫖Websocket WS通道翻墙 / desec.io

无服务器 自建短链服务 Url-Shorten-Worker 完整的部署教程