概述
如今GNU/Linux已经在网络应用中扮演着举足轻重的角色,Internet上无数的主机与服务正是由这个开放的系统所驱动。基于Linux系统与相关的GNU开源软件可以很方便的搭建一台健壮的路由器,事实上很多厂商的硬件路由器就是采用GNU/Linux作为软件解决方案。本文将讨论如何将一台Linux主机部署为一个小型局域网的网关路由器,实现局域网内部主机的Internet连接与防火墙保护。
本文基于RHEL/CentOS 6发行版,本文中的配置已经在CentOS 6.7上进行了测试,当然本文中的方法也可以应用于其他的Linux发行版中。
实验网络搭建
网络拓扑如下图所示,除非另作说明,下文中涉及到的主机均位于本网络中。

图中router1为Linux路由器,网卡eth0作为WAN接口,eth1作为LAN接口。server1与server2运行Linux操作系统,client2运行Windows 7操作系统。
为方便起见,可以采用虚拟化环境来搭建实验网络,以减少物理设备的数量。如上图中可以将虚线框内的主机作为虚拟机部署在一台物理主机内,此时仅需一台物理主机与一台硬件路由器即可以完成本实验。当然若手头空闲机器比较多的话,全部采用物理设备搭建网络也是个不错的选择。
这里说明一下当采用Vmware Workstation虚拟化环境时虚拟网络的配置。虚拟机router1需要配置2个虚拟网卡,其中网卡1用于WAN接口,设置为桥接模式,如下图所示:

网卡2用于LAN接口,连接模式设置为LAN区段,如下图所示:

虚拟机server1网卡设置为桥接模式,client2与server2网卡均设置为LAN区段,注意该LAN区段应与router1的网卡2相同。
开启路由转发
默认配置下,Linux内核将禁用路由转发,也就是说当内核协议栈发现接收到的IP数据包的目的地址不属于本机时,会将该数据包丢弃,而不进行路由转发。显然,路由转发是路由器的核心功能,因此首先需要确保router1上开启了路由转发功能。
使用下面的命令查看路由转发是否开启:
1 | [root@router1 ~]# cat /proc/sys/net/ipv4/ip_forward |
若输出为1表示开启,0表示关闭。
使用下面命令开启路由转发:
1 | [root@router1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward |
注意上面的命令并不更新配置文件,若想在系统重新启动后依然有效,需要编辑配置文件/etc/sysctl.conf,找到:
1 | net.ipv4.ip_forward=0 |
将其修改为:
1 | net.ipv4.ip_forward=1 |
配置WAN网络接口
按照图1,选择router1的eth0接口作为WAN接口,根据Internet接入方式来对WAN接口进行配置,常见的Internet接入方式有:静态IP、动态IP、PPPoE等。
静态IP
编辑文件:/etc/sysconfig/network-scripts/ifcfg-eth0
1 | DEVICE=eth0 |
重启网络接口
1 | [root@router1 ~]# ifdown eth0 |
动态IP
编辑文件:/etc/sysconfig/network-scripts/ifcfg-eth0
1 | DEVICE=eth0 |
重启网络接口,并察看接口配置情况
1 | [root@router1 ~]# ifdown eth0 |
PPPoE
PPPoE(PPP over Ethernet)是基于以太网的点对点传输协议,常用于ADSL宽带接入方式中。为方便测试,先在server1中部署PPPoE服务器。在server1上安装PPPoE客户端与服务器软件rp-pppoe:
1 | [root@server1 ~]# yum install rp-pppoe |
编辑文件:/etc/ppp/pppoe-server-options
1 | require-chap |
在/etc/ppp/chap-secrets中添加用户名与密码:
1 | # Secrets for authentication using CHAP |
开启路由转发
1 | [root@server1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward |
关闭防火墙:
1 | [root@server1 ~]# service iptables stop |
启动pppoe-server:
1 | [root@server1 ~]# pppoe-server -I eth0 -L 192.168.1.200 -R 192.168.1.201 -N 10 |
在配置完PPPoE服务器后,即可在router1上配置PPPoE客户端。同样,在router1上安装PPPoE客户端与服务器软件rp-pppoe:
1 | [root@router1 ~]# yum install rp-pppoe |
编辑文件:/etc/sysconfig/network-scripts/ifcfg-eth0,注意不要配置IP地址与默认网关,因为这将在PPPoE虚拟拨号中获取。
1 | DEVICE=eth0 |
运行PPPoE客户端配置脚本pppoe-setup,根据提示输入配置信息。
1 | [root@router1 ~]# pppoe-setup |
运行完脚本后将生成ppp0接口配置文件/etc/sysconfig/network-scripts/ifcfg-ppp0,运行下面命令启动PPPoE连接,并察看连接状态:
1 | [root@router1 ~]# ifup ppp0 |
配置LAN网络接口
按照图1,选择router1的eth1接口作为LAN接口,编辑配置文件:/etc/sysconfig/network-scripts/eth1
1 | DEVICE=eth1 |
重启网络接口
1 | [root@router1 ~]# ifdown eth1 |
在完成了WAN与LAN接口的配置后,router1应该可以正常访问Internet了。在进行下一步的配置前,需要确认router1能够正常访问Inernet,如果不能,则需要检查router1的接口配置与路由表。
配置NAT
网络地址转换(Network Address Translation, NAT)用于私有IP地址与公有IP地址之间的转换。采用NAT技术,LAN内的主机可以通过共享网关的公有IP地址来连接Internet。另外,NAT可以隐藏LAN内部的主机,阻断外部主机对LAN内部主机的主动连接请求,避免来自Internet的攻击,在一定程度上实现了LAN内的网络安全。关于NAT的更多内容请参考文献2。
Linux通过netfilter内核模块与iptables组件实现了NAT功能,若要实现router1中LAN接口与WAN接口间的NAT,只需添加如下iptables规则(若WAN配置为PPPoE方式时,需要将eth0替换为ppp0):
1 | [root@router1 ~]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE |
编辑文件:/etc/sysconfig/iptables,使配置在系统重新启动后依然有效。这里给出仅实现基本NAT功能的iptables配置文件
1 | *filter |
在编辑完配置文件后,不要忘了重新加载iptables规则,使配置生效。
1 | [root@router1 ~]# service iptables reload |
现在可以配置client2与server2的网络连接了,client2的网络配置如下图:

配置server2的网络接口,编辑文件:/etc/sysconfig/network-scripts/ifcfg-eth0
1 | DEVICE=eth0 |
重启网络接口
1 | [root@server2 ~]# ifdown eth0 |
这样,client2与server2就可以通过router1连接Internet了。到此router1作为网关路由器的基本功能已经配置完毕。
参考文献
- Red Hat, Inc. Red Hat Enterprise Linux 6 Deployment Guide
- Geoff Huston. A Look Inside Network Address Translators. The Internet Protocol Journal. Volume 7, Number 3.
本文作者:赵宝华
本文链接:https://blog.zbhitech.com/linux-router-deployment-guide/
版权声明:本文采用CC BY-NC-ND 4.0协议授权,转载请注明出处与原作者信息,请勿用于商业用途或修改原文内容。