惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Securelist
有赞技术团队
有赞技术团队
WordPress大学
WordPress大学
V
V2EX
Google DeepMind News
Google DeepMind News
B
Blog RSS Feed
The Register - Security
The Register - Security
Recorded Future
Recorded Future
Y
Y Combinator Blog
小众软件
小众软件
Jina AI
Jina AI
V2EX - 技术
V2EX - 技术
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Proofpoint News Feed
Engineering at Meta
Engineering at Meta
宝玉的分享
宝玉的分享
The Hacker News
The Hacker News
C
Cybersecurity and Infrastructure Security Agency CISA
K
Kaspersky official blog
博客园 - 三生石上(FineUI控件)
T
Threatpost
博客园 - 聂微东
Scott Helme
Scott Helme
IT之家
IT之家
N
Netflix TechBlog - Medium
T
The Exploit Database - CXSecurity.com
S
Schneier on Security
MongoDB | Blog
MongoDB | Blog
T
Tor Project blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
A
About on SuperTechFans
酷 壳 – CoolShell
酷 壳 – CoolShell
C
CERT Recently Published Vulnerability Notes
P
Palo Alto Networks Blog
Spread Privacy
Spread Privacy
C
Check Point Blog
L
LINUX DO - 最新话题
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Last Week in AI
Last Week in AI
Attack and Defense Labs
Attack and Defense Labs
T
Tailwind CSS Blog
罗磊的独立博客
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Webroot Blog
Webroot Blog
Help Net Security
Help Net Security
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
爱范儿
爱范儿
PCI Perspectives
PCI Perspectives
Security Latest
Security Latest

方永、南天紫雲

linux透明代理 技术的边界 停机问题通俗说明 Rust与oracle、redis集群的纠结 学习能力的增长 微信调试的原语 mac外接移动硬盘安装ArchLinux linux的死机问题 linux下全键盘操作 漂亮又好用的bspwm linux本机透明代理 ssh、mosh、autossh linux不能待机又一例 从WordPress切换到Hugo 折腾电脑开机 linux系统QQ新思路 Arch Linux的字体渲染 svn管理之submin OpenWrt自动fucking墙記錄 二维码(qrcode)名片的一些事儿 用lua nginx module搭建一个二维码(qr code)生成器 CentOS 7 安裝註記 php程序連接MySQL时只能127.0.0.1而localhost無法連接的問題 ThinkPad之FAN_ERROR、hi fi聲卡 jetty多端口部署 OpenWrt簡單暴力限網 linux中cron之PATH变量 OpenWrt的WDS無線橋接模式 再敘OpenWrt下的rtl8187無線中繼 sed之模擬tail 終端進化之二零一三 linux下的郵件服務器:postfix_dovecot_roundcube 一次性密碼/動態口令卡原理 xl2tp之VPN靜態地址分配 rtl2838U2832试用记 linux中pptp协议VPN搭建 glances监控工具安装 CentOS6.4硬盘安装 Debian Wheezy硬盤/U盤安裝小記 Kirby小試 zsh shell怎么打开常用的目录? OpenWrt SSH免密码使用密钥登录 linux中的vsftpd的匿名(anonymous)用户配置 無光驅無USB無軟驅,怎麼修復硬盤MBR? 那些個人網站 linuxFreeBSD下的dnspod动态域名客户端 Windows系统盘的32K之殇 一枚Chrome插件引起的大量磁盤IO問題 用批處理切換網卡的IP(適用Win7、Win8) Windows中的DHCP服务器 Win8啓動時出現“您的電腦需要修復”問題的解決辦法 Windows8睡眠(待机)模式异常处理 最强大好用而又小巧的计算器 Windows8運行不能保存歷史命令 Win8下的红警2尤里复仇 为cmd添加readline,如Bash Shell般使用cmd 手动添加修改win8 win+x菜单 Win8運行卸載程序時提示2503之解決一法 烽火HG110提权一法 缓解眼疲劳有效的办法 mintty乱码解决办法 糟糠美妾 免费易用的Win8 ArchLinux的類box環境音量調節二三事 使用OpenWrt与curl挂QQ OpenWrt的安全 OpenWrt BCM63xx rtl8187使用注意事项 Arch Linux之systmed使用简介 Archlinux 2012.07.15之后发布的镜像新手安装完全向导 FreeBSD 9.0 安装简记 记一由FreeBSD引发的午夜惊魂 Jekyll or handmade wi-fi无线破解过程与原理简要介绍 修复QQ影音异常卸载后的文件关联 吐槽一下000webhost 为OpenWrt的luci Web界面加速 最小的sed for Windows linux的磁盘自动挂载 OpenWrt中crontab -e的使用 sddns(dnspod client for OpenWrt)使用说明 OpenWrt中vsftp添加新用户 php+markdown写博客 linux arp防火墙之p2p终结者 墙外的世界很精彩 OpenWrt使用dnspod的动态域名解析(ddns)功能 OpenWrt架设nginx php网站 openwrt架设uhttpd+php+sqlite网站 vim自动跳到上次离开的光标位置 OpenWrt无线中继配置文件 修行八支 漫步者R201T打摩升级改造 阿里(Ali)3328系dvb接收机软件升级方法 db120刷OpenWrt固件并使用ppp方式ADSL拨号 移动短信助手 chrome tips一则 cdate,显示中国传统农历日期 更改硬盘模式为AHCI后Windows及linux的调整 使用grub2加载软盘和光盘镜像 电脑用数据线连接手机上网 电脑通过蓝牙连接手机GPRS上网
OpenWrt配置透明代理
zola · 2023-02-11 · via 方永、南天紫雲

上篇,固件更新了,更为重要的是配置好透明代理。

方案是Phantun + WireGuard + SmartDns

首先是 Phantun的配置:

Phantun官网即可下载预编译的binary,然后在 /etc/init.d/ 目录添加名为phantun的文件:

#!/bin/sh /etc/rc.common
# Copyright (C) 2006-2011 OpenWrt.org

START=50

USE_PROCD=1
PROG=/usr/local/bin/phantun

start_service() {
        procd_open_instance
        procd_set_param command "$PROG" --local 127.0.0.1:1234 --remote <your VPS IP>:5678
        procd_set_param respawn
        procd_close_instance
}

phantun将以服务的形式启动和管理。

备注:记得在远端用 nft list table inet nat 查看端口号。

phantun 需要创建tun设备,故依赖 kmod-tun,检查此内核模块已安装。

若需要调试,在shell中直接运行 RUST_LOG=info /usr/local/bin/phantun --local 127.0.0.1:1234 --remote x.com:5678

在luci的 Network->Interfaces 中添加Protocol为 UnmanagedinterfaceDevicetun0Firewall Settings选择lan

然后是 WireGuard的配置:

在luci的 Network->Interfaces 中添加Protocol为 WireGuard VPNinterfaceFirewall Settings选择wan。添加完成后/etc/config/network会新增如下配置项:

config interface 'wg0'
        option proto 'wireguard'
        option private_key 'xxx'
        list addresses '10.0.0.2'
        option mtu '1200'
        option ip4table '21'
        option delegate '0'

config wireguard_wg0 'wgserver'
        option description 'a'
        option public_key 'xxx'
        option endpoint_host '127.0.0.1'
        option endpoint_port '1234'
        option persistent_keepalive '25'
        list allowed_ips '0.0.0.0'
        option route_allowed_ips '1'

config wireguard_wg0
        option description 'b'
        option public_key 'xxx'
        option endpoint_host 'xxx'
        option persistent_keepalive '20'
        list allowed_ips '10.0.0.2'
        option route_allowed_ips '1'

注意:上述配置添加了两个peer a 和 b, a 作为默认节点(配置了list allowed_ips '0.0.0.0'),所以wg0的下一跳会路由到这个节点;b 显式地配置了路由,即 list allowed_ips '10.0.0.2',那么目的地址是 10.0.0.2 的数据包会路由到这个peer。

wg show 查看,应该已经握手成功。

接下来配置路由,相关命令如下:

nft add set inet fw4 fq { type ipv4_addr \;}
nft add element inet fw4 fq { 10.0.0.1 }
nft add rule inet fw4 mangle_output ip daddr @fq counter mark set 0x15
nft add rule inet fw4 mangle_prerouting ip daddr @fq counter mark set 0x15
ip rule add fwmark 0x15 table 21
ip route add 192.168.1.0/24 dev br-lan table 21

意思就是添加一个名为fq的 nft set,并将所有目的地址在这个set中的数据包添加标记0x15, 然后添加规则将所有标记0x15的数据包使用表21的路由配置,在21的路由表中,添加默认路由到wg0。

当然,这只是调试时的写法,nft命令对应的配置添加到/etc/nftables.d/10-custom-filter-chains.nft:

set fq {
    typeof ip daddr
    flags interval
    auto-merge
    elements = { 10.0.0.0/24, 1.1.1.1 }
}

chain mangle_prerouting {
    type filter hook prerouting priority mangle; policy accept;
    ip daddr @fq counter mark set 0x15;
}

chain mangle_output {
    type route hook output priority mangle; policy accept;
    ip daddr @fq counter mark set 0x15;
}

ip命令对应的配置添加到/etc/config/network:

config rule
        option lookup '21'
        option mark '0x15'

config route
        option interface 'lan'
        option target '192.168.1.0/24'
        option table '21'

或通过luci添加。

此时 ping 10.0.0.1,可以ping通,10.0.0.1是WireGuard的一个peer的地址。 如果 ping 超时,用 ip rule 查看是否有 from all fwmark 0x15 lookup 21 条目, 如果没有且配置正确,尝试重启路由器。或者查看路由表21 ip r show table 21,正确的路由项如下:

default dev wg0 scope link
10.0.0.2 dev wg0 scope link
192.168.1.0/24 dev br-lan scope link

可尝试用 traceroute 1.1.1.1 在OpenWrt上跟踪路由是否正确配置。

2023年12月02日更新

存在A、B、C、D 4个 WireGuard的节点, 如图所示:

若要通过C和B连通D和A,其中B节点是本文提到的OpenWrt, 则此OpenWrt还需要添加如下路由:

config rule
    option dest '10.0.0.0/24'
    option lookup '0x15'

当然,每个节点的 allow-ips 仍需正确配置。若 nftables set 中有 10.0.0.0/24, 那么这条规则无需配置。

2025年03月22日补充

如果公网IP变更,可能会导致 phantun 连接失效,从而导致服务不可用。 一个可能有效的办法是添加watchdog,在 /etc/udhcpc.user.d/10-restart-phantun 中添加:

/etc/init.d/phantun restart

使用 killall -SIGUSR1 udhcpc, 用 logread 查看是否生效。

更新:

此方式不太好用,会导致过于频率触发 phantun restart,建议参考 /usr/bin/wireguard_watchdog ,用上次握手时间去判断。

2025年06月20日更新

将WireGuard的firewall配置由lan改为wan,这样做的好处是不必再添加TCP MSSNAT MASQUERADE 规则,不足之处是路由器的80,22等端口的服务需要修改配置和添加规则,才能在WireGuard的其它节点访问,权衡之下,wan场景更常见一些。

WireGuard之MTU、MSS 这篇文章里有些调试的记录。

TCP MSS 的配置如下,写入 /etc/nftables.d/10-custom-filter-chains.nft 中:

chain mangle_forward {
    type filter hook forward priority mangle; policy accept;
    iifname "wg0" tcp flags & (fin | syn | rst) == syn tcp option maxseg size set rt mtu comment "!fw4: WireGuard wg0 ingress MTU fixing"
}

chain mangle_postrouting {
    type filter hook postrouting priority mangle; policy accept;
    oifname "wg0" tcp flags & (fin | syn | rst) == syn tcp option maxseg size set rt mtu comment "!fw4: WireGuard wg0 egress MTU fixing"
}

如果需要lan的方式,可使用上面的firewall配置;

如果是wan的方式,在luci的 Network->Firewall->Traffic Rules 中添加允许wan访问80,22端口的规则。

SmartDns的配置:

官网下载ipk并安装, 注意必须是39以后的版本,代理相关的配置有以下两行:

domain-set -name fq -type list -file fq.list
domain-rules /domain-set:fq/ -nameserver fq -nftset #4:inet#fw4#fq

将需要代理的域名放在/etc/smartdns/fq.list

配置完成。

请求 fq.list 中的域名,查看 nftables 的set 是否增加相对应的IP。

nft list set inet fw4 fq