Ubuntu 多网环境自动路由表(区别教育网内外) + 分享到多张网卡网络的实现

首先, 感谢 @BOYPT @jimmy_xu_wrk @tjmao @yegle 等朋友的帮忙!

1, 多网环境, Felix 的环境是 VPN over cernet2 + cernet 双网.

2, 自动路由表, 采用 www.nic.edu.cn 的官方 Free IP 数据.
以下是 Felix 用 Python 写的一个小小的自动生成脚本:

import re
import urllib
a=urllib.urlopen('http://www.nic.edu.cn/RS/ipstat/internalip/real.html').read()
b=re.compile("([\d\.]+)\s+[\d\.]+\s+([\d\.]+)")
c=b.findall(a)
m=["#!/bin/bash","OLDGW=$1","NEWGW=$2","route del -net 0.0.0.0 netmask 0.0.0.0","route add -net 0.0.0.0 netmask 0.0.0.0 gw $NEWGW"]
n=["#!/bin/bash"]
for d in c:
    m.append("route add -net "+d[0]+" netmask "+d[1]+" gw $OLDGW")
    n.append("route del -net "+d[0]+" netmask "+d[1])
e=open('gtwcernet',"w")
e.write("\n".join(m))
e.close()
f=open('gtwcernetd',"w")
f.write("\n".join(n))
f.close()

会在当前目录生成 gtwcernet 和 gtwcernetd 两个文件
然后给他们加上执行权限

chmod +x gtwcernet
chmod +x gtwcernetd

前一个是启用自动路由表
Usage: gtwcernet <教育网网关> <VPN/电信网网关>
后一个是禁用自动路由表
Usage: gtwcernetd


3, 分享到多张网卡:
Felix 的网络环境是:
eth0 – 教育网
eth1 – 连接到内网有线交换机
tun0 – VPN over cernet2
sit1 – IPv6 (6 in 4)
wlan0 – 无线网卡, Ad-hoc 分享网络

eth0 / tun0 的自动切换在上一步已经完成, 剩下的问题就在于, 想要将这个设置好的网络分享到 eth1 和 wlan0
在这之前, 需要安装 ifenslave-2.6 和 dnsmasq:

sudo apt-get install ifenslave-2.6 dnsmasq

然后打开系统的 ipv4 转发:

echo "1" > /proc/sys/net/ipv4/ip_forward

***TIP***要让 ipv4 转发永久生效,可以编辑 /etc/sysctf.conf, 去掉下面行的注释:

net.ipv4.ip_forward=1

编辑文件后想让设置立刻生效, 可以简单地用:

sysctl -p

启用 NAT:

iptables -P FORWARD ACCEPT
iptables --table nat -A POSTROUTING -s 192.168.4.0/24 -j MASQUERADE

注意: 把 192.168.4.0/24 修改为你要分享的网段!
给两块网卡分别创建 Manual 的连接, IP 设置为一样.
然后配置 dnsmasq 服务器, 作为 DNS Server 和 DHCP Server:

gedit /etc/dnsmasq.conf

修改相应的配置.
比如我的 DHCP 选项是:

dhcp-range=192.168.4.100,192.168.4.220,12h
dhcp-option=3,192.168.4.1
dhcp-option=6,192.168.4.1

然后重启 dnsmasq 服务器:

sudo service dnsmasq restart

最后把两张网卡绑在一起:

modprobe bonding mode=3
ifconfig bond0 up
ifenslave bond0 eth1 wlan0

注: mode=3 是让两张网卡所辖范围的网络 “水乳交融”, 自动合体. 更多 mode 设置参见本文下方的参考资料.
现在, 连接上有线网卡或者连接上无线网卡 (ad-hoc) 的人都可以享受优化过的网络了 🙂

附: 清空 iptables 的脚本: (修改自: http://blog.chinaunix.net/u1/47765/showart_377028.html)

#!/bin/sh
#accept-all policy
IPT='/sbin/iptables'
$IPT -t nat -F
$IPT -t nat -X
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT
$IPT -t mangle -F
$IPT -t mangle -X
$IPT -t mangle -P PREROUTING ACCEPT
$IPT -t mangle -P INPUT ACCEPT
$IPT -t mangle -P FORWARD ACCEPT
$IPT -t mangle -P OUTPUT ACCEPT
$IPT -t mangle -P POSTROUTING ACCEPT
$IPT -F
$IPT -X
$IPT -P FORWARD ACCEPT
$IPT -P INPUT ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -t raw -F
$IPT -t raw -X
$IPT -t raw -P PREROUTING ACCEPT
$IPT -t raw -P OUTPUT ACCEPT

参考资料:
1, http://www.linuxhorizon.ro/bonding.html
2, http://www.linux-corner.info/bonding.html

10 thoughts on “Ubuntu 多网环境自动路由表(区别教育网内外) + 分享到多张网卡网络的实现”

  1. 很好,终于解决了ad-hoc的问题……还是dnsmasq管用。
    其实我很想在寝室里面弄个无线路由器,做CERNET跟电信的双线路由。

Leave a Reply

Your email address will not be published. Required fields are marked *

QR Code Business Card