让天大校园网变成真正的校园网——PPPOE连接后原先DHCP的IP不可用的解决方案

发布时间 2023-03-22 21:17:06作者: 王冰冰

首先说明我的场景:
一台电脑安装windows,一台安装linux。两台电脑都连接校园网,并且插网线,拨号。这样获取了两个IP:一个是校园网DHCP的IP,一个是PPPOE的IP。
另外,windows电脑还有一个wifi网卡,也可以获得一个IP。
这几个IP的前缀分别是:有线网DHCP:172.24.*.*,PPPOE宽带拨号:172.26.*.*,wifi:172.23.*.*
连接PPPOE后会把默认路由设置为指向PPPOE接口,导致DHCP得到的IP几乎处于废止状态,发出去连接不使用它,给它发的传入连接也会被丢弃。
这两个网络接口分别是:eno1和ppp(ifconfig可以看到)

以下的所有前提是:假定校园网的路由器本身是正确的,有线、宽带、无线都可以正确被路由,本身没有做任何网络切割。

为了解决这些问题
总共分为这么几种情况:

  1. 让linux的dhcp的ip可以被连接
    https://support.huaweicloud.com/trouble-ecs/ecs_trouble_0307.html
sudo vim /etc/iproute2/rt_tables
添加:32000 djc
sudo ip route add default via 172.24.64.1 dev eno1 table djc
sudo ip rule add from 172.24.67.11 lookup djc prio 32000
# sudo ip rule add from $(ip -j -4 addr show eno1 | jq -r '.[0].addr_info[0].local') lookup djc prio 32000

简洁版:

sudo ip route add default via 172.24.64.1 dev eno1 table djc
sudo ip rule add from $(ip -j -4 addr show eno1 | jq -r '.[0].addr_info[0].local') lookup djc prio 32000

让来自不同的网卡的数据包查阅不同的路由表,这样,就不会出现收到来自非默认接口(PPP)的数据包,但是从默认接口(eno1)发出去响应包,导致对方无法接收的情况。

此时,在windows发起ssh连接,连接linux,使用的是windows的PPPOE接口。同时linux ping不通windows的有线网IP和无线网IP,只能ping宽带IP。
原因就是:发出去的ping数据包到达windows网卡后,会从windows的宽带网卡发出响应包!这不正确!会被丢弃。应该是哪个网卡收到就从哪个网卡发送响应包!这个问题在linux下面可以让每个网卡使用自己的路由表来解决,但是windows没有这个功能!

所以只能取舍一下,使用一个略微阴间的解决方案:windows上设置路由,让去往linux主机的数据包走DHCP网卡,而不是PPPOE!这样windows连接linux主机也会走有线网卡而不是默认的PPPOE。
2. 使用dhcp的ip发起传出连接
但是,windows的路由设置没有不同网卡使用不同的路由表的功能,这样就会出现:外部发送到非默认网卡的数据包,从默认网卡发送了响应。一个尴尬的解决办法是,添加一条路由,让目的地是外部的ip路由到DHCP。
代码:

route add 172.24.0.0 mask 255.255.0.0 172.24.8.1 if 16
route add 172.26.0.0 mask 255.255.0.0 172.24.8.1 if 16

这样,让去往172.24.0.0/16和172.26.0.0/16的数据包网关是172.24.8.1,接口是有线网卡。这样linux的两块网卡就可以互相ping通windows的两块网卡了。

这里有点不理解的问题:linux的默认路由是走PPPOE(172.26.x.x),从这里访问windows的有线网卡和PPPOE接口,响应数据包都会通过172.24.x.x发送出去。linux访问windows的pppoe,数据包来自接口pppoe,但是响应包从有线网卡接口发送出去,仍然能正常工作。感觉是把两个接口当成了一个接口在用?或者说windows的rp_filter机制是,PPPOE的响应数据包走物理网卡不会被丢弃,物理网卡的响应数据包走PPPOE会被丢弃。都是猜测。

如果需要让linux ping windows的wifi网卡,按理说那么就要相对应的更改上述路由的网关为wifi的网关。
如果想让来自别人wifi的可以ping通有线网卡,则需要添加一条:

route add 172.23.0.0 mask 255.255.0.0 172.24.8.1 if 16