配置指导:使用OpenWrt制作出口设备
1 目标概述
本文主要描述如何使用OpenWrt镜像在X86服务器上制作出口设备。
2 适用场景
- 需要搭建模拟测试环境对接防火墙或BGP设备。
- 需要输出带防火墙等相关的验证解决方案的材料。
注意:OpenWrt不支持VRF。
3 获取软件
下载地址:openwrt-22.03.5-x86-64-generic-ext4-combined.img.gz
https://downloads.openwrt.org/releases/22.03.5/targets/x86/64/openwrt-22.03.5-x86-64-generic-ext4-combined.img.gz
4 硬件与软件环境
4.1 硬件环境
名称 | 型号 | 硬件指标 | 备注 |
服务器或台式机 | X86 | CPU大于4核 内存大于4G | 安装的centos7 |
4.2 软件环境
软件 | 版本 | 备注 |
OpenWrt | openwrt-22.03.5-x86-64-generic-ext4-combined.img | / |
vncviewer | Vncviewer-4.2.9 | / |
5 KVM安装OpenWrt
5.1 KVM安装
关闭selinux:
临时关闭:setenforce 0
永久关闭:
vim /etc/sysconfig/selinux
打开文件设置 SELINUX=disabled
安装KVM相关软件包:
yum install qemu-kvm qemu-img virt-manager libvirt libvirt-python virt-manager libvirt-client virt-install virt-viewer -y
启动libvirt并设置开机自启动:
systemctl start libvirtd
systemctl enable libvirtd
5.2 安装OpenWrt
下载组件
OpenWrt官网地址: https://openwrt.org/zh/downloads
固件下载地址: https://downloads.openwrt.org/releases/
找到最新版的固件, 我这里选择的是:
https://downloads.openwrt.org/releases/22.03.5/targets/x86/64/openwrt-22.03.5-x86-64-generic-ext4-combined.img.gz
#下载后先解压缩:
#wget https://downloads.openwrt.org/releases/22.03.5/targets/x86/64/openwrt-22.03.5-x86-64-generic-ext4-combined.img.gz
#gzip -d openwrt-22.03.5-x86-64-generic-ext4-combined.img.gz
安装命令
#先创建服务器上的网桥br0,给网桥br0配置IP,挂载物理网口。
[root@computer1 opt]#brctl addbr br0
[root@computer1 opt]#brctl addif eno2
[root@computer1 opt]# ip address add 10.240.4.223 dev br0
#如果要把配置固化下来,可以写到配置文件里面。
[root@computer1 opt]#vi /etc/sysconfig/network-scripts/ifcfg-bro
TYPE=bridge
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=no
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=10.240.4.223
PREFIX=24
GATEWAY=10.240.4.1
[root@computer1 opt]#vi /etc/sysconfig/network-scripts/ifcfg-eno2
TYPE=Ethernet
BOOTPROTO=none
NM_CONTROLLED=no
NAME=eno2
DEVICE=eno2
ONBOOT=yes
BRIDGE=br0
virt-install --name openwrt --ram 1024 --vcpus 2 --disk path=/opt/openwrt-22.03.5-x86-64-generic-ext4-combined.img --network bridge=br0,model=e1000 --force --import --autostart --vnc --vncport=5911 --vnclisten=0.0.0.0
可以通过vncviewr访问
也可以直接在服务器通过virsh console openwrt访问
如果想重新创建,先删除
[root@computer1 opt]# virsh undefine openwrt
Domain openwrt has been undefined
[root@computer1 opt]# virsh destroy openwrt
Domain openwrt destroyed
#给OpenWrt虚拟机配置业务IP
#OpenWrt默认会创建网桥br-lan,并且该网桥绑定eth0
6 高可用方案
创建另一台 OpenWrt虚机
复制镜像
cp openwrt-22.03.5-x86-64-generic-ext4-combined.img openwrt-22.03.5-x86-64-generic-ext4-combined-2.img
启动第二台OpenWrt(主要修改name、镜像名字、vncport)
virt-install --name openwrt2 --ram 1024 --vcpus 2 --disk path=/opt/openwrt-22.03.5-x86-64-generic-ext4-combined-2.img --network bridge=br0,model=e1000 --force --import --autostart --vnc --vncport=5912 --vnclisten=0.0.0.0
登陆后修改第二台OpenWrt的IP为10.240.4.225
root@OpenWrt:~# vi /etc/config/network
config interface 'loopback'
option device 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'
config globals 'globals'
option ula_prefix 'fd0a:d001:29bb::/48'
config device
option name 'br-lan'
option type 'bridge'
list ports 'eth0'
config interface 'lan'
option device 'br-lan'
option proto 'static'
option ipaddr '10.240.4.225'
option netmask '255.255.255.0'
option ip6assign '60'
给两台OpenWrt添加默认路由
route add default gw 10.240.4.1
修改DNS
root@OpenWrt:~# vi /etc/resolv.conf
nameserver 114.114.114.114
两台OpenWrt,安装keepalived
opkg update
opkg install keepalived
配置keepalived
两台虚机修改/etc/config/keepalived
配置主机
cat > /etc/config/keepalived <<-EOF
config globals 'globals'
option alt_config_file "/etc/keepalived/keepalived.conf"
EOF
修改/etc/keepalived/keepalived.conf
配置主机
cat > /etc/keepalived/keepalived.conf <<-EOF
! Configuration File for keepalived
! failover E1 and I1 at the same time
vrrp_sync_group G1 {
group {
I1
}
}
! internal
vrrp_instance I1 {
state master
interface br-lan
virtual_router_id 51
priority 101
advert_int 1
virtual_ipaddress {
10.240.4.226/24
}
authentication {
auth_type PASS
auth_pass s3cret
}
nopreempt
}
EOF
配置备机:
cat > /etc/keepalived/keepalived.conf <<-EOF
! Configuration File for keepalived
! failover E1 and I1 at the same time
vrrp_sync_group G1 {
group {
I1
}
}
! internal
vrrp_instance I1 {
state backup
interface br-lan
virtual_router_id 51
priority 50
advert_int 1
virtual_ipaddress {
10.240.4.226/24
}
authentication {
auth_type PASS
auth_pass s3cret
}
nopreempt
} EOF
重新启动服务:
/etc/init.d/keepalived restart
在主路由上面 ip a 命令可以看到 vip 地址已经有了,电脑ping 这个地址可以通了
主机IP 10.240.4.224/24,备机IP 10.240.4.225/24
主机关闭该服务后IP只有10.240.4.224/24,虚拟IP丢失。
root@OpenWrt:/# /etc/init.d/keepalived stop
查看备机加载了虚拟IP:10.240.4.226/24
root@OpenWrt:/# ip a|grep br-lan
br-lan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
inet 10.240.4.225/24 brd 10.240.4.255 scope global br-lan
inet 10.240.4.226/24 scope global secondary br-lan
主机重启该服务后虚拟IP重新加载
root@OpenWrt:/# /etc/init.d/keepalived restart
备机同时则虚拟IP丢失
root@OpenWrt:/# ip a|grep br-lan
br-lan: mtu 1500 qdisc noqueue state UP group default
inet 10.240.4.225/24 brd 10.240.4.255 scope global br-lan
说明:
直接方法就是断开任意一个路由(10.240.4.224或者10.240.4.225),看虚拟路由VIP:10.240.4.226是否ping通。
有需要对wan口配置vrrp,可以参考官网配置:https://openwrt.org/docs/guide-user/network/high-availability
7 防火墙功能
OpenWrt 内置防火墙介绍
Openwrt 的防火墙实现与Linux的防火墙是通过netfilter内核模块,加上用户空间的iptables管理工具;同样是五链四张表、五元素的管理框架。
OpenWRT开发了一套与iptables同地位的netfilter管理工具fw3,这个工具侧重于从uci格式的配置文件中获取过滤信息下发到内核的netfilter中去。防火墙文件总会在/etc/init.d/firewall 启动的时候由 UCI 解码并且生成 iptables规则生效。
OpenWrt 关于 NAT、 DMZ、防火墙规则等等都是由配置文件 /etc/config/firewall 文件控制。
防火墙的修改生效,需要重启防火墙执行以下指令:
root@OpenWrt:/# /etc/init.d/firewall restart
或执行:
root@OpenWrt:/# /etc/init.d/firewall reload
查看当前 iptables 的已启用策略语法为:
root@OpenWrt:/# iptables –L
防火墙内容解析
我们打开防火墙文件查看一下:
root@OpenWrt:/# vi /etc/config/firewall
第一部分 默认参数
config defaults
option syn_flood '1'
option input 'ACCEPT'
option output 'ACCEPT'
option forward 'REJECT'
这里是防火墙默认的参数表,其内容和相应的动作可以有如下选择:
防火墙文件这方面的内容为:
syn_flood 1 表示: 是否启用防泛洪攻击。可选值: 0 关闭,1 启用。
input ACCEPT 表示: 设置 INPUT 链(chain)的过滤策略,可选值: ACCEPT 允许, REJECT拒绝。
output ACCEPT 表示: 设置 OUTPUT 链(chain)的过滤策略,可选值: ACCEPT 允许,REJECT 拒绝。
forward REJECT 是 设置 FORWARD 链(chain)的过滤策略,可选值: ACCEPT 允许,REJECT 拒绝。
disable_ipv6 1 表示: 设置关闭掉 IPv6 的防火墙策略,可选值: 0 忽略,1 关闭
这部分参考值既是系统默认的即可,无需修改。
第二部分 域 :
config zone
option name 'lan'
list network 'lan'
option input 'ACCEPT'
option output 'ACCEPT'
option forward 'ACCEPT'
config zone
option name 'wan'
list network 'wan'
list network 'wan6'
option input 'REJECT'
option output 'ACCEPT'
option forward 'REJECT'
option masq '1' #NAT转换使能
option mtu_fix '1'
config 后面是表示配置项的名称,这里”zone”为域的意思。
name 表示域的名字,必须是唯一值,可选值: wan, lan
network 表示网络列表,用来指示哪些接口被捆绑到这个域中,可选接口的名称,比如: lan,
wan, wan6
input ACCEP 允许 INPUT 链(chain)的过滤策略
output ACCEPT 允许 OUTPUT 链(chain)的过滤策略
forward ACCEPT 允许 FORWARD 链(chain)的过滤策略
masq 1 表示: 设置传输伪装,如果是 WAN 口必须为 1,实现NAT转换使能
mtu_fix 1 表示: 设置 MTU 的 MSS Clamping,如果是 WAN 口设为 1
简单来说:
mtu 是网络传输最大报文包。
mss 是网络传输数据最大值。
mss 加包头数据就等于 mtu.
这部分的设置作用如下:
zone将一个或多个接口分组,并用作forwardings, rules and redirects的源或目的地。传出流量的Masquerading(NAT)是在每个zone的基础上进行控制的。
第三部分 转发
config forwarding
option src 'lan'
option dest 'wan'
src lan 是设置转发来源
dest wan 是设置转发目标
这部分作用描述如下:
Forwarding部分控制zones之间的业务流,并且可以实现特定方向的MSS Clamping。转发规则只涵盖一个方向。为了允许两个zone之间的双向流量,需要两个转发,其中src和dest分别反向。
第四部分 规则
config rule
option name ‘Allow-DHCP-Renew’
option src ‘wan’
option proto ‘udp’
option dest_port ’68’
option target ‘ACCEPT’
option family ‘ipv4’
config rule
option name ‘Allow-Ping’
option src ‘wan’
option proto ‘icmp’
option icmp_type ‘echo-request’
option family ‘ipv4’
option target ‘ACCEPT’
config rule
option name ‘Allow-IGMP’
option src ‘wan’
option proto ‘igmp’
option family ‘ipv4’
option target ‘ACCEPT’
这里只是罗列出了几个防火墙的规则,其实防火墙规则在/etc/config/firewall 中可以有任意数量的规则,这些规则定义了数据传输的动作和行为是被允许还是拒绝。
对于防火墙规则的作用描述如下:
规则可用于定义基本的接受或拒绝规则,以允许或限制对特定端口或主机的访问。像重定向,规则被绑定到给定的source zone,并与传入的流量相匹配。
防火墙规则的相应选项的意思:
name 表示:设置当前这个 rule 的名称
target 表示:设置防火墙动作,可选值: ACCEPT 许可, REJECT 拒绝, DROP 抛弃
src 表示: 数据源的 zone 域是哪个。可选值: wan / lan
src_ip 表示:数据源的 IP 地址是哪个。
src_mac 表示:数据源的 MAC 地址是哪个。
src_port 表示:数据源的端口,可以是一个端口,或一个端口范围,但是必须
同时指定了协议类型
proto 表示: 数据源的协议类型, 可选值: tcp, udp, tcpudp, udplit, icmp, esp, ah, sctp,
或 all 表示全部
dest 表示:数据目标的 zone 域是哪个。可选值: wan / lan
dest_ip 表示:数据目标的 IP 地址。
dest_port 表示:数据目标的端口,可以是一个端口,或一个端口范围,但是必须同时指定了协议类型
family 表示:数据的协议族,可选值: ipv4, ipv6, any
rule 规则设置可以灵活,比如允许来自 WAN 口的 ping,
例:
config rule
option name Allow-Ping
option src wan
option proto icmp
option icmp_type echo-request
option family ipv4
option target ACCEPT
第五部分内容 端口转发、重定向
# 8080 代理
config redirect
option target 'DNAT'
option name 'port-redirect'
option src 'wan'
option src_dport '8080'
option dest 'lan'
option dest_ip '192.168.40.2'
option dest_port '18080'
# port 2000 ssh login local machine
config redirect
option target 'DNAT'
option name 'port-2000'
list proto 'tcp'
option src 'wan'
option src_dport '2000'
option dest 'lan'
option dest_port '22'
OpenWrt 防火墙允许使用者通过 WAN 口访问特定的端口重定向给局域网的一台电脑设备(比如 WAN 口访问 80 端口(HTTP)将重定向给局域网某台网站服务器)。 端口重定向是在防火墙配置/etc/config/firewall 中定义 redirect 段策略实现的。所有匹配的来源数据将根据目标设置转发到目标主机上。 firewall 配置中可以有多个 redirect 策略,默认是没有开放任何重定向的,如果需要重定向请使用 vi 或 UCI 进行配置。
name 表示:设置当前这个 redirect 的名称
src 表示:转发源的 zone 域,一般转发都是转发从 wan 过来的访问
src_ip 表示:转发源的 IP 地址指定
src_mac 表示:转发源的 MAC 地址指定
src_port 表示:转发源的端口指定
proto 表示: 转发源的协议类型, 可选值: tcp, udp, tcpudp, udplit, icmp, esp, ah, sctp, 或
all 表示全部
dest 表示:转发目标的 zone 域
dest_ip 表示:转发目标的 IP 地址指定
dest_mac 表示:转发目标的 MAC 地址指定
dest_port 表示:转发目标的端口指定
端口重定向的可配置性很灵活。比如我们将 8080 这个端口转发给内网一台服务器的 18080 端口。
第六部分内容 IPV6
config rule
option name 'Allow-DHCPv6'
option src 'wan'
option proto 'udp'
option src_ip 'fc00::/6'
option dest_ip 'fc00::/6'
option dest_port '546'
option family 'ipv6'
option target 'ACCEPT'
config rule
option name 'Allow-MLD'
option src 'wan'
option proto 'icmp'
option src_ip 'fe80::/10'
list icmp_type '130/0'
list icmp_type '131/0'
list icmp_type '132/0'
list icmp_type '143/0'
option family 'ipv6'
option target 'ACCEPT'
config rule
option name 'Allow-ICMPv6-Input'
option src 'wan'
option proto 'icmp'
list icmp_type 'echo-request'
list icmp_type 'echo-reply'
list icmp_type 'destination-unreachable'
list icmp_type 'packet-too-big'
list icmp_type 'time-exceeded'
list icmp_type 'bad-header'
list icmp_type 'unknown-header-type'
list icmp_type 'router-solicitation'
list icmp_type 'neighbour-solicitation'
list icmp_type 'router-advertisement'
list icmp_type 'neighbour-advertisement'
option limit '1000/sec'
option family 'ipv6'
option target 'ACCEPT'
config rule
option name 'Allow-ICMPv6-Forward'
option src 'wan'
option dest '*'
option proto 'icmp'
list icmp_type 'echo-request'
list icmp_type 'echo-reply'
list icmp_type 'destination-unreachable'
list icmp_type 'packet-too-big'
list icmp_type 'time-exceeded'
list icmp_type 'bad-header'
list icmp_type 'unknown-header-type'
option limit '1000/sec'
option family 'ipv6'
option target 'ACCEPT'
第七部分 IPSec
config rule
option name 'Allow-IPSec-ESP'
option src 'wan'
option dest 'lan'
option proto 'esp'
option target 'ACCEPT'
config rule
option name 'Allow-ISAKMP'
option src 'wan'
option dest 'lan'
option dest_port '500'
option proto 'udp'
option target 'ACCEPT'
允许 IPSec tunnel 通过防火墙,分别 IKA SA 、IPSec SA 放行。
第八部分 扩展内容
config include
option path '/etc/firewall.user'
config include 'miniupnpd'
option type 'script'
option path '/usr/share/miniupnpd/firewall.include'
option family 'any'
option reload '1'
DMZ 介绍
DMZ 是英文“ demilitarized zone”的缩写,中文名称为“隔离区”。它是为了解决安装防火墙后外部网络不能访问内部网络服务器的问题,而设立的一个非安全系统与安全系统之间的缓冲区,这个缓冲区位于企业内部网络和外部网络之间的小网络区域内,在这个小网络区域内可以放置一些必须公开的服务器设施,如企业 Web 服务器、FTP 服务器和论坛等。另一方面,通过这样一个 DMZ 区域,更加有效地保护了内部网络,因为这种网络部署,比起一般的防火墙方案,对攻击者来说又多了一道关卡。端口映射与 DMZ 的区别在于:端口映射只是映射指定的端口,DMZ 相当于映射所有的端口,并且直接把主机暴露在网关中,比端口映射方便但是不安全。
下面是关于 DMZ的一个示意图:
结合之前简单的规则部分,这里我们给出一个将电脑 192.168.1.2 设置 DMZ 隔离区的例子:
Simple DMZ rule
The following rule redirects all WAN ports for all protocols to the internal host
192.168.1.2.
config redirect
option src wan
option proto all
option dest_ip 192.168.1.2
iptables 命令
DNAT 目的地址、目的端口的转换
iptables -t nat -A zone_wan_prerouting -p tcp \
-s 192.168.9.20/255.255.255.255\
-d 192.168.8.20/255.255.255.255\
-m tcp --sport 3333 --dport 2222\
-m comment --comment "@redirect[0]"\
-j DNAT --to-destination 192.168.10.20:22
如果遇到“源地址192.168.8.20,目的地址192.168.8.20,源端口3333,目的端口2222”的数据包,修改成“源地址192.168.168.8.20,目的地址192.168.10.20,源端口3333,目的端口22”的数据包。
iptables -t nat -A zone_wan_prerouting -p tcp\
-d 192.168.8.20/255.255.255.255\
-m tcp --dport 2222 -m comment\
--comment "@redirect[0]" -j REDIRECT --to-ports 22
如果遇到“目的地址192.168.8.20,目的端口2222,协议为tcp”的数据包,修改成“源地址保持,目的地址192.168.10.20,源端口保持,目的端口22,协议为tcp”的数据包。
SNAT 数据包的源地址转换
iptables -t nat -A zone_lan_postrouting -p tcp\
-s 192.168.9.20/255.255.255.255\
-d 192.168.10.20/255.255.255.255\
-m tcp --sport 3333 --dport 22\
-m comment --comment "@redirect[0]" \
-j SNAT --to-source 192.168.8.20:2222
当遇到“源地址192.168.9.20,目的地址192.168.10.20,源端口3333,目的端口22,协议为TCP”的数据包时,将其源地址和源端口修改为(192.168.8.20,2222)
查看 NAT 表,区别 uci 配置与 iptables 配置的关系
root@ixeCloud:/etc/config# iptables -t nat -L |tail -n 5
prerouting_wan_rule all -- anywhere anywhere /* !fw3: Custom wan prerouting rule chain */
DNAT tcp -- anywhere anywhere tcp dpt:8080 /* !fw3: port-redirect */ to:192.168.40.2:18080
REDIRECT tcp -- anywhere anywhere tcp dpt:2000 /* !fw3: port-2000 */ redir ports 22
DNAT tcp -- 192.168.9.20 192.168.8.20 tcp spt:3333 dpt:2222 /* @redirect[0] */ to:192.168.10.20:22
REDIRECT tcp -- anywhere 192.168.8.20 tcp dpt:2222 /* @redirect[0] */ redir ports 22
通过 uci 命令修改的 firewall 的内容,需要加载 firewall reload 后,防火墙参数才可以生效;而 iptables 命令修改后直接生效。
注意: 在 OpenWRT 的 web 配置页面不显示 iptables 配置的NAT内容。
8 BGP功能
BGP Routing on OpenWrt with Quagga
Quagga Routing Suite是一个开源软件套件,为 Unix 平台提供稳定的 BGPv4 实现。它由一个核心 zebra 守护进程和支持各种路由协议(包括 RIP、OSPF 和 BGP)的守护进程组成。
在 OpenWrt 上安装组件
9 端口聚合功能
重新创建虚机,添加两个接口
virt-install --name openwrt --ram 1024 --vcpus 2 --disk path=/opt/openwrt-22.03.5-x86-64-generic-ext4-combined.img --network bridge=br0,model=e1000 --network bridge=br0,model=e1000 --force --import --autostart --vnc --vncport=5911 --vnclisten=0.0.0.0
给OpenWRT安装必要软件包,以启用bond的支持
opkg update
opkg install kmod-bonding luci-proto-bonding proto-bonding
接着从br-lan中移除eth0
brctl delif br-lan eth0
ifconfig br-lan down
在自动启动脚本中增加如下配置,以便在开机时自动创建bond网卡
需要添加的内容如下(添加至 exit 0之前),需要根据实际情况修改网卡名称(即下方的eth0和eth1为你要聚合的两个网口)
modprobe bonding mode=balance-rr miimon=100
#添加 bond 类型的虚拟接口 名称为 bond-wan
ip link add bond-wan type bond mode balance-rr
#将eth0添加到聚合接口
ifconfig eth0 down
ip link set eth0 master bond-wan
#将eth1添加到聚合接口
ifconfig eth1 down
ip link set eth1 master bond-wan
ip link set bond-wan up #启动该网卡
修改 wan 接口的网卡为 bond-wan 。
同理,如果要对lan接口做聚合,可以配置bond-lan,然后修改 lan接口的网卡为 bond-lan。
如果不想用命令行添加,也可以在界面luci上添加。
网络 -> 接口 -> 添加新接口-> 新接口的协议 -> 链路聚合(通道绑定)
之后在 高级设置->从属接口 选择网卡,其他参数默认即可
配置IP和路由:
ifconfig bond-wan 10.240.4.224 netmask 255.255.255.0
route add default gw 10.240.4.1
10 创建VLAN
1) 在 “接口” 页面,切换至 “设备” 选项卡,点击左下角的 “添加设备配置”,添加一 “网桥设备”。如果是新安装的OpenWrt,也可直接编辑网桥设备 “br-lan”,在名为 “br-lan” 设备的右侧,点击 “配置” 按钮。
2) 在“常规设备选项”中,将“网桥端口”更改为eth0,此时所有eth0端口的数据将经过该网桥。
3) 切换至 “网桥VLAN过滤” 选项卡,启用VLAN过滤,并新增VLAN 101、1000。eth0作为他们俩已标记的出口。设置完毕后点击“保存”按钮。这样,网桥内VLAN ID为101、1000的数据,将会被打上VLAN Tag后,从eth0端口发送。
4) 在“设备”界面,可见自动新增了两个软件VLAN设备。通过eth0进入网桥“br-lan”的数据,将根据VLAN ID标签,将其转发至虚拟的br-lan.1000和br-lan.101设备。同时,br-lan.1000和br-lan.101设备发送的数据,进入网桥br-lan后,将根据设定的VLAN过滤规则,决定是否加上VLAN Tag从对应的实际硬件设备进行转发。