Linux路由配置筆記
硬體準備
- CPU:i3-8300T, TDP 35W
- Memory:海盜船 DDR4 2440, 8Gx2
-
Motherboard:華擎 Z370M-ITX/ac, Intel Z370/LGA 1151
官網連結
-
關注特性:
- 雙千兆網絡卡
- 802.11ac wifi
- 藍芽 4.2
- 其他特性:2HDMI,1DisplayPort,三顯示器同時輸出
-
關注特性:
- Storage:Intel 760P 512G , 標稱效能:read 3230MB/s, write: 1625MB/s 4k read: 340000 IOPS, 4k write: 275000 IOPS
- 電源:銀欣 300W ST30SF SFX電源 80PLUS銅牌
- 機箱:銀欣(SG13B 珍寶13 SFF機箱
- 風扇:酷冷至尊T520下壓式CPU散熱器
作業系統
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 lobrlan 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能行,然後一再強調別這麼幹,有法律風險。之前還看到一篇說是修改驅動可以,我很懷疑。中途還打算試試看改FW,看了幾眼iwlwifi的原始碼和簽名問題,放棄了。
以後很長一段時間大概都沒有胃口去碰wifi網絡卡了......
藍芽
發現自己對藍芽的應用方面的概念其實瞭解的很少,需要系統地補補課。bluetoothctl很強大,但我不太會用,雖然用它成功地和我的手機配對了。文件推薦的應用工具blueman是個圖形介面工具,我不方便用。配置過程中,唯一值得一記的就是安裝bluetoothd要修改一下systemd的配置檔案/etc/systemd/system/bluetooth.target.wants/bluetooth.service
, 禁用sap,修改如下:
ExecStart=/usr/lib/bluetooth/bluetoothd --noplugin=sap
問題處理
-
想開unprivileged container,遇到好幾個問題。一方面我升級到了最新的lxc 3.0.3,但是網上的文件都是老的,網站linuxcontainer的是新的,但是很多細節沒交代清楚,又和以前不一樣。
id_map
換成idmap
這種還算好找的。apparmor的一些錯誤一番搜尋之後修正了。