Linux作为路由器的好处是相比专业的路由器设备,费用节省很多,因为硬件通常都是使用旧电脑加上几块网卡,而Linux系统有很多免费的可以使用。并且由于可以自己定制,可以针对企业网络的情况指定灵活的网络管理规则。但是这种做法需要学习很多知识,往往令人生畏。本文总结了自己的个人经验,试图帮助更多的Linux爱好者。
我的设置路由器的方法主要用到了UBuntu设置网卡地址、route命令和iptables的相关知识。用eth0直接连接在Internet上,另外两个通过IP包转发的方式和其他子网通信并因此可以连接Internet。
设置网卡
首先给我的三块网卡分配不同的地址:(通过sudo身份编辑/etc/network/interfaces文件)文件内容如下:
File Edit Options Buffers Tools Help
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 58.246.17.2
netmask 255.255.255.248
network 58.246.17.0
broadcast 58.246.17.7
gateway 58.246.17.1
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 210.22.70.3
dns-search longday.com
# The sencond network interface
auto eth1
iface eth1 inet static
address 192.168.10.244
netmask 255.255.255.0
network 192.168.10.0
broadcast 192.168.10.255
gateway 192.168.10.244
#dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 192.168.10.244
编辑好上面的文件后,执行sudo /etc/init.d/networking restart 重启网络服务。
修改/etc/resolv.conf文件下的DNS为210.22.70.3,重启计算机。
设置路由
现在我们要通过route命令设置路由,使得:
1)所有发往58.246.17.0网段的数据包经过eth0网卡
2)所有发往192.168.10.0网段的数据包经过eth1网卡
route命令可以用来查看当前路由表的设置,route del用于删除某条路由设置,route add用于添加某条路由设置.最后设置好的路由表如下:
/etc/network # route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
58.246.17.0 * 255.255.255.248 U 0 0 0 eth0
localnet * 255.255.255.0 U 0 0 0 eth1
default 58.246.17.1 0.0.0.0 UG 100 0 0 eth0
下面是我们的设置命令,首先使用下面的命令删除掉eth1的default设置,因为它会干扰我们的服务器通过eth0连接外网
route del default dev eth1
注意每次网络服务重新启动的时候,default设置会被修改成我们不想要的。我后面会提供一个方法自动删除之。
route add default gw 58.246.17.1 dev eth0//这行命令默认会自动添加,不需要手动加
下面三条命令就是添加各个网卡的路由策略:
route add -net 58.246.17.0 netmask 255.255.255.248 dev eth0
route add -net 192.168.10.0 netmask 255.255.255.0 dev eth1
(注意,同样的命令,将add换成del,就可以删除这些策略,-net参数指的是网段,所以最后一个十进制数一定是0)。
设置IP包转发
1)
执行下面的命令,将
/proc/sys/net/ipv4/ip_forward内容修改为1(你当然也可以使用其他的编辑程序修改)
echo 1 > /proc/sys/net/ipv4/ip_forward
2)编辑/etc/sysctl.conf文件,取消#net.ipv4.ip_forward = 1的注释符号
3)使用iptables命令让内网的数据包经过路由器发送的时候,源包地址修改为路由器的ip地址;外部数据包发送到路由器后,目的IP地址被路由器修改成内网的IP地址。
iptables -F
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
//在nat规则表中添加一个规则,该规则将所有外发的数据的源伪装成eth0接口的ip地址
(注:这句效率较低,但是比较灵活,适用于动态IP地址上网的情况 )
nat规则表主要负责数据包的地址转换。
它有三个规则链,其中:
PreRouting链负责修改包的目标地址,通常用于处理收到的包,
PostRouting链负责修改包的源地址,通常用于要发送出去的包,下面有个例子
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j SNAT --to-source 58.246.17.2//这句好像还不能用,以后再解决。
端口映射
端口映射主要解决外部请求如何路由到内部服务器上,下面这篇文章介绍的非常好:http://hi.baidu.com/allenspace/blog/item/cbba05f3b41c5dcb0b46e0ef.html
首先执行下面的命令,将ftp的21端口映射到公司内部服务器192.168.10.80上。
iptables -t nat -A PREROUTING --dst 58.246.17.2 -p tcp --dport 21 -j DNAT --to-destination 192.168.10.80
现在面临一个新问题,外网可以使用连接到ftp服务,telnet 58.246.17.2 21命令测试成功,内网机器却不行,下面的命令将所有发往80服务器 21端口的数据包的源地址转换成eth1的地址。
iptables -t nat -A POSTROUTING -p tcp --dst 192.168.10.80 --dport 21 -j SNAT --to-source 192.168.10.244
打开FORWARD链的相关端口,比如下面的例子
sudo iptables -A FORWARD -o eth1 -d 192.168.10.51 -p tcp --dport 8080 -j ACCEPT
sudo iptables -A FORWARD -i eth1 -s 192.168.10.51 -p tcp --sport 8080 -j ACCEPT
FTP的设置
ftp是个比较麻烦的服务,除了上一节提到的打开端口映射外,还需要加载一些模块,下面的命令显示了UBuntu8.04关于ftp的一些helper模块
freebird@freebird-desktop:~$ sudo modprobe -l | grep ftp
[sudo] password for freebird:
/lib/modules/2.6.24-20-rt/kernel/net/ipv4/ipvs/ip_vs_ftp.ko
/lib/modules/2.6.24-20-rt/kernel/net/ipv4/netfilter/nf_nat_tftp.ko
/lib/modules/2.6.24-20-rt/kernel/net/ipv4/netfilter/nf_nat_ftp.ko
/lib/modules/2.6.24-20-rt/kernel/net/netfilter/nf_conntrack_tftp.ko
/lib/modules/2.6.24-20-rt/kernel/net/netfilter/nf_conntrack_ftp.ko
可以使用modprobe ip_vs_ftp这样的命令,一个一个的加载。要想查看哪些模块已经被加载,可以用lsmod命令,比如:
lsmod | grep nf_nat_ftp
nf_nat_ftp 4352 0
nf_conntrack_ftp 10144 1 nf_nat_ftp
nf_nat 20268 4 nf_nat_tftp,nf_nat_ftp,ipt_MASQUERADE,iptable_nat
nf_conntrack 66752 8 nf_nat_tftp,nf_conntrack_tftp,nf_nat_ftp,nf_conntrack_ftp,ipt_MASQUERADE,iptable_nat,nf_nat,nf_conntrack_ipv4
如果要系统启动的时候自动加载,需要在/etc/modules文件中添加模块名称,如下:
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
fuse
lp
rtc
nf_nat_ftp
nf_nat_tftp
ip_vs_ftp
nf_conntrack_tftp
nf_conntrack_ftp
限制部分用户上网
下面的命令允许192.168.10.67用户访问外网,禁止192.168.10.69访问外网:
# iptables -A FORWARD -s 192.168.10.67 -d 0.0.0.0/0 -j ACCEPT
# iptables -A FORWARD -s 192.168.10.69 -d 0.0.0.0/0 -j DROP
现在我们进一步将网卡和ip地址绑定,使得别人不能通过偷换IP地址来上网:
iptables -A FORWARD -s 192.168.10.6 -m mac --mac-source 00:1d:92:86:9e:2a -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 2 -s 192.168.10.11 -m mac --mac-source 00:15:B7:2B:A7:6A -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 3 -s 192.168.10.22 -m mac --mac-source 00:15:58:BF:92:CF -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 4 -s 192.168.10.14 -m mac --mac-source 00.11.D8.B6.3D.68 -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 5 -s 192.168.10.68 -m mac --mac-source 00.18.37.06.32.DF -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 6 -s 192.168.10.69 -m mac --mac-source 00.18.37.06.37.8E -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 7 -s 192.168.10.5 -m mac --mac-source 00.13.D3.5E.7C.3F -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 8 -s 192.168.10.90 -m mac --mac-source 00.1D.92.86.9D.4E -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 9 -s 192.168.10.61 -m mac --mac-source 00.1A.4D.2E.AB.2A -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 10 -s 192.168.10.13 -m mac --mac-source 00.11.d8.b6.3d.6b -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 11 -s 192.168.10.12 -m mac --mac-source 00.13.D3.1E.0E.12 -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 12 -s 192.168.10.15 -m mac --mac-source 00.13.D3.5E.6D.E1 -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 13 -s 192.168.10.9 -m mac --mac-source 00.0E.7B.A4.D1.66 -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 14 -s 192.168.10.65 -m mac --mac-source 00.1D.92.86.9C.1E -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 15 -s 192.168.10.66 -m mac --mac-source 00.13.D3.1D.F6.A8 -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 16 -s 192.168.10.220 -m mac --mac-source 00.13.46.E7.49.DA -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 17 -s 192.168.10.102 -m mac --mac-source 00.11.D8.B6.3D.FE -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 18 -s 192.168.10.83 -m mac --mac-source 00.13.D3.1E.20.EF -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 19 -s 192.168.10.99 -m mac --mac-source 00.1D.09.4C.FE.8C -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 20 -s 192.168.10.72 -m mac --mac-source 00.30.18.A7.79.5F -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 21 -s 192.168.10.21 -m mac --mac-source 00.1A.4D.DB.E8.22 -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 22 -s 192.168.10.23 -m mac --mac-source 00.18.37.02.BB.57 -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 23 -s 192.168.10.25 -m mac --mac-source 00.1A.4D.1B.25.B1 -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 24 -s 192.168.10.24 -m mac --mac-source 00.00.E1.6B.BB.00 -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 25 -s 192.168.10.29 -m mac --mac-source 00.16.76.8C.63.12 -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 26 -s 192.168.10.10 -m mac --mac-source 00.19.B9.2A.3B.7C -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 27 -s 192.168.10.3 -m mac --mac-source 00.0b.2f.03.de.10 -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 27 -s 192.168.10.62 -m mac --mac-source 00.15.58.BF.64.11 -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 27 -s 192.168.10.243 -m mac --mac-source 00.1D.92.86.9A.2D -d 0.0.0.0/0 -j ACCEPT
iptables -I FORWARD 27 -s 192.168.10.87 -m mac --mac-source 00.18.37.06.35.87 -d 0.0.0.0/0 -j ACCEPT
下面的命令删除掉FORWARD链的第二条规则
sudo iptables -D FORWARD 2
可以通过下面的命令查看刚才的设置
sudo iptables -L --line-number
同时我们的80服务器也要允许外发数据包:
iptables -I FORWARD 2 -s 192.168.10.80 -d 0.0.0.0/0 -j ACCEPT
修改已有的规则,可以使用下面的命令
iptables -R FORWARD 43 -s 192.168.10.67 -m mac --mac-source 00.13.d3.1e.20.ef -d 0.0.0.0/0 -j ACCEPT
最后,禁止其他的ip地址上外网。/24代表C类网址
iptables -A FORWARD -s 192.168.10.0/24 -d 0.0.0.0/0 -j DROP
保存IPTables的设置
下面的命令可以将当前iptables的设置保存到指定文件中:
sudo sh -c "iptables-save > /etc/iptables.up.rules"
在/etc/network/interfaces文件中增加两行,可以使得系统重新启动之前,将当前防火墙设置保存下来,并在下次启动的时候将防火墙设置读取
pre-up iptables-restore < /etc/iptables.up.rules
post-down iptables-save > /etc/iptables.up.rules
注意,这两行命令需要加在
iface eth0 inet dhcp之后,或者如果dhcp为static,应该加在ip地址、子网掩码、网关设置之后,举例如下:
auto lo
iface lo inet loopback
iface eth0 inet static
address 192.168.10.67
netmask 255.255.255.0
gateway 192.168.10.244
pre-up iptables-restore < /etc/iptables.up.rules
post-down iptables-save > /etc/iptables.up.rules
auto eth0
然后,可以通过重新启动网络服务检查是否有效。
限制网站
限制上网时间
有时候,我们要防止有人下班了以后留在公司里面上网,在IT公司里面经常出现这样的情况,把公司当网吧。所以需要针对一些ip地址和网卡地址做进一步的时间限制:
http://www.netfilter.org/documentation/HOWTO//netfilter-extensions-HOWTO-3.html#ss3.19
限制P2P技术
http://www.xxlinux.com/linux/article/network/app/20051201/388.html
限制流量
http://www.ymyasp.com/it/sort052/sort060/info15732.html