首先, 感谢 @BOYPT @jimmy_xu_wrk @tjmao @yegle 等朋友的帮忙!
1, 多网环境, Felix 的环境是 VPN over cernet2 + cernet 双网.
2, 自动路由表, 采用 www.nic.edu.cn 的官方 Free IP 数据.
以下是 Felix 用 Python 写的一个小小的自动生成脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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 两个文件
然后给他们加上执行权限
1 2 |
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:
1 |
sudo apt-get install ifenslave-2.6 dnsmasq |
然后打开系统的 ipv4 转发:
1 |
echo "1" > /proc/sys/net/ipv4/ip_forward |
***TIP***要让 ipv4 转发永久生效,可以编辑 /etc/sysctf.conf, 去掉下面行的注释:
1 |
net.ipv4.ip_forward=1 |
编辑文件后想让设置立刻生效, 可以简单地用:
1 |
sysctl -p |
启用 NAT:
1 2 |
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:
1 |
gedit /etc/dnsmasq.conf |
修改相应的配置.
比如我的 DHCP 选项是:
1 2 3 |
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 服务器:
1 |
sudo service dnsmasq restart |
最后把两张网卡绑在一起:
1 2 3 |
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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#!/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
/RS/ipstat/internalip/real.html 貌似现在访问会302?
难道是因为非教育网无法访问这个页面么?
不知道呢……. 我好久木有用教育网了~
今天jack77213在##Orz频道求助来着。
然后我就把本文链接给他了。
谢谢博主,好文章!写的非常详细,
好文啊~~支持猫猫~
很好,终于解决了ad-hoc的问题……还是dnsmasq管用。
其实我很想在寝室里面弄个无线路由器,做CERNET跟电信的双线路由。
那个iptables命令会造成某些使用lo接口的程序抽风……最好把
iptables –table nat -A POSTROUTING -j MASQUERADE
改成
iptables -t nat -A POSTROUTING -o $WAN_IF -s 192.168.4.1/24 -j MASQUERADE
另外iptables的规则要清掉似乎还很麻烦,我是按照这样做的:
http://blog.chinaunix.net/u1/47765/showart_377028.html
我想用本机的路由表, 所以不能指定 -o $WAN_IF 吧…
-s倒是可以指定…
用ad-hoc当双线路由其实很妙….嘿嘿…..
沙发~好文,mark!