页面

分类

LXC容器内使用sshfs

2019年5月11日星期六, by wingfire ; 分类: 计算机技术; 0 comments

为了避免所做的设置分散化,我设置了一个lxc容器专门用于管理工作,这样避免了不同机器之间到处相互可以登录。我可以在管理机器上做好配置,然后下发到各工作机器。但是有时候又确实需要在工作机之间传递数据,scp又不支持从一个远程机器复制到另一个远程机器,这时将其中一台机器通过sshfs挂载到本地就会方便很多。

lxc默认没有fuse设备,需要手动创建:

mknod -m 666 /dev/fuse c 10 229

在lxc的config中也许可以指定创建,但是我觉得不应该采用bind选项,这里只是想独立地mount到管理容器中,而不想干扰host机器。

SSH的Github多账户配置

2019年5月5日星期日, by wingfire ; 0 comments

又新开了一个github账户,以防不测。

习惯了使用ssh key访问Github,在给新账户添加ssh公钥的时候,Github禁止添加重复的密钥,换句话说,两个账户不可以共享同一个密钥。给不同的用户设置不同的密钥本来很简单:


Host github.com
        HostName github.com
        User git
        IdentityFile ~/.ssh/id_rsa

但是这个对于Github的多账户不行,因为所有账户用的都是同一个ssh账户git。解决办法仍然是通过修改~/.ssh/config:


Host github.com-user1
        HostName github.com
        User git
        IdentityFile ~/.ssh/id_rsa_user1

Host github.com-user2
        HostName github.com
        User git
        IdentityFile ~/.ssh/id_rsa_user2

通过-userX这个Host后缀可以区分。


补充:

上面的内容根本没抓到要点,但是我当时在尝试的时候完全是因为意外导致的:我开启了SSH的ControlMaster,而ControlPath的编码方式又完全不能区分两者,导致某些时候错用了私钥才成功的。根本原因在于Host指定了别名,并且仓库URL链接中的github.com要替换成相应的别名,这样才能真正成功。这样机制上就完全搞明白是怎么工作的了,和Git本身没太大关系,主要是SSH的选择在起作用。

这么做对我来说是够用的,但不够友好和一般化。

Linux路由配置笔记

2019年4月30日星期二, by wingfire ; 0 comments

硬件准备

操作系统

Debian stretch (9.8)。安装完成后,apt source添加了Buster和sid。

安装过程中用了wifi联网,提示需要3168-26.ucode,到另一台机器用apt download firmware-iwlwifi deb包下来,然后找个u盘,放在u盘的firmware目录下,继续安装。

考虑到会重度使用lxc,btrfs对此有比较好的支持,因此建了一个lvm卷挂到/var/lib/lxc上。

系统配置

网络配置

主机网络配置

这块板子有两个千兆口,一个是I219-V, 另一个是I211 AT. 一个无线网卡,3168NGW。I219-V芯片官网报价$1.72,够廉价的,用来连wan合适。另一块I211算是小惊喜,除了支持4个收发队列外,还支持巨帧和VLAN,官网报价$2.13。3168NGW官网价格$5.00,比俩千兆口加起来都贵。

物理机器上建两个bridge,brlan和brwan,分别用于桥接局域网和广域网。I219接在brwan上,I211和wifi接在brlan上。开一个lxc容器作为路由,有两块网卡,分跨两个bridge,作为路由。配置阶段为了方便,暂时给brwan分配了一个地址,等配置完就会去掉。物理host机器将来也通过路由容器访问外网,这样更安全。


auto lo  brlan brwan eth0 eth1 wlan0
iface lo inet loopback

allow-hotplug eth0 eth1

iface brlan inet static
    bridge_ports eth0 wlan0
    bridge_stp off
    address 192.168.1.10
    netmask 255.255.255.0
    gateway 192.168.1.1


iface brwan inet static
    bridge_ports eth1
    bridge_stp off

brlan上静态分配内网地址是必要的,因为路由容器启动会比主机晚,也方便容器出问题时直接通过ip地址访问主机。brwan上刻意不分配地址,禁止外网直接访问主机,主机访问外网也需要从brlan出发,经路由容器NAT,再经brwan出去。这样更安全些。为了方便远程配置网络,也可以在配置阶段先分配一个内网地址,等配置完成再去掉。

主机上也不要配置路由,路由由容器充当。安全防御做在路由容器上,这样物理主机的防火墙似乎不需要了,毕竟连ip地址没有,路由也没有。这么做是否安全,我也没把握,希望有专家指正。

理想状况下,主机也不需要配置wlan0,而是交给路由容器去配置。但是不知道怎么把wifi网卡这种设备转给容器访问,留待以后有机会再尝试吧。所以目前的做法是在主机跑hostapd,提供ap,dhcp和dns则由路由容器提供。

创建Lxc容器

创建两个lxc容器,一个用于路由,另一个用于测试。


lxc-create -t download -n route -- -d debian -r sid  -a amd64
lxc-copy -N test -n route

先编辑容器route的配置,/var/lib/lxc/route/config:


#eth0
lxc.net.0.type = veth
lxc.net.0.flags = up
lxc.net.0.link = brwan
#eth1
lxc.net.1.type = veth
lxc.net.1.flags = up
lxc.net.1.link = brlan

lxc.include = /usr/share/lxc/config/debian.common.conf

lxc.tty.max = 4
lxc.arch = amd64
lxc.start.auto = 1     #自动启动
lxc.uts.name = route

### for openvpn
lxc.mount.entry = /dev/net dev/net none bind,create=dir
lxc.cgroup.devices.allow = c 10:200 rwm
lxc.rootfs.path = btrfs:/var/lib/lxc/route/rootfs

test的配置,关键部分:

lxc.net.0.type = veth
lxc.net.0.flags = up
lxc.net.0.link = brlan

新版本的lxc生成的config文件中会有这样两句:


lxc.apparmor.profile = generated
lxc.apparmor.allow_nesting = 1

在config文件所在目录还会生成一个apparmor目录,其中是apparmor的相关配置。我的route其实是以前配置好的,没有apparmor目录内的内容,导致dmesg信息中被一大堆apparmor的错误信息洗版了,什么有用信息都看不到了。修复方法就是复制一份好的过来,修改容器名称相关的部分就好。

路由配置

基础网络配置

lxc-attach route进入路由容器,先开启路由功能


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

编辑 /etc/sysctl.d/10-network.conf,添加:


net.ipv4.ip_forward=1

net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr

后两行是设置Tcp拥塞控制算法为BBR,不是必须的。

配置/etc/network/interfaces:


auto lo eth0 eth1
iface lo inet loopback

iface eth0 inet dhcp

iface eth1 inet static
    address 192.168.1.1
    netmask 255.255.255.0

eth0接外网,eth1接内网。因为自己是路由器,eth1上就不要指定gateway了。重启网卡:


ifdown eth0
ifdown eth1
ifup eth0
ifup eth1

接着开启NAT,其实一句就可以:iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

重启路由后要能自动开启NAT,因此创建文件 /etc/network/if-up.d/iptables


#! /bin/sh

iptables -F
iptables -t nat -F
iptables -t mangle -F

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

前三句是清空iptables的规则表。保存好文件后别忘了chmod +x iptables

unbound配置

这个就是用来反域名污染的。配置如下:


server:
        do-daemonize: no
    interface: 127.0.0.1@1053
    tcp-upstream: yes
    tls-cert-bundle: /etc/ssl/certs/ca-certificates.crt

forward-zone:
    name: "."
    forward-tls-upstream: yes
    forward-addr: 1.1.1.1@853#cloudflare-dns.com

一般的dns查询交给dnsmasq来完成,受污染的域名就交给unbound,走DNS-over-TLS

Dnsmasq配置

首先安装dnsmasq: apt install -y dnsmasq

先修改/etc/resolv.conf


search lan
nameserver 127.0.0.1

让域名解析指向本机,这里的lan是你的本地域名后缀。你不要search这一行也可以,dnsmasq相应的不配就行了。

创建文件/etc/hosts.dnsmasq如下:


192.168.1.1 route route.lan
192.168.1.10 bare bare.lan

这个是添加路由和主机的域名到dnsmasq,因为这俩都不是通过dhcp分配地址的。

不要动/etc/dnsmasq.conf,这个文件可以当作文档用,别改乱了。实际的配置可以放在/etc/dnsmasq.d/default.conf中:


interface=eth1 #内网网关接口
dhcp-range=192.168.1.50,192.168.1.200,255.255.255.0,1h  #地址池范围
no-hosts                 #忽略/etc/hosts文件
addn-hosts=/etc/hosts.dnsmasq     #添加静态主机名
domain=lan                 #指定本地域名

cache-size=1500
except-interface=eth0  # 排除wan口

all-servers
server=8.8.8.8
server=114.114.114.114

dhcp-option=121,0.0.0.0/0,192.168.1.1

我这里的server用的指定的dns,如果wan口的eth0是通过dhcp获得ip的,而你又想使用isp提供的dns服务器,那就需要编辑dhclient的配置文件,加入一行:


prepend domain-name-servers 127.0.0.1;

完了需要定制一下dnsmasq吧?在中国大陆没办法的事。参考https://github.com/felixonmars/dnsmasq-china-list

我在上面还跑了openvpn,这里就不多说了。

AP配置

在物理主机上安装hostapd,配置如下:


interface=wlp3s0
driver=nl80211
bridge=brlan
ssid=lostemple
hw_mode=g
#country_code=CN
channel=1
ieee80211n=1
ieee80211ac=1

auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
wpa_passphrase=GreatWall

这样AP能起来。我本来觉得差不多就可以了,但是性能实在太差了。不但速度慢,信号也差,远一点就衰减得厉害。所以要加入下面的配置:


ht_capab=[HT40+][DSSS_CCK-40][RX-STBC1][SHORT-GI-40][SHORT-GI-20]

wmm_enabled=1
wmm_ac_bk_cwmin=4
wmm_ac_bk_cwmax=10
wmm_ac_bk_aifs=7
wmm_ac_bk_txop_limit=0
wmm_ac_bk_acm=0

wmm_ac_be_aifs=3
wmm_ac_be_cwmin=4
wmm_ac_be_cwmax=10
wmm_ac_be_txop_limit=0
wmm_ac_be_acm=0

wmm_ac_vi_aifs=2
wmm_ac_vi_cwmin=3
wmm_ac_vi_cwmax=4
wmm_ac_vi_txop_limit=94
wmm_ac_vi_acm=0

wmm_ac_vo_aifs=2
wmm_ac_vo_cwmin=2
wmm_ac_vo_cwmax=3
wmm_ac_vo_txop_limit=47
wmm_ac_vo_acm=0

重点是ht_capab那一行。方括号内的都是参数,要参考hostapd.conf的文档,看ht_capab支持哪些,还要看iw list的输出,看网卡实际支持哪些功能,把网卡支持的给加进去。

至于wmm_enabled,只是enable一下是不够的,后面那一堆wmm_XXX 参数必须都设置才能真正使得WMM生效。这些参数都是从hostapd.conf的建议值抄来的,具体怎么工作的我还没搞明白,不太想搞这个。

反正,这么操作一下,这个软AP的性能终于赶上原来的无线路由了,性能和稳定性更好。但糟心的是信号传输距离表现不如旧无线路由,看来还是得买ap。

关于5G

为了开AP 5G频段,我至少花了20个小时吧,远超其他所有任务的时间总和加上写这篇笔记。悲剧的是没有搞定无线电监管的问题。最终在Intel 官网上找到官方说明,明确了就是不支持5G的AP模式,放弃了。尝试了很多次,对其他网卡有效的办法,对Intel的网卡就是无效。系统监管地区可以修改,但是无论怎么改,都不能影响网卡上的设置,我怀疑关键是卡在网卡的Firmware上。有两篇特别提到Intel网卡的文章,一个是说是有办法绕过监管,试了,行不通。另一个是一个俄国人问iwlwifi的开发者,说是旧FW曾经是可以的,为什么新的FW不行了。iwlwifi的那位表示很惊讶居然有旧FW能行,然后一再强调别这么干,有法律