Linux 下通过策略路由实现出站入站不同路由

SEO: 实现出站入站不同路由、多网卡、Linux 策略路由

问题简述

一般的,在系统路由表内只能有一条默认路由。当出站数据包根据目的IP地址选路失败后,执行默认路由。
但这一条默认路由的设计可能会让您遇到不少问题。比如当您在服务器上运行vpn ,让所有流量走vpn之后,您会发现部署在服务器上的网站在外部访问不到啦。
如何让出站流量和入站流量走不同的路由呢?这就要请出我们今天的主角 ———— 策略路由

策略路由

策略路由,即 PBR(Policy-Based Routing),与传统的基于IP报文目的地址查找路由表进行转发不同,它可以依据用户自定义的策略进行报文转发。
我们使用 ip-route 和 ip-rule 来完成任务。
(Openwrt 玩家请去安装 ip-full )

示例拓扑

现有 he 和 教育网 两个网络,实现效果为入站使用教育网,出站使用 he 。

主机网卡名为:
CERNET —— eth0
HE —— eth1

CERNET网络为: 192.168.1.2/24
默认网关 192.168.1.1

HE网络为: 192.168.2.2/24
默认网关 192.168.2.1

实现思路

为了方便复制粘贴这里都加上了 sudo
请注意,命令执行都是即时生效的。 如果您正在作死远程配置网络,建议您遵照每一条命令的顺序,避免产生不必要的麻烦。

1. 先加上入站的默认路由

1
sudo ip route add default via 192.168.1.1 dev eth0

2. 接着我们创建路由表

1
2
sudo echo "80 he" >> /etc/iproute2/rt_tables
sudo echo "90 cetnet" >> /etc/iproute2/rt_tables

第一位是优先级,数字越小越优先。第二位是表名称。后面这个文件我建议您执行之前先去看一眼。确保这两个数字小于 0 以外的其它数字。

3. 加上本网段路由

教育网:

1
sudo ip route add 192.168.1.1/24 dev eno1 table cernet

HE:

1
sudo ip route add 192.168.2.1/24 dev tun0 table he

table 后面是您在第二步时定义的名称

4. 加上两表各自的默认路由

教育网:

1
sudo ip route add default via 192.168.1.1 table cernet

HE:

1
sudo ip route add default via 192.168.2.1 table he

相信您注意到了,这跟第一步相比就是多了表

5. 定义规则

教育网:

1
sudo ip rule add from 192.168.1.2/32 table cernet

HE:

1
sudo ip rule add from via 192.168.2.2/32 table he

这里的两个 ip 就是两张网卡各自获得的ip,/32 代表只有这一个ip。翻译一下就是来自这个 ip 的数据包走某个表(网卡)。

You’ve figured it all out.

欢迎留言

从 MoeBlog 到 Hexo

这两天把 blog 从 MoeBlog 搬到了 Hexo

Hexo 的纯静态页面加载真的很快,真香警告。

为什么迁移呢,主要是用 Github API + Gist 动态写 blog 的想法真的很棒。
但速度真的很慢。
而且很容易出道私人 Gist 。

相比之下,静态化的好处就很多了,部署在 Github Page 的页面也能很快。

而在决定迁移之前我还考虑了两个选择:
Typecho + handsome which modified by Jindai Kirin

Wordpress + smarty_hankin

它们都是很棒的选择,Wordpess 是功能十分完备图形化设置非常好的博客软件,smarty_hankin 是挺好看的开源免费主题。
Typecho 十分轻巧,handsome 在好看和界面设计优良之余更为 Typecho 不臃肿的添上了丰富的功能。而修改后的主题非常萌。

但是对于我来说,如果选择后二者就需要一个完整的配置环境,我已经不想在这方面上花上时间。如果要使用它们的话, GitHub Student Developer Pack 里面免费 Education Host 是不错的选择。 嗯, 对, 虚拟主机。还有值得注意的是,Typecho 上一个释出版本已经是 2017 年的。

就酱

github page使用 vue-router history 模式思路

看着url里的#好丑…

vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载。

但是丑啊,一点都不萌

没办法只能自己动手了
如果是nginx

1
2
3
location / {
try_files $uri $uri/ /index.html;
}

然而我们是serverless
cloudflare的worker emmmm…只有一条免费

所以思路很简单 利用404页面
反正不存在的url都会去404

那么怎么复制呢,
当然是用CopyWebpackPlugin啦 (文档地址)
具体可见我的commit

bye-bye
继续nervous去

记一下 telegram 网页版的搭建方法

反向代理
gfw实际上墙的是下面的API服务器。所以我们需要反代以下十组服务器(支持v4/v6)。

1
2
3
4
5
6
7
8
9
10
pluto.web.telegram.org
pluto-1.web.telegram.org
venus.web.telegram.org
venus-1.web.telegram.org
aurora.web.telegram.org
aurora-1.web.telegram.org
vesta.web.telegram.org
vesta-1.web.telegram.org
flora.web.telegram.org
flora-1.web.telegram.org

此处有个快速配置的方法

1
2
3
4
location ~* ^/(pluto|pluto-1|venus|venus-1|aurora|aurora-1|vesta|vesta-1|flora|flora-1)/(.*)$ {
proxy_buffering off;
proxy_pass https://$1.web.telegram.org/$2;
}

申请telegram API
申请网址https://my.telegram.org,登录后点击API development tools,然后创建API
记得保留成功界面的所有信息,有的信息永久只会显示一次。
搭建webogram
这个实在没有什么好说的,直接build就好,不过值得注意的是最新的webogram却css,需要去官方“偷”几个回来。
然后注意把申请的API的值替换。

即可。

解决Your project path contains non-ASCII characters

解决Your project path contains non-ASCII characters
这是因为项目目录名中有中文、日文这些非ASCII文字造成的

1
com.android.build.gradle.overridePathCheck=true

追加到项目的根目录下的gradle.properties 文件底下即可

MoeBlog问世啦

基于vblog的fork版本MoeBlog问世啦
Github:MoeBlog
favicon √
更加可爱 √
修改时间显示 √
干掉手机版 √
干掉简要说明 √
因为感觉单是去掉手机版这一项就未必会为原作者接受,就分支出这一个版本吧。
Welcome star!

待办事项:修改一个适合自己的blog程序

Vblog是个不错的开源博客程序,基于gist可以让博文动态的发出,但是还是有不少问题需要优化,这里是个to-do list:
favicon √
更加可爱
修复更新时间不正确的问题,或者这个去掉 √
干掉手机版 √
干掉简要说明 √
换个更加强大的编辑器
音乐功能列表化

以上的修改除了第一、三个估计也不会pr到原repo。
说实话我对MPL协议不太喜欢,这种情况下我甚至更青睐LGPL(当然有可能还是MIT、BSD)。

MDZZ Secret的gist都放出来

迁移Github Pages

迁移咯~
思来想去,还是GitHub Pages是好地方,不应该把博客和应用服务器放一起。