Linux软路由——基础配置

之前买了台二手服务器,总觉得应该让它发挥点什么作用,正好针对学校蛋疼的网络,先试试能不能把它当做一台超级智能路由器吧~:)

系统:Ubuntu Server 14.04 64bit

设置无线AP

使用的设备是TP-Link TL-WDN4800,配合hostapd实现软AP功能,实现方法参考以下几篇文章:

linux软AP--hostapd+dhcpd
My Wi-Fi access point revisited
Setting up a Wireless Access Point with Ubuntu Raring Ringtail

我使用的hostapd的配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
interface=wlan0
driver=nl80211
ssid=TLWDN4800
macaddr_acl=0
ignore_broadcast_ssid=0

auth_algs=1
wpa=3
wpa_passphrase=xxxxxxxxxx
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

ieee80211n=1
wme_enabled=1
wmm_enabled=1
ht_capab=[HT40-][SHORT-GI-40][TX-STBC][RX-STBC1][DSSS_CCK-40][LDPC]
hw_mode=g
channel=13

完整的hostapd配置文件说明可以参考:

hostapd configuration file

配置好后使用service hostapd restart启动服务即可。

不过以上配置应该并不是最优配置,TL-WDN4800最高传输速率450Mbps,然而之后实际测试得到的速率只有30Mbps左右。

配置DHCP服务器

为无线AP添加DHCP服务。

安装DHCP服务

1
apt-get install isc-dhcp-server

配置DHCP网卡

修改/etc/default/isc-dhcp-server文件,根据注释说明添加对应网卡即可,可以添加不止一个,此处以wlan0为例:

1
INTERFACES="wlan0"

修改DHCP配置文件

修改/etc/dhcp/dhcpd.conf文件,根据注释修改即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ddns-update-style none;

# 此处填写分配的DNS服务器地址,一般所有客户机都是一样的,故可以使用全局配置
option domain-name-servers 223.5.5.5;

# 可适当增加地址租期
default-lease-time 6000;
max-lease-time 36000;

log-facility local7;

# 最基本的子网配置方法
subnet 192.168.137.0 netmask 255.255.255.0 {
# 起止IP地址范围
range 192.168.137.10 192.168.137.70;
# 子网掩码
option subnet-mask 255.255.255.0;
# 默认网关
option routers 192.168.137.77
# 广播地址
option broadcast-address 192.168.137.255;
}

以上是最基本的配置方法,各种高级配置可参考注释说明。

配置本机IP

DHCP服务器本身显然是不能再配置为动态获取IP的,需要配置为静态IP的形式。修改/etc/network/interfaces文件,如:

1
2
3
4
5
iface wlan0 inet static
address 192.168.137.77
netmask 255.255.255.0
gateway 192.168.137.77
dns-nameservers 223.5.5.5 223.6.6.6

重启DHCP服务

1
service isc-dhcp-server restart

此时客户端配置为自动获取IP即可。

通过VPN拨号连接校园网

根据学校网络中心的说明文件配置即可。

配置静态IP

修改/etc/network/interfaces文件:

1
2
3
4
5
iface eth0 inet static
address 10.12.218.231
netmask 255.255.255.0
gateway 10.12.218.1
dns-nameservers 223.5.5.5 223.6.6.6

安装xl2tpd

1
apt-get install xl2tpd

修改配置文件

配置/etc/xl2tpd/xl2tpd.conf文件,在最后加入以下代码:

1
2
3
4
5
6
7
8
9
10
[lac ZJU_VPN]
lns = 10.5.1.7
redial = yes
redial timeout = 15
max redials = 5
require pap = no
require chap = yes
name = g199209@a
ppp debug = no
pppoptfile = /etc/ppp/options.xl2tpd.zju

创建/etc/ppp/options.xl2tpd.zju文件:

1
2
3
noauth
proxyarp
defaultroute

保存用户名与密码,修改/etc/ppp/chap-secrets文件,在最后添加:

1
g199209@a * 00000000 *

其中00000000替换为真实的密码。

启动服务与停止服务

连接:

1
2
service xl2tpd start
echo 'c ZJU_VPN' > /var/run/xl2tpd/l2tp-control

连接成功后,使用ifconfig命令可以看到ppp0接口:

1
2
3
4
5
6
7
ppp0      Link encap:Point-to-Point Protocol
inet addr:222.205.109.222 P-t-P:10.5.1.7 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1442 Metric:1
RX packets:262777 errors:0 dropped:0 overruns:0 frame:0
TX packets:348384 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:123894650 (123.8 MB) TX bytes:332214801 (332.2 MB)

其中的inet addr就是虚拟局域网IP地址。

断开连接:

1
2
echo 'd ZJU_VPN' > /var/run/xl2tpd/l2tp-control
service xl2tpd stop

修改路由表

添加两条记录即可,首先将发往VPN服务器的流量通过本地网关发送:

1
route add -host 10.5.1.7 gw 10.12.218.1 dev eth0

默认流量都通过ppp0发送:

1
route add default gw 222.205.109.222 dev ppp0

此处的网关就是之前看到的ppp0的IP地址。

需要将矛盾的路由记录删除掉,比如只要保留一条默认记录就可以了。

使用手机USB共享提供4G网络连接

本来想买个4G USB网卡的,然而价格都太贵……之前一直用一个闲置的Nexus手机做无线AP的,其实可以使用USB网络共享(USB Tethering)功能,把手机当成一个4G网卡用的。将手机与电脑连起来,在手机上开启USB网络共享功能,使用lsusb命令可以查看手机是否正常连接上了,若成功连接的话,会有显示:

1
Bus 001 Device 009: ID 18d1:4ee4 Google Inc. Nexus 4 (debug + tether)

显示tether的话就说明共享成功了,使用ifconfig -a命令可以看到一个名为usb0的网络设备:

1
2
3
4
5
6
usb0      Link encap:Ethernet  HWaddr aa:e3:b2:da:e7:27
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

不过可以看到,此时还没有正确分配IP地址,使用dhcpcd usb0命令从手机DHCP服务器上获取一下IP地址即可,再使用ifconfig命令即可看到usb0已经获得正确的IP地址了。使用route -n命令可以看到此时也自动添加了路由表。

添加路由转发

路由器最重要的功能就是路由转发啦,Linux内核本身就支持这一功能,这在之前写的Ubuntu虚拟机中设置NAT使树莓派开发板可以联网一文中介绍了实现方法,大概就是在/etc/sysctl.conf文件中开启IP转发功能,之后在iptables中添加一条MASQUERADE规则即可,文末参考资料中鸟哥的文章里对此有详细介绍。

如果要使用有线网上网:

1
iptables -t nat -A POSTROUTING -s 192.168.137.0/24 -o ppp0 -j MASQUERADE

如果要使用4G网络上网:

1
iptables -t nat -A POSTROUTING -s 192.168.137.0/24 -o usb0 -j MASQUERADE

自动连接脚本

以上操作可以写成一个脚本文件,方便在校园网和4G网络间切换。

连接至校园网

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash

service xl2tpd start
echo 'c ZJU_VPN' > /var/run/xl2tpd/l2tp-control
echo "Create L2TP connection..."
sleep 5
VPNIP=$(ifconfig | grep P-t-P | awk '{print $2}' | awk 'BEGIN {FS=":"} {print $2}')
if [ ! -n "$VPNIP" ]; then
echo "VPNIP Empty!"
exit -1
fi
echo "Update Route & Iptables"
route del -host 10.5.1.7
route add -host 10.5.1.7 gw 10.12.218.1 dev eth0
route del default
route add default gw $VPNIP dev ppp0
iptables -t nat -F
iptables -t nat -A POSTROUTING -s 192.168.137.0/24 -o ppp0 -j MASQUERADE
echo "nameserver 223.5.5.5" > /etc/resolv.conf
echo "nameserver 223.6.6.6" >> /etc/resolv.conf

连接至4G网络

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

echo 'd ZJU_VPN' > /var/run/xl2tpd/l2tp-control
service xl2tpd stop
dhcpcd usb0
echo "Update Route & Iptables"
route del default
route add default gw 192.168.42.129 dev usb0
iptables -t nat -F
iptables -t nat -A POSTROUTING -s 192.168.137.0/24 -o usb0 -j MASQUERADE
echo "nameserver 223.5.5.5" > /etc/resolv.conf
echo "nameserver 223.6.6.6" >> /etc/resolv.conf

使用以上方法配置好后,笔记本通过无线连接,电脑即可正常上网了,此时服务器就相当于一台路由器,只是目前4G和校园网还是独立的,要更改连接需要自己手动输入命令,之后进一步研究下如何实现更高级的策略路由。


参考资料:
Ubuntu下DHCP服务器的配置
Linux 的封包过滤软件: iptables
第八章、路由观念与路由器设定
linux 添加静态路由
在多种系统下通过USB连接android手机上网
USB Tethering on Linux
linux 路由表设置 之 route 指令详解

文章目录
  1. 1. 设置无线AP
  2. 2. 配置DHCP服务器
    1. 2.1. 安装DHCP服务
    2. 2.2. 配置DHCP网卡
    3. 2.3. 修改DHCP配置文件
    4. 2.4. 配置本机IP
    5. 2.5. 重启DHCP服务
  3. 3. 通过VPN拨号连接校园网
    1. 3.1. 配置静态IP
    2. 3.2. 安装xl2tpd
    3. 3.3. 修改配置文件
    4. 3.4. 启动服务与停止服务
    5. 3.5. 修改路由表
  4. 4. 使用手机USB共享提供4G网络连接
  5. 5. 添加路由转发
  6. 6. 自动连接脚本
    1. 6.1. 连接至校园网
    2. 6.2. 连接至4G网络