0%

Linux路由器部署指南

概述

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

实验网络搭建

  网络拓扑如下图所示,除非另作说明,下文中涉及到的主机均位于本网络中。

Network Topology

图1 网络拓扑

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

Router1 Virtual Network Interface 1 Configuration

图2 router1虚拟网卡1配置

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

Router1 Virtual Network Interface 2 Configuration

图3 router1虚拟网卡2配置

  虚拟机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
2
3
4
5
6
7
8
9
10
11
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.1.122 #IP地址
NETMASK=255.255.255.0 #子网掩码
GATEWAY=192.168.1.1 #默认网关
DNS1=8.8.8.8 #DNS服务器,根据具体网络情况进行配置
DNS2=8.8.4.4 #同上
PEERDNS=yes
USERCTL=no

  重启网络接口

1
2
[root@router1 ~]# ifdown eth0
[root@router1 ~]# ifup eth0

动态IP

  编辑文件:/etc/sysconfig/network-scripts/ifcfg-eth0

1
2
3
4
5
6
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=dhcp
PEERDNS=yes
USERCTL=no

  重启网络接口,并察看接口配置情况

1
2
3
[root@router1 ~]# ifdown eth0
[root@router1 ~]# ifup eth0
[root@router1 ~]# ip addr show 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
2
3
4
5
6
7
8
9
10
require-chap
auth

#提供给PPPoE客户端的DNS,根据具体网络情况进行配置
ms-dns 8.8.8.8
ms-dns 8.8.4.4

proxyarp
lcp-echo-interval 10
lcp-echo-failure 2

  在/etc/ppp/chap-secrets中添加用户名与密码:

1
2
3
# Secrets for authentication using CHAP
# client server secret IP addresses
test * "password" *

  开启路由转发

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
2
3
4
5
DEVICE=eth0
TYPE=Ethernet
ONBOOT=no
BOOTPROTO=none
USERCTL=no

  运行PPPoE客户端配置脚本pppoe-setup,根据提示输入配置信息。

1
[root@router1 ~]# pppoe-setup

  运行完脚本后将生成ppp0接口配置文件/etc/sysconfig/network-scripts/ifcfg-ppp0,运行下面命令启动PPPoE连接,并察看连接状态:

1
2
[root@router1 ~]# ifup ppp0
[root@router1 ~]# ip addr show ppp0

配置LAN网络接口

  按照图1,选择router1的eth1接口作为LAN接口,编辑配置文件:/etc/sysconfig/network-scripts/eth1

1
2
3
4
5
6
7
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.10.1
NETMASK=255.255.255.0
USERCTL=no

  重启网络接口

1
2
[root@router1 ~]# ifdown eth1
[root@router1 ~]# ifup 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
# Enable SSH
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# 当WAN连接方式为PPPoE时,将下面的eth0替换为ppp0
-A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE
COMMIT

  在编辑完配置文件后,不要忘了重新加载iptables规则,使配置生效。

1
[root@router1 ~]# service iptables reload

  现在可以配置client2与server2的网络连接了,client2的网络配置如下图:

Client2 Network Configuration

图4 client2网络配置

  配置server2的网络接口,编辑文件:/etc/sysconfig/network-scripts/ifcfg-eth0

1
2
3
4
5
6
7
8
9
10
11
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.10.102 #IP地址
NETMASK=255.255.255.0 #子网掩码
GATEWAY=192.168.10.1 #默认网关
DNS1=8.8.8.8 #DNS服务器,根据具体网络情况进行配置
DNS2=8.8.4.4 #同上
PEERDNS=yes
USERCTL=no

  重启网络接口

1
2
[root@server2 ~]# ifdown eth0
[root@server2 ~]# ifup eth0

  这样,client2与server2就可以通过router1连接Internet了。到此router1作为网关路由器的基本功能已经配置完毕。

参考文献

  1. Red Hat, Inc. Red Hat Enterprise Linux 6 Deployment Guide
  2. 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协议授权,转载请注明出处与原作者信息,请勿用于商业用途或修改原文内容。