双网口群晖NAS做路由器

家里面的网不是很好,一直想搞个软路由,硬件成本要1000+,无奈疫情又降薪不敢入,手里只有一个群晖DS920+的NAS。
于是用VMM安装了软路由(koolshare),但是在拨号一直拨号不成功,不知道是不是因为我的宽带是移动的原因,
换了爱快的软路由也是一样的拨号不成功,网上各种找资源之后将NAS作为路由器,两个网口,一个连接外网拨号上网(WAN),
一个连接内网(LAN),连接交换机后互联内网各种设备。搞完不知道是不是心里作用,感觉网络好像快了一些,之前看视频要等一两秒,现在几乎是秒开。

1.准备条件

  • 双网口的NAS,我的是群辉920+
  • 宽带账号和密码,拨号上网用

2.设置网卡IP

在DSM控制面板:网络->网络界面中看到有两个局域网
img.png
局域网1对应的网络接口是eth0,局域网2对应的网络接口是eth1

2.1 固定内网IP

我们将局域网1作为LAN,接入路由器的LAN端口,在这里将他的IP固定:
img_1.png
因为要将该网口作为网关,所以直接将网关地址设置为本机地址。

2.2 设置拨号网卡IP

因为我的局域网2是连接到光猫的,直接获取的IP地址,这里按需设置,如果是设置为固定IP,不能和上面设置的IP(LAN)在一个网段。
img_2.png

3. 设置内网DHCP服务

进入DSM控制面板,找到DHCP Server,选中右边的局域网1,点击上面的编辑:
img_3.png
勾选启用DHCP服务器,然后将主DNS设置为刚才设置的IP地址,从DNS可以随便填一个知名的,以防万一。
img_4.png
点击下方的新增,配置一个子网,地址租用时间的地方填入数字,单位是秒,86400就是一天:
img_5.png
添加完成后确定,然后在新加的子网的最右边勾上已启动,然后确定就设置完成,如果没有启动就手动启动一下。

4.设置外网拨号

回到控制面板的网络界面中,新增pppoe拨号:
img_9.png
局域网选择局域网2,填入宽带用户名和密码然后确定。之后选中PPPoE,右键菜单连接,连接成功如下:
img_10.png
至此拨号成功。

5.设置iptables端口转发

在NAS上新建一个文件nat.sh,保存位置随意,这里保存在/volume1/app/nat.sh,添加以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# Script to enable port forwarding and IP Masquerading, to share
# the primary internet connection to the second port of DS718+

action=$1
shift;

INT_IFACE="eth0"
IFCFG_FILE="/etc/sysconfig/network-scripts/ifcfg-${INT_IFACE}"
DHCPD_CONF="/etc/dhcpd/dhcpd.conf"
RULES_NAT="/etc/firewall_rules_nat.dump"

logerr() { # [logger args] [msgs...]
TAG="nat_router"
[ ! -z "$action" ] && TAG="${TAG} (${action})"
logger -p user.err -t "${TAG}" "$@"
}

# Guard to prevent execution if NAT is not supposed to be enabled
[ -e $IFCFG_FILE -a -e ${DHCPD_CONF} ] || { logerr "Missing config files"; exit 1; }

IPADDR=`get_key_value ${IFCFG_FILE} IPADDR`
NETMASK=`get_key_value ${IFCFG_FILE} NETMASK`
IS_ROUTER=`grep option:router ${DHCPD_CONF} | grep -c ${IPADDR}`

[ ${IS_ROUTER} -eq 0 ] && { logerr "Routing mode not enabled on ${INT_IFACE}"; exit 1; }

# Calculate local network CIDR
CIDR_PREFIX=`ipcalc -p ${IPADDR} ${NETMASK} | cut -d'=' -f2`
CIDR_IP=`ipcalc -n ${IPADDR} ${NETMASK} | cut -d'=' -f2`
CIDR="${CIDR_IP}/${CIDR_PREFIX}"

setup_nat() {
# Enable port forwarding, in case not enabled by default
echo 1 > /proc/sys/net/ipv4/ip_forward

# Load the required modules
#/usr/syno/etc.defaults/rc.d/S01iptables.sh load_nat_mod forwarding_test
}

load_nat_rules() {
if [ -e ${RULES_NAT} ]; then
/sbin/iptables-restore -n < ${RULES_NAT} &> /dev/null
if [ $? -eq 0 ]; then
logerr "NAT rules loaded successfully"
else
logerr "Error loading NAT rules from: ${RULES_NAT}"
exit 1;
fi
else
logerr "No NAT rules found"
fi

# Define the masquerading rule
/sbin/iptables -t nat -D POSTROUTING -s ${CIDR} -j MASQUERADE &> /dev/null # don't add twice
/sbin/iptables -t nat -A POSTROUTING -s ${CIDR} -j MASQUERADE
}

save_nat_rules() {
TMP_RULES="/tmp/firewall_rules_nat.tmp"

echo "# $(date)" > ${TMP_RULES}
echo "*nat" >> ${TMP_RULES}

/sbin/iptables-save -t nat | grep "\-j DNAT" | uniq >> ${TMP_RULES}

echo "COMMIT" >> ${TMP_RULES}
mv -f ${TMP_RULES} ${RULES_NAT}

logerr "NAT rules saved to ${RULES_NAT}"
}

clear_nat_rules() {
/sbin/iptables-save -t nat |grep "\-j DNAT" | sed 's/^-A /-D /g' | while read line; do
if [ ! -z "$line" ]; then
/sbin/iptables -t nat $line &> /dev/null
fi
done

/sbin/iptables -t nat -D POSTROUTING -s ${CIDR} -j MASQUERADE &> /dev/null
}

case "$action" in
start)
setup_nat
load_nat_rules
;;
stop)
save_nat_rules
clear_nat_rules
;;
restart)
save_nat_rules
clear_nat_rules
load_nat_rules
;;
*)
echo "Usage: $0 [start|stop|restart]"
;;
esac

exit 0

注意:脚本第7行:INT_IFACE="eth0"的eth0对应的就是局域网1,如果是将局域网2作为LAN,则需要将eth0改为eth1。

运行脚本:

1
sudo sh nat.sh start

手机连上路由器(路由器的WAN端口不需要插网线)然后尝试访问外部网络,能否访问成功,能访问成功就设置完成。

6.设置脚本开机启动

在DSM控制面板中找到任务计划,新增->触发的计划->用户定义的脚本:
img_6.png
在常规中设置用户账户为root,事件设置为开机,勾选已启动,因为刚才已经运行一次了。任务设置中设置脚本:

1
sh /volume1/app/nat.sh start

img_7.png
这里的路径就是之前创建的路径。

7.停止作为路由器使用

先停掉服务(重启NAS也可以):

1
sh /volume1/app/nat.sh start

然后将创建的开机启动任务禁用或者删除。

8.待验证事项

  • 断线之后(比如拔掉网线)后PPPoE会自动重拨。
  • 断网断电后是否会自动拨号重连?