[Share Experiences] 解决安装Docker后QQ无法记住登陆状态——利用网络命名空间
Tofloor
poster avatar
LuijpCN
deepin
2024-04-18 16:04
Author

方案中涉及配置 sudo 命令无密码执行,可能存在安全风险,没有想到好办法绕过去,各位如有好的建议欢迎提出!

QQ一直无法记住登陆状态,以为是 BUG,结果大家大部分人是能够记住登陆状态的,看AUR评论得知与Docker有关,且可通过指定软件命名空间的方式解决,遂着手尝试。目前重启两次,QQ均能记住登陆状态,分享一下过程:

配置网络命名空间

保存以下脚本,以当前用户目录为例(/home/luijp/netns_linuxqq.sh)请根据实际情况更改。

注意修改 enp7s0 为自己的网卡,可通过 ip addr 获取网卡信息

#!/bin/bash
# 创建网络命名空间
ip netns add linuxqq 

# 创建 vethqq 对 
ip link add vethqq1 type veth peer name vethqq2 

# 将 vethqq2 移至新的网络命名空间
ip link set vethqq2 netns linuxqq 

# 配置 IP 地址
ip addr add 10.0.0.1/24 dev vethqq1 
ip link set vethqq1 up 

ip netns exec linuxqq ip addr add 10.0.0.2/24 dev vethqq2
ip netns exec linuxqq ip link set vethqq2 up 
ip netns exec linuxqq ip link set lo up 

# 添加默认网关
ip netns exec linuxqq ip route add default via 10.0.0.1

# iptables 配置 
sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
iptables -F FORWARD 
iptables -t nat -A POSTROUTING -s 10.0.0.0/255.255.255.0 -o enp7s0 -j MASQUERADE
iptables -A FORWARD -o enp7s0 -i vethqq1 -j ACCEPT
iptables -A FORWARD -i enp7s0 -o vethqq1 -j ACCEPT

配置开机运行脚本

由于网络命名空间重启失效,这里需要配置开机启动,根据实际情况修改脚本地址:

/etc/systemd/system/linuxqq.service

[Unit]
Description=LinuxQQ netns config
After=network.target

[Service]
Type=forking
ExecStart=/home/luijp/netns_linuxqq.sh
RemainAfterExit=yes
User=root

[Install]
WantedBy=multi-user.target

开机启用脚本
sudo systemctl enable linuxqq.service

配置sudo无密码执行(谨慎)

由于桌面图标 .desktop 无法输入密码,这里需要配置无密码。

修改为自己的用户名:

luijp ALL=(ALL) NOPASSWD:/usr/sbin/ip netns exec linuxqq *

配置图标

修改 ~/Desktop/qq.desktop/usr/share/applications/qq.desktop文件中的 exec部分,注意用户名修改为自己的:

Exec=sudo ip netns exec linuxqq sudo -u luijp '/opt/apps/linux.qq.com/files/qq' %U
Reply Favorite View the author
All Replies
LuijpCN
deepin
2024-04-18 16:12
#1

可能开始的一两次依然需要扫码,我在重启三次后记住了登陆状态。

Reply View the author
deepin
2024-04-18 16:32
#2

有没有docker我不知道,但是确实和我安装了一个xDroid有关吧

Reply View the author
neko
deepin
Ecological co-builder
2024-04-18 19:10
#3

mark
好奇他们是怎么发现这个原因的

Reply View the author
LuijpCN
deepin
2024-04-18 19:27
#4
neko

mark
好奇他们是怎么发现这个原因的

好像是 Docker 会在每次启动随机 MAC 地址

Reply View the author
f@deepin
deepin
2024-04-18 19:28
#5

微信图片_20240418192831.jpg

Reply View the author
deepin
2024-04-18 20:45
#6

老哥老哥,急求。启动qq报错了,说是网络原因,可能前面你那个什么网络配置没搞对?

image.png

终端中的内容:

version_config_filename :/home/keqing/.config/QQ/versions/config.json
app_package_filename :/opt/QQ/resources/app/package.json
config_build_id :22961
config_base_version :3.2.7-22961
config_current_version :3.2.7-22961
app_build_version :22961
version_config_filename :/home/keqing/.config/QQ/versions/config.json
version_config_filename :/home/keqing/.config/QQ/versions/config.json
app_package_filename :/opt/QQ/resources/app/package.json
app_package_filename :/opt/QQ/resources/app/package.json
config_build_id :22961
config_build_id :22961
config_base_version :3.2.7-22961
config_base_version :3.2.7-22961
config_current_version :3.2.7-22961
config_current_version :3.2.7-22961
app_build_version :22961
app_build_version :22961
[preload] succeeded. /opt/QQ/resources/app/major.node
[preload] succeeded. /opt/QQ/resources/app/major.node
[32043:0418/204235.119419:ERROR:browser_main_loop.cc(276)] GLib-GObject: g_value_set_boxed: assertion 'G_VALUE_HOLDS_BOXED (value)' failed
[32043:0418/204235.190439:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[32043:0418/204235.190489:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[32043:0418/204235.190508:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[32043:0418/204235.190523:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[32043:0418/204235.277447:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
Error occurred in handler for 'get-remote-win': Error: No handler registered for 'get-remote-win'
    at WebContents. (node:electron/js2c/browser_init:2:86829)
    at WebContents.emit (node:events:517:28)
[32043:0418/204235.994008:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[32043:0418/204235.994803:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix")
[32043:0418/204235.998563:ERROR:object_*****.cc(577)] Failed to call method: org.freedesktop.DBus.NameHasOwner: object_path= /org/freedesktop/DBus: unknown error type:
Reply View the author
deepin
2024-04-18 20:50
#7

我就改了一个地方,就是把enp7s0改成了wlo1。


#!/bin/bash
# 创建网络命名空间
ip netns add linuxqq 

# 创建 vethqq 对 
ip link add vethqq1 type veth peer name vethqq2 

# 将 vethqq2 移至新的网络命名空间
ip link set vethqq2 netns linuxqq 

# 配置 IP 地址
ip addr add 10.0.0.1/24 dev vethqq1 
ip link set vethqq1 up 

ip netns exec linuxqq ip addr add 10.0.0.2/24 dev vethqq2
ip netns exec linuxqq ip link set vethqq2 up 
ip netns exec linuxqq ip link set lo up 

# 添加默认网关
ip netns exec linuxqq ip route add default via 10.0.0.1

# iptables 配置 
echo 1 > /proc/sys/net/ipv4/ip_forward 
iptables -F FORWARD 
iptables -t nat -A POSTROUTING -s 10.0.0.0/255.255.255.0 -o wlo1 -j MASQUERADE
iptables -A FORWARD -o wlo1 -i vethqq1 -j ACCEPT
iptables -A FORWARD -i wlo1 -o vethqq1 -j ACCEPT

附上我ifconfig的回显结果:

image.png

Reply View the author
LuijpCN
deepin
2024-04-18 22:47
#8

我就改了一个地方,就是把enp7s0改成了wlo1。


#!/bin/bash
# 创建网络命名空间
ip netns add linuxqq 

# 创建 vethqq 对 
ip link add vethqq1 type veth peer name vethqq2 

# 将 vethqq2 移至新的网络命名空间
ip link set vethqq2 netns linuxqq 

# 配置 IP 地址
ip addr add 10.0.0.1/24 dev vethqq1 
ip link set vethqq1 up 

ip netns exec linuxqq ip addr add 10.0.0.2/24 dev vethqq2
ip netns exec linuxqq ip link set vethqq2 up 
ip netns exec linuxqq ip link set lo up 

# 添加默认网关
ip netns exec linuxqq ip route add default via 10.0.0.1

# iptables 配置 
echo 1 > /proc/sys/net/ipv4/ip_forward 
iptables -F FORWARD 
iptables -t nat -A POSTROUTING -s 10.0.0.0/255.255.255.0 -o wlo1 -j MASQUERADE
iptables -A FORWARD -o wlo1 -i vethqq1 -j ACCEPT
iptables -A FORWARD -i wlo1 -o vethqq1 -j ACCEPT

附上我ifconfig的回显结果:

image.png

echo 1 > /proc/sys/net/ipv4/ip_forward

换成

sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'

试试

Reply View the author
deepin
2024-04-19 08:12
#9
LuijpCN

echo 1 > /proc/sys/net/ipv4/ip_forward

换成

sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'

试试

我这边已经大致能够正常启动了。不过因为sudo单独的环境原因,我没法在其上创建的QQ程序中正常切换到中文输入法,而是只能使用英文,这种情况你知道该怎么解决嘛?

Reply View the author
deepin
2024-04-19 09:42
#10
LuijpCN

echo 1 > /proc/sys/net/ipv4/ip_forward

换成

sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'

试试

好吧,经过我的测试我已经发现,使用重命名的网络空间对我没有帮助,我的登陆ip固定下来了也提示我是新设备。他宝了个贝的就离谱。而且sudo启动QQ我没办法启用中文输入法,我所有程序都是这样,你没遇到这个情况吗?

至于你说的exec无法输入密码,需要免密有风险的问题,你要不要尝试把Exec改成下面的内容?

deepin-terminal -e 'sudo ip netns exec linuxqq setsid sudo -u keqing "/opt/QQ/qq" %U &'

注意改一下用户名和linuxQQ程序位置,会弹出一个终端窗口,输入密码之后终端进入后台会话启动QQ,而不需要免密,应该可用,我在终端中试过这个命令,但还没在Exec中试过,因为整个方法对我不起作用所以我就没放进desktop中

Reply View the author
LuijpCN
deepin
2024-04-19 13:52
#11

好吧,经过我的测试我已经发现,使用重命名的网络空间对我没有帮助,我的登陆ip固定下来了也提示我是新设备。他宝了个贝的就离谱。而且sudo启动QQ我没办法启用中文输入法,我所有程序都是这样,你没遇到这个情况吗?

至于你说的exec无法输入密码,需要免密有风险的问题,你要不要尝试把Exec改成下面的内容?

deepin-terminal -e 'sudo ip netns exec linuxqq setsid sudo -u keqing "/opt/QQ/qq" %U &'

注意改一下用户名和linuxQQ程序位置,会弹出一个终端窗口,输入密码之后终端进入后台会话启动QQ,而不需要免密,应该可用,我在终端中试过这个命令,但还没在Exec中试过,因为整个方法对我不起作用所以我就没放进desktop中

我也发现了,输入法不可用,QQ不稳定,不用了。
当时整好光顾着测试能不能保持登陆状态了。

Reply View the author
deepin
2024-04-19 14:21
#12
LuijpCN

我也发现了,输入法不可用,QQ不稳定,不用了。
当时整好光顾着测试能不能保持登陆状态了。

可是启动程序不需要sudo命令才对,只是进入命名空间需要啊

Reply View the author
Naraku_Night
deepin
2024-04-22 10:09
#13

我的使用网络命名空间后还需要固定一下mac地址,我用保存mac地址的方法解决的,不然依旧没法保存登录状态

免密风险的话也可以把sudo改成pkexec用polkit输密码验证

Reply View the author
Bryan
deepin
2024-06-04 08:37
#14

这里有一个更好的方法:https://alampy.com/2024/05/15/fix-mac-for-linux-qq/ 不需要sudo和pkexec

Reply View the author