标题:用Firewalld + systemd.slice + redir實現TCP + UDP透明代理
作者:
日期:2021-06-15 21:59:53
内容:

现在网上已经有不少用 iptables 或 nftables 实现透明代理(Tproxy)的例子了。绝大多数关于透明代理的教程都是通过 iptables 实现的,也有少量使 用新一代的 nftables 内核防火墙前端来实现。然而,消费级电脑上通常会装有更简化的防火墙程序,例如 Fedora/CentOS/SUSE 自带的 Firewalld,或 Ubuntu 的 UFW。在用这些简化前端的同时,直接操作 nftables 和 iptables 的话可能会造成冲突,更好的解法是全部工作都由 firewalld/ufw 来做。

本文就以 firewalld 为例,用它的 direct rules 来实现透明代理(没错,firewalld 并不提供关于透明代理的抽象,所以并不比 iptables 有优势)。

想要实现的效果

  • TCP 和 UDP 流量自动转给 Clash(或 shadowsocks 等)
  • Clash 本身不会把流量转发给自己
  • 可以让某些 程序 不转发给 clash,直接联网

Get started

先来设置变量,指向 clash 的 redir-port

export proxy_port=7892 # 按你 clash 的设置修改

接着设置 firewalld 和 ip route。 Firewalld 的 direct rules 语法几乎等同于 iptables(因为实际上就是调用 iptables 来执行 direct rules)。所以这里直接照抄 systemd.slice + iptables + redir:如何在 Arch Linux 上配置透明代理 的规则,稍有修改:

#tcp
sudo firewall-cmd --direct --add-chain ipv4 nat clash
sudo firewall-cmd --direct --add-rule ipv4 nat clash 1 -m cgroup --path "clash.slice" -j RETURN
sudo firewall-cmd --direct --add-rule ipv4 nat clash 1 -d 0.0.0.0/8 -j RETURN
sudo firewall-cmd --direct --add-rule ipv4 nat clash 1 -d 10.0.0.0/8 -j RETURN
sudo firewall-cmd --direct --add-rule ipv4 nat clash 1 -d 127.0.0.0/8 -j RETURN
sudo firewall-cmd --direct --add-rule ipv4 nat clash 1 -d 169.254.0.0/16 -j RETURN
sudo firewall-cmd --direct --add-rule ipv4 nat clash 1 -d 172.16.0.0/12 -j RETURN
sudo firewall-cmd --direct --add-rule ipv4 nat clash 1 -d 192.168.0.0/16 -j RETURN
sudo firewall-cmd --direct --add-rule ipv4 nat clash 1 -d 224.0.0.0/4 -j RETURN
sudo firewall-cmd --direct --add-rule ipv4 nat clash 1 -d 240.0.0.0/4 -j RETURN

sudo firewall-cmd --direct --add-rule ipv4 nat clash 2 -p tcp -j REDIRECT --to-port "$proxy_port"

sudo firewall-cmd --direct --add-rule ipv4 nat OUTPUT 1 -p tcp -j clash

#udp
sudo ip rule add fwmark 1 table 100
sudo ip route add local default dev lo table 100
sudo firewall-cmd --direct --add-chain ipv4 mangle clash
sudo firewall-cmd --direct --add-rule ipv4 mangle clash 1 -m cgroup --path "clash.slice" -j RETURN
sudo firewall-cmd --direct --add-rule ipv4 mangle clash 1 -d 0.0.0.0/8 -j RETURN
sudo firewall-cmd --direct --add-rule ipv4 mangle clash 1 -d 10.0.0.0/8 -j RETURN
sudo firewall-cmd --direct --add-rule ipv4 mangle clash 1 -d 127.0.0.0/8 -j RETURN
sudo firewall-cmd --direct --add-rule ipv4 mangle clash 1 -d 169.254.0.0/16 -j RETURN
sudo firewall-cmd --direct --add-rule ipv4 mangle clash 1 -d 172.16.0.0/12 -j RETURN
sudo firewall-cmd --direct --add-rule ipv4 mangle clash 1 -d 192.168.0.0/16 -j RETURN
sudo firewall-cmd --direct --add-rule ipv4 mangle clash 1 -d 224.0.0.0/4 -j RETURN
sudo firewall-cmd --direct --add-rule ipv4 mangle clash 1 -d 240.0.0.0/4 -j RETURN
sudo firewall-cmd --direct --add-rule ipv4 mangle clash 2 -p udp -j TPROXY --on-port "$proxy_port" --tproxy-mark 1
sudo firewall-cmd --direct --add-rule ipv4 mangle OUTPUT 0 -p udp -j clash # 这里可能有错(`failed: iptables-restore: line 3 failed`),欢迎指正
sudo firewall-cmd --direct --add-chain ipv4 nat CLASH_DNS
sudo firewall-cmd --direct --remove-rules ipv4 nat CLASH_DNS 
sudo firewall-cmd --direct --add-rule ipv4 nat CLASH_DNS 1 -p udp -j REDIRECT --to-port 1053
sudo firewall-cmd --direct --add-rule ipv4 nat OUTPUT 0 -p udp --dport 53 -j CLASH_DNS

其中,sudo firewall-cmd --direct --add-rule ipv4 nat clash 1 -m cgroup --path "clash.slice" -j RETURN 将放到 clash.slice 下的 service 给绕过 clash 了。

Clash 要以 systemd unit 的形式 来运行。为了让 clash 不把自己的流量循环转回给自己,给它的 unit 分配给 clash.slice

[Service]
Slice=clash.slice

其它不想走 clash 的程序也可以以类似方式分配给 clash.slice。

 

IPFS 官方中文 Wikipedia 使用指南

 

https://www.v2ex.com/t/764965#reply11

 

什么是 IPFS ?

星际文件系统InterPlanetary File System,缩写IPFS)是一个旨在创建持久且分布式存储和共享文件的网络传输协议。它是一种内容可寻址对等超媒体分发协议。在 IPFS 网络中的节点将构成一个分布式文件系统。它是一个开放源代码项目,自 2014 年开始由Protocol Labs在开源社区的帮助下发展。其最初由Juan Benet设计。

用最简单的话来说 IPFS 是个 P2P 网络,和我们日常可能会使用的 BT 下载的原理类似,但是 IPFS 相比于 BT 来说做了非常多的改进,使得 IPFS 的性能和扩展性都有很大的提升。

在 IPFS 网络中每一个文件都有一个独特的 CID,当你把一个文件放入 IPFS 网络中,其他的用户就可以通过 CID 来获取到这个文件而不必考虑这个文件存放在何处。此外任何用户可以选择 pin 住一个文件的 CID,从而帮助 IPFS 网络长期的保存某个文件。

什么是 Distributed Wikipedia Mirror ?

Distributed Wikipedia Mirror 是 IPFS 官方团队维护的一个项目。这个项目旨在将 Wikipedia 带入 IPFS 网络,以及最终构建出一个纯分布式的 Wikipedia 。目前该项目已经提供了:英语、土耳其语、缅甸语和中文的 Wikipedia 镜像。

如何使用?

本文将介绍如何使用中文版的 Wikipedia IPFS 镜像。

镜像的地址为:

请注意本项目的 CID 地址会随着分发的 Wikipedia 镜像版本更新而改变,你可以通过访问此地址或者使用 ipfs name resolve zh.wikipedia-on-ipfs.org 获取到最新的 CID

我接下来会介绍 3 种不同的方式来访问本镜像。


公共网关

公共网关是目前访问 IPFS 网络上内容最简单的方式,但这也是最容易被封锁的方式。我将以官方的网关为例来演示如何使用公共网关来访问 IPFS 网络上的内容。

官方公共网关地址: https://ipfs.io

使用 CID 访问镜像

如果你决定使用 CID 地址来访问镜像的话,你需要在浏览器地址栏按照如下格式输入:

https://ipfs.io/ipfs/<CID>

在我们的例子里就是:

https://ipfs.io/ipfs/bafybeiazgazbrj6qprr4y5hx277u4g2r5nzgo3jnxkhqx56doxdqrzms6y

使用 DNSLink 地址访问

如果你决定使用 DNSLink 地址来访问镜像的话,你需要在浏览器地址栏按照如下格式输入:

https://ipfs.io/ipns/<DNSLink>

在我们的例子里就是:

https://ipfs.io/ipns/zh.wikipedia-on-ipfs.org

Brave 浏览器

如果你在使用最新版的 Brave 浏览器,你可以直接使用 Brave 内置的 IPFS 节点来访问 IPFS 网络上的内容。你在第一次使用 Brave 浏览器访问 IPFS 内容时,Brave 浏览器可能会询问你是否要启用本地 IPFS 节点,建议选择启用,如果没有启用,Brave 会自动使用公共网关来访问 IPFS 网络上的内容。此外你可以通过 Brave 设置页面中 IPFS 相关的选项和内置的 IPFS-Companion 插件中的选项来调整 IPFS 节点类型。

使用 CID 访问镜像

如果你决定使用 CID 地址来访问镜像的话,你需要在浏览器地址栏按照如下格式输入:

ipfs://<CID>

在我们的例子里就是:

ipfs://bafybeiazgazbrj6qprr4y5hx277u4g2r5nzgo3jnxkhqx56doxdqrzms6y

使用 DNSLink 地址访问

如果你决定使用 DNSLink 地址来访问镜像的话,你需要在浏览器地址栏按照如下格式输入:

ipns://<DNSLink>

在我们的例子里就是:

ipns://zh.wikipedia-on-ipfs.org

IPFS Desktop

IPFS Desktop 对于是目前普通用户使用本地 IPFS 最容易的方法,你可以在这里下载最新版的 IPFS Desktop 。在启动成功之后,IPFS-Dekstop 会默认在你本地地址的 8080 端口启动一个网关服务器,之后我们就可以使用这个本地的网关服务来访问 IPFS 网络上的内容了。

当然你可以通过修改 IPFS-Desktop 中的 Gateway 项,来修改默认的端口地址。

使用 CID 访问镜像

如果你决定使用 CID 地址来访问镜像的话,你需要在浏览器地址栏按照如下格式输入:

http://127.0.0.1:<port>/ipfs/<CID>

在我们的例子里就是:

http://127.0.0.1:8080/ipfs/bafybeiazgazbrj6qprr4y5hx277u4g2r5nzgo3jnxkhqx56doxdqrzms6y

使用 DNSLink 地址访问

如果你决定使用 DNSLink 地址来访问镜像的话,你需要在浏览器地址栏按照如下格式输入:

http://127.0.0.1:<port>/ipns/<DNSLink>

在我们的例子里就是:

http://127.0.0.1:8080/ipns/zh.wikipedia-on-ipfs.org
来自matters


返回列表 网站首页