如何使用Ubuntu Linux创建SOHO路由器
Joff Thyer //
本文交叉发布于Packet Header,2016年3月1日。 __________ 在Security Weekly第452集中,我介绍了如何构建自己的小型办公室/家庭办公室有线路由器的技术片段。这篇博客文章将列出基本组件,并扩展技术片段。我们的目标是构建一个多段有线路由器,执行IPv4网络地址转换(NAT),运行Internet软件联盟(ISC)Bind9进行域名服务,以及ISC DHCP服务在网络内部分配IP地址。 注意:与本文相关的支持配置文件可以在https://bitbucket.org/jsthyer/soho_router找到。
从硬件角度来看,您可以选择任何支持Ubuntu 14.04.4 LTS服务器安装的双NIC或更高计算机。我建议至少1024MB(1GB)RAM和16GB硬盘空间。一些我发现有用的硬件包括Soekris Net6501(http://soekris.com/products/net6501-1.html)或Netgate RCC-VE 2440(http://store.netgate.com/ADI/RCC-VE-2440.aspx)。构建路由器的起点是安装Ubuntu-14.04.4 LTS服务器(64位),然后安装以下附加包:
|
|
下一个非常重要的步骤是确保在内核中启用IP转发。如果不这样做,您将无法路由任何数据包,游戏就结束了。要启用IP转发,请将以下行添加到/etc/sysctl.conf文件的底部,并重新启动系统。请注意,在更改系统配置时,我们将禁用IPv6,因为您可能不使用它。
/etc/sysctl.conf
路由器的配置核心是确保网络接口正确配置,并且您的IPTABLES配置设置正确,以正确转换和转发流量到互联网。
网络接口配置
从网络接口开始,我们假设您的公共互联网地址可以是静态的或通过DHCP获取。我们将分配Linux网络接口“eth0”作为到互联网服务提供商的广域网(WAN)连接。仅用于演示目的,我们假设静态互联网地址为255.1.1.2,网络掩码为/30。您的ISP设备将被分配255.1.1.1。您的公共网络子网掩码使用以下数学计算:子网掩码 = 2^32 – 2^(32-30) ⇒ 点四表示法中的255.255.255.252。我们还假设您的路由器设备上总共有四个网络接口,这将产生最多三个内部网段。下面列出的是/etc/network/interfaces文件的顶部部分。这不仅包含“eth0”定义,还包含一些额外的安全功能,形式为“空路由”,用于任何具有比连接接口更短前缀的RFC1918网络流量,并将多播(224.0.0.0/4)路由到位桶。如果您需要为互联网公共地址使用DHCP,可以取消注释标记的“eth0”接口条目,该条目以“使用dhcp”开头,并注释掉静态地址部分。另一个方面是,iptables规则预计列在/etc/iptables.rules中。更多关于此的内容将在文章后面介绍。
/etc/network/interfaces
现在我们需要确定我们网络的内部/内部接口是什么样子。为简单起见,我们将使用C类(/24)网络,并分别分配地址10.1.1.0/24、10.1.2.0/24和10.1.3.0/24。这是您配置/etc/network/interfaces文件其余部分以反映这一点的方式。
/etc/network/interfaces
IPTABLES规则配置
如网络接口配置文件中所述,我们将创建文件/etc/iptables.rules,并依赖网络代码在系统启动时加载配置。我们还可以随时使用“iptables-restore”命令测试我们的iptables配置。IPTABLES配置分为两个部分,即网络地址转换和过滤部分。简而言之,使用IPTABLES执行网络地址转换是一行代码。在此示例中,我们假设内部网络地址在10.0.0.0/8范围内,并且公共互联网协议地址(WAN接口)配置在“eth0”上。作为奖励,如果您想运行Squid web代理,有一行代码可以将内部网段上目标为TCP端口80的流量重写到标准Squid TCP端口3128。
NAT部分 /etc/iptables.rules
创建了iptables规则集的NAT部分后,您仍然需要创建过滤规则,以确定什么将进入和离开您的实际网关路由器系统,以及确定什么流量将通过路由器转发。我将在本文的多个不同部分分解IPTABLES规则的过滤部分,这些部分是:
- 路由器接收的流量(INPUT)
- 路由器发送的流量(OUTPUT)
- 通过路由器转发的流量(FORWARD)
- 路由器记录的流量(LOG_DROPS)
我们将通过向规则集添加“LOG_DROPS”链来开始IPTABLES配置的过滤部分。这将允许我们在任何被丢弃的流量上写入日志。之后,我们将为路由器本身实施一些常识性网络保护,包括:
- 丢弃任何源自从0.0.0.0/8到“eth0”的流量
- 丢弃任何源自从RFC1918地址到“eth0”的流量
- 丢弃任何源自从多播地址(224.0.0.0/4)到“eth0”的流量
- 丢弃分段的IP流量
- 丢弃IP TTL小于4的入口数据包
- 丢弃任何目标为TCP/UDP端口0的数据包
- 丢弃任何设置所有或无TCP标志的数据包
“filter”部分的起始部分。常识性保护。
在INPUT部分的下一部分,我们为路由器定义以下规则以接收流量如下:
- 接受所有到环回接口的流量。许多软件将使用环回进行内部通信,最好不要破坏事物。
- 接受任何接口上的域名服务(DNS)bind9服务器的流量。这是需要的,因为我们在路由器本身上运行bind9,并且我们可能决定托管一些我们自己的DNS区域。
- 接受来自我们内部网络的特定流量。这包括DNS、DHCP服务器请求、网络时间协议和Squid流量(如果您选择运行Squid)。
- 接受互联网控制消息协议(ICMP)。
数据包输入/入口(到路由器)部分“filter”部分
在OUTPUT部分,我们需要路由器将所有流量转发到环回接口,然后我们需要为路由器本身定义规则,以传输到内部网络和互联网,如下所示:
- 传输DNS流量到任何网络上的任何主机。
- 允许路由器在TCP端口43上执行“WHOIS”查询,并允许通过HTTP/HTTPS进行Ubuntu软件更新。
- 允许路由器执行网络时间协议查询。
- 允许路由器在内部网络上传输DHCP INFORM数据包。
- 允许路由器在内部网络上传输ICMP数据包。
数据包输出/出口部分(从路由器)“filter”部分
现在我们接受状态相关的数据包流,然后丢弃并记录任何其他内容。
IPTABLES规则的FORWARD部分确切地决定了什么流量能够流动(被转发)通过您的路由器。重要的是不要将此部分与规则的INPUT/OUTPUT部分混淆。FORWARD部分是魔术发生的地方,将数据包从您的内部网络获取到互联网。在此示例中,我们有一个相当自由的政策,允许所有IPv4 TCP、UDP和ICMP流量到互联网,并接受任何状态相关的流量。
将通过路由器接口转发的数据包
作为我们配置的最后一步,我们将所有丢弃的数据包记录到syslog LOCAL7设施。想法是我们可以配置“rsyslog”与匹配此前缀的规则,并将日志数据写入文件。
最后,我们通过将“iptables:”前缀添加到syslog数据流来记录事物。
有关额外信息,这里是我用于记录数据的“rsyslog”配置文件。
/etc/rsyslog.d/30-iptables.conf
DHCP和DNS服务
现在我们已经涵盖了转发数据包的基本核心组件,我们可以讨论DHCP和DNS。从DHCP开始,我们需要做的是在我们的三个内部网段上提供基本的IP地址服务。在每个段上,我们将从x.x.x.50的低地址开始,以便我们可以为其他杂项用途保留一些静态地址空间。我们还将设置租约时间为30天(30 * 86400秒)。地址将在所有三个内部网络接口(eth1、eth2和eth3)上提供。此文件保存为“/etc/dhcpd/dhcp.conf”。
/etc/dhcp/dhcpd.conf
关于bind9(DNS服务),默认的Ubuntu安装将产生一个缓存名称服务器,该服务器利用互联网根缓存服务器,并且对于大多数目的足够。一些人可能考虑的扩展是将查询转发到DNS过滤服务(如OpenDNS),和/或自行运行一些特定过滤。在我的情况下,我利用“dshield”坏域列表,该列表由SANS研究所的Johannes Ulrich维护。下面列出了如何配置bind9将所有查询转发到上游DNS服务器的示例。下面的配置截图是对“/etc/bind/named.conf.options”文件的修改,以将所有查询转发到上游Google DNS服务器8.8.8.8,并过滤能够执行递归DNS查询的网络。转发到上游服务器完全是可选的,如果您选择此选项,建议使用受信任的DNS过滤服务。过滤哪些客户端可以进行递归查询应被视为配置的重要组成部分。
/etc/bind/named.conf.options
关于“dshield”坏域列表,我创建了一个名为“get_malware_domains.sh”的shell脚本,其工作是获取URL“https://isc.sans.edu/feeds/suspiciousdomains_Low.txt”,然后将该列表转换为bind9配置文件格式。配置文件格式的示例如下。
named.conf.dshield文件
概念是,此文件中列出的任何域将解析到地址“127.0.0.1”。
db.blackhole文件内容。 以上所有描述性文本还将由一个包含此处描述的一些关键文件内容的小tar文件支持。狩猎愉快!