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.

欢迎留言