Linux 路由器
一条命令将 Linux 设置为路由器。能够提供互联网连接或创建 WiFi 热点。支持透明代理(redsocks)。同时也适用于虚拟机/容器的路由。
它封装了 iptables
、dnsmasq
等工具。一条命令使用,一条命令还原或通过 control-c
恢复(甚至关闭终端窗口即可恢复)。
Linux-Router 新闻 & 开发者笔记 📰 | 更多工具和项目 🛠️ | 🍻 请我喝杯咖啡 ❤️
功能
基本功能:
- 创建一个 NAT 子网
- 提供互联网连接
- DHCP 服务器(和 RA)
- 指定 DHCP 服务器分配给客户端的 DNS
- DNS 服务器
- 指定上游 DNS (类似简单的 DNS 代理)
- IPv6 (在 NAT 局域网后,类似 IPv4)
- 创建 WiFi 热点:
- 选择信道
- 选择加密方式: WPA2/WPA、WPA2、WPA、无加密
- 在获取互联网的同一接口上创建 AP (通常需要相同信道)
- 透明代理 (redsocks)
- 透明 DNS 代理 (劫持 53 端口数据包)
- 检测 NetworkManager 并确保不会干扰 (处理接口(非)托管状态)
- 检测 firewalld 并确保不会干扰 (通过使用
trusted
区域) - 可以运行多个实例,创建多个不同的网络。具有实例管理功能。
更多功能请参见下方命令行用法
适用场景
互联网----(eth0/wlan0)-Linux-(wlanX)AP
|--客户端
|--客户端
互联网
WiFi AP(无DHCP) |
|----(wlan1)-Linux-(eth0/wlan0)------
| (DHCP)
|--客户端
|--客户端
互联网
交换机 |
|---(eth1)-Linux-(eth0/wlan0)--------
|--客户端
|--客户端
互联网----(eth0/wlan0)-Linux-(eth1)------另一台PC
互联网----(eth0/wlan0)-Linux-(虚拟接口)-----虚拟机/容器
安装
单文件脚本。在 GitHub 上的 Linux-router 仓库发布。只需下载并运行 bash 脚本(满足依赖)。这种情况下无需安装即可使用。
我目前没有为任何发行版打包。如果你打包了,欢迎提交 PR 并在此处添加链接(可以带版本徽章)
Linux 发行版 | |
---|---|
任意 | 下载单文件脚本并无需安装即可运行 |
依赖
- bash
- procps 或 procps-ng
- iproute2
- dnsmasq
- iptables (或带
iptables-nft
转换链接的 nftables) - WiFi 热点依赖
- hostapd
- iw
- iwconfig (仅当 'iw' 无法识别你的适配器时需要)
- haveged (可选)
用法
为一个接口提供互联网
sudo lnxrouter -i eth1
无论你从哪个接口(除了 eth1
)获取互联网。
创建 WiFi 热点
sudo lnxrouter --ap wlan0 MyAccessPoint -p MyPassPhrase
无论你从哪个接口获取互联网(即使是 wlan0
)。将为热点创建虚拟接口 x0wlan0
。
将一个接口的互联网提供给另一个接口
客户端只通过 isp5
访问互联网
sudo lnxrouter -i eth1 -o isp5 --no-dns --dhcp-dns 1.1.1.1 -6 --dhcp-dns6 [2606:4700:4700::1111]
在这种用法下,建议:
- 停止提供本地 DNS
- 告诉客户端使用哪个 DNS (ISP5 的 DNS。或者,安全的公共 DNS,如上例所示)
创建局域网而不提供互联网
sudo lnxrouter -n -i eth1
sudo lnxrouter -n --ap wlan0 MyAccessPoint -p MyPassPhrase
为 LXC 提供互联网
创建一个桥接
sudo brctl addbr lxcbr5
在 LXC 容器的 config
中
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxcbr5
lxc.network.hwaddr = xx:xx:xx:xx:xx:xx
sudo lnxrouter -i lxcbr5
透明代理
所有客户端的互联网流量都通过,例如,Tor(注意此例并非匿名用途)
sudo lnxrouter -i eth1 --tp 9040 --dns 9053 -g 192.168.55.1 -6 --p6 fd00:5:6:7::
在 torrc
中
TransPort 192.168.55.1:9040
DNSPort 192.168.55.1:9053
TransPort [fd00:5:6:7::1]:9040
DNSPort [fd00:5:6:7::1]:9053
警告: Tor 的匿名性依赖于专门设计的浏览器。像这样使用 Tor(将 Tor 网络共享给局域网客户端)不能确保匿名性。
尽管我们在这里使用 Tor 作为示例,但 Linux-router 并不确保也不以匿名性为目标。
客户端沙盒网络
不向客户端提供我们的信息。客户端仍可访问互联网。
sudo lnxrouter -i eth1 \
--tp 9040 --dns 9053 \
--random-mac \
--ban-priv \
--catch-dns --log-dns # 可选
Linux-router 不提供任何保证。使用风险自负
用作 LXD 的透明代理
创建一个桥接
sudo brctl addbr lxdbr5
创建并添加一个新的 LXD 配置文件来覆盖容器的 eth0
lxc profile create profile5
lxc profile edit profile5
### 配置文件内容 ###
config: {}
description: ""
devices:
eth0:
name: eth0
nictype: bridged
parent: lxdbr5
type: nic
name: profile5
lxc profile add <容器名> profile5
sudo lnxrouter -i lxdbr5 --tp 9040 --dns 9053
从容器中移除新配置文件
lxc profile remove <容器名> profile5
不使用配置文件
向容器添加新的 eth0
,覆盖默认的 eth0
lxc config device add <容器名> eth0 nic name=eth0 nictype=bridged parent=lxdbr5
移除自定义的 eth0
以恢复默认的 eth0
lxc config device remove <容器名> eth0
用作 VirtualBox 的透明代理
在 VirtualBox 的全局设置中,创建一个禁用 DHCP 的仅主机网络 vboxnet5
。
sudo lnxrouter -i vboxnet5 --tp 9040 --dns 9053
用作 firejail 的透明代理
创建一个网桥
sudo brctl addbr firejail5
sudo lnxrouter -i firejail5 -g 192.168.55.1 --tp 9040 --dns 9053
firejail --net=firejail5 --dns=192.168.55.1 --blacklist=/var/run/nscd
Firejail 的 /etc/resolv.conf
不会从 DHCP 获取 DNS,所以我们需要手动分配。
nscd 是域名缓存服务,在这里不应该从 jail 内访问。
命令行用法和其他功能
用法: lnxrouter <选项>
选项:
-h, --help 显示此帮助信息
--version 打印版本号
-i <接口> 指定用于创建 NAT 子网并提供互联网的接口
(创建 WiFi 热点请使用 '--ap' 选项)
-o <接口> 指定提供互联网的接口
(注意:使用此选项和默认 DNS 选项可能会将查询泄露到其他接口)
-n 不提供互联网
--ban-priv 禁止客户端访问我的私有网络
-g <ip> 此主机在子网中的 IPv4 地址(子网掩码为 /24)
(例如: '192.168.5.1' 或简写为 '5')
-6 启用 IPv6 (NAT)
--no4 禁用 IPv4 互联网(不转发 IPv4)
通常与 '-6' 一起使用
--p6 <前缀> 设置 IPv6 LAN 地址前缀(长度为 64)
(例如: 'fd00:0:0:5::' 或简写为 '5')
使用此选项会启用 '-6'
--dns <ip>|<端口>|<ip:端口>
DNS 服务器的上游 DNS
使用 ',' 分隔多个服务器
(默认: 使用 /etc/resolv.conf)
(注意 IPv6 地址需要用 '[]' 括起来)
--no-dns 不提供 DNS 服务
--no-dnsmasq 禁用 dnsmasq 服务器 (DHCP, DNS, RA)
--catch-dns 透明 DNS 代理,将目标端口为 53 的数据包(TCP/UDP)
重定向到此主机
--log-dns 显示 DNS 查询日志 (dnsmasq)
--dhcp-dns <IP1[,IP2]>|no
设置 DHCP 提供的 IPv4 DNS(默认:此主机)
--dhcp-dns6 <IP1[,IP2]>|no
设置 DHCP (RA) 提供的 IPv6 DNS
(默认: 此主机)
(注意 IPv6 地址需要用 '[]' 括起来)
同时使用以上两个选项将启用 '--no-dns'
--hostname <名称> DNS 服务器将此名称与此主机关联
使用 '-' 从 /etc/hostname 读取名称
-d DNS 服务器将考虑 /etc/hosts 文件
-e <hosts 文件> DNS 服务器将考虑额外的 hosts 文件
--dns-nocache DNS 服务器不使用缓存
--mac <MAC> 设置 MAC 地址
--random-mac 使用随机 MAC 地址
--tp <端口> 透明代理,
将非 LAN 的 TCP 和 UDP(未经测试)流量重定向到
指定端口(通常与 '--dns' 一起使用)
WiFi 热点选项:
--ap <WiFi 接口> <SSID>
创建 WiFi 接入点
-p, --password <密码>
WiFi 密码
--qr 在终端显示 WiFi 二维码(需要 qrencode)
--hidden 隐藏接入点(不广播 SSID)
--no-virt 不创建虚拟接口
使用此选项后,无法同时使用同一个 wlan 接口
提供互联网和创建 AP
--virt-name <名称> 设置虚拟接口的名称
-c <信道> 指定信道(默认:使用当前信道,或 1 / 36)
--country <代码> 设置两字母国家代码以符合规定
(例如: US)
--freq-band <GHz> 设置频段: 2.4 或 5 (默认: 2.4)
--driver 选择 WiFi 适配器驱动程序(默认: nl80211)
-w <WPA 版本> '2' 表示 WPA2,'1' 表示 WPA,'1+2' 表示两者都支持
(默认: 2)
--psk 使用 64 位十六进制预共享密钥,而不是密码短语
--mac-filter 启用 WiFi 热点 MAC 地址过滤
--mac-filter-accept WiFi 热点 MAC 地址过滤列表的位置
(默认为 /etc/hostapd/hostapd.accept)
--hostapd-debug <级别> 1 或 2。传递 -d 或 -dd 给 hostapd
--isolate-clients 禁用客户端之间的 WiFi 通信
--no-haveged 在需要时不自动运行 haveged
--hs20 启用 Hotspot 2.0
WiFi 4 (802.11n) 配置:
--wifi4 启用 IEEE 802.11n (HT)
--req-ht 要求站点 HT(高吞吐量)模式
--ht-capab <HT 能力> HT 能力(默认: [HT40+])
WiFi 5 (802.11ac) 配置: --wifi5 启用 IEEE 802.11ac (VHT) --req-vht 要求站点使用 VHT (Very High Throughput) 模式 --vht-capab <VHT 能力> VHT 能力
--vht-ch-width <索引> VHT 信道宽度索引:
0 表示 20MHz 或 40MHz (默认)
1 表示 80MHz
2 表示 160MHz
3 表示 80+80MHz (非连续 160MHz)
--vht-seg0-ch <信道> 主要段 VHT 中心频率的信道索引。
与 '--vht-ch-width' 一起使用
--vht-seg1-ch <信道> 次要段(第二个 80MHz)VHT 中心频率的信道索引。
与 '--vht-ch-width 3' 一起使用
实例管理:
--daemon 在后台运行
-l, --list-running 显示正在运行的实例
--lc, --list-clients <id|接口>
列出一个实例的客户端。或列出一个接口的邻居,
即使该接口不由我们处理(被动模式)
--stop
示例: lnxrouter -i eth1 lnxrouter --ap wlan0 MyAccessPoint -p MyPassPhrase lnxrouter -i eth1 --tp <透明代理> --dns <DNS代理>