我之前寬帶一直都是光貓撥號,電腦和NAS直連光貓,光貓下掛個二級無線路由器來給其他設備聯網,但我早就對這個拓撲不爽了,主要原因是自己花大錢買的AC86U派不上用場,只能乾點邊緣的雜活,而且搞兩套局域網怎麼看都挺噁心的。之前也試過把路由器改成AP模式,讓所有設備都直連光貓,但是萬惡的電信光貓限制了設備數,只有前5台機器能上網,其它的機器雖然能拿到地址,但是上網必定超時。那現在既然有了台服務器,那乾脆裝個軟路由。
軟路由系統我打算玩玩RouterOS,畢竟iKuai聽説過沒用過,據説還出過劫持流量這種問題,不敢用也不想用;OpenWRT以前玩過,沒啥新鮮感,而RouterOS,之前裝着玩的時候就覺得倍高檔,早就想搞搞它玩玩了。
獲取光貓中的配置
我找裝維師傅説要玩貓棒,需要進後台看參數,師傅就把密碼查給我了。
用超級密碼登錄光貓後台,把LOID、PPPoE的用户名和密碼(密碼需要base64解碼才能得到真實的密碼)、IPv6前綴長度記在一個文檔裏備查。
準備貓棒
因為我懶得找運營商的裝維師傅給我改橋接(之前溝通過,師傅説要先換光貓,新光貓又得等),也考慮到留着原來的光貓配置不變的話,在我折騰翻車的時候也不需要再找裝維師傅改回路由模式,直接把光纖接回去就能恢復網絡,所以我直接在淘寶上買了根ODI的貓棒。又因為服務器上沒有SFP口,我也不想再買個網卡,就順便一起買了個光電轉換器。
之前瞭解到,光纖的端面接口有PC、UPC、APC三種,之所以選擇ODI的光貓,就是因為我們一般寬帶光纖的端面是UPC的,而諾基亞和阿爾卡特之類的貓棒是APC接口,還要套個轉換器才行,硬插進去可能會損壞光纖,但ODI這款採用的就是UPC接口,不用再買轉換器。但是我無法保證覆蓋所有情況,如果你也想用貓棒,請一定提前跟店家和裝維師傅確認好,如果頂壞了光纖端面,你只能喊裝維師傅來給你重新做接頭,別無他法!
抓住光纖的藍色滑套,往後抽,就可以把光纖從光貓上拔出來,然後對準接口插進貓棒,再把貓棒插進光電轉換器,然後接上網線和電源,就可以了。
稍等幾分鐘等貓棒開機,開機之後,轉換器在貓棒方向的燈會亮起來。這時候先把網線跟電腦連起來,給電腦分配一個192.168.1.0/24範圍的地址(當然別用192.168.1.1,那是貓棒後台的地址),然後用瀏覽器打開192.168.1.1,就能看見貓棒後台的登陸頁面了。賬號和密碼找商家要,我這款是admin/admin,但不保證所有ODI貓棒都是這一對賬號密碼。登陸進去後,進入Settings頁面,填入LOID,點Apply Changes,然後進入Commit/Reboot頁面,點Commit and Reboot按鈕保存配置並重啓,貓棒端就配置完成了。
不過電信、聯通、移動的光貓註冊方式各有不同,上面説的操作都是針對電信的。其他運營商可以參考貓棒商家發的文檔,或參考網上其他人的成功案例。這裏引用貓棒説明中的一部分內容:
★註冊-初級:(部分型號光貓沒有 GPON SN,可不修改)
電信&聯通 GPON/XGPON/XGSPON:Loid
移動 GPON/XGPON/XGSPON:Ploam 密碼
電信&聯通&移動 EPON/10G EPON:Loid★註冊-中級:
電信&聯&移動 GPON/XGPON/XGSPON:GPON SN
電信&聯通&移動 EPON/10G EPON:MAC/PON MAC+MAC KEY★註冊-高級:(GPON/XGPON/XGSPON)
廠商 ID/Vendor ID:如 HWTC/華為、FHTT/烽火、ZTEG/中興、SCTY/天邑、YHTC/友華
設備型號
OUI:6 位
設備標號:一般為 17 位
軟件版本號
ONT 版本/硬件版本號★註冊-高級:(EPON/10G EPON)
設備型號
ONT 版本/硬件版本號
本來重啓之後,應該先看一下ONU狀態是不是O5來着,但是當時我忘了看,直接電腦上撥號成功,間接也證明了LOID註冊成功。不過還是放個文檔裏扒出來的圖好了。
安裝RouterOS
一開始我以為裝這玩意跟裝別的系統沒啥區別,就ISO一掛,順着嚮導裝就行。可看了文檔發現,RouterOS有一個專門面向虛擬平台的版本,叫Cloud Hosted Router (CHR),在官網的下載頁面下載OVA Template,然後導入ESXi就行。具體的安裝方法可以看Mikrotik的Wiki。
RouterOS CHR作為一個付費的系統,當然也需要買授權才能用。買授權的方法也可以跟着Mikrotik的Wiki-GettingtheLicense)操作,就是注意別買成RouterOS的Key,這兩者是不通用的。
配置ESXi的網絡
如果我沒記錯的話,ESXi一開始只給Ethernet 1口做了配置,我們得手動給Ethernet 2配置虛擬網絡。
首先到網絡的虛擬交換機頁面,創建一個新的虛擬交換機,名字按自己喜好起就行,比如我就順着已有的vSwitch0給它命名vSwitch1。然後點進vSwitch1,點添加上行鏈路,把vmnic1分配給它,這樣在ESXi裏面就可以用這個接口了。
然後到端口組頁面,添加一個新的端口組VM Network 2,虛擬交換機選擇剛創建的vSwitch1。
接下來點進虛擬機RouterOS,關機之後編輯設置,給它添加一個網絡適配器,然後給網絡適配器1分配VM Network 2,給網絡適配器2分配VM Network 1,保存,開機。
配置RouterOS
如果貓棒的ONU狀態是O5,那就可以把轉換器連到Gen 8的Ethernet 2口上了。你問為啥不是Ethernet 1?因為Ethernet 1我改成了與iLO共享,所以只能拿Ethernet 2當WAN口。下面進入RouterOS,開始配置軟路由。
首次登錄
第一次登錄的時候,因為我並不知道路由器的地址,所以沒辦法用IP地址打開RouterOS的配置頁面,但MikroTik很貼心的提供了用MAC地址連接的功能。在WinBox的Neighbors頁面雙擊RouterOS的條目,用admin用户和空密碼登錄就可以。
為了後面分的清楚,我先到Interfaces頁面,把LAN口和WAN口對應接口的名字改了過來,畢竟默認的ether1和ether2不如LAN和WAN看的清楚。通常來説觀察接口的Tx和Rx就能分清哪個是LAN口,因為這時候沒配置撥號,WAN口的流量通常只會是0。如果分不清,那就先把Gen 8的Ethernet 1拔了。
規劃地址範圍,配置DHCP、DNS
在配置DHCP服務器前,要先規劃好自己的局域網的網段。地址範圍可以從IPv4的三個私有地址範圍10.0.0.0/8、172.16.0.0/12和192.168.0.0/16之間選,一定不要作死用公網網段(比如一些無能IT給路由器配了個1.1.1.1),不然我很難説你的網絡會出什麼奇怪的問題。我乾脆就遵循之前的網絡,用了192.168.1.0/24段作為我的內網網段。
確定好地址範圍之後,就可以用這條命令給LAN口指定一個靜態IP地址:
/ip/address/add \
interface=LAN \
address=192.168.1.3/24 \
network=192.168.1.0
選擇給RouterOS分配192.168.1.3的原因是,192.168.1.1留給貓棒(雖然後來發現連不上),192.168.1.2留給AC86U路由器,它本來就是這個地址,我懶得再動它。
然後先給DHCP服務器添加一個地址池:
/ip/pool/add \
name=192.168.1.0/24 \
ranges=192.168.1.2-192.168.1.254
接下來配置DHCP服務器:
# 添加DHCP服務器
/ip/dhcp-server/add \
name=LAN \
address-pool=192.168.1.0/24 \
interface=LAN \
lease-time=1d
# 配置DHCP服務器下發的網絡參數
/ip/dhcp-server/network/add \
address=192.168.1.0/24 \
dns-server=192.168.1.3 \
gateway=192.168.1.3
此外我還想要給ESXi之類的機器配置一個固定的地址,於是:
/ip/dhcp-server/lease/add \
address=192.168.1.4 \
mac-address=D0:BF:9C:46:94:D8 \
server=LAN \
comment=ESXi
上面DHCP網絡參數中的dns-server=192.168.1.3配置的是讓RouterOS作為DNS服務器,但現在RouterOS還不能響應遠程的DNS請求,所以要用下面這條命令更改DNS的配置:
/ip/dns/set allow-remote-requests=yes
創建本地管理員,禁用admin
安全起見,我建議給RouterOS創建一個新的管理員賬户,並禁用默認的admin賬户。
# 創建新的管理員用户,僅允許在192.168.1.0/24網絡內登錄
/user/add \
name=新用户的用户名 \
password=新用户的密碼 \
group=full \
address=192.168.1.0/24
# 禁用admin
/user/set [ find name="admin" ] disabled=yes
配置PPPoE撥號和NAT規則
首先創建一個PPPoE客户端來撥號:
/interface/pppoe-client/add \
name="PPPoE客户端名字" \
interface=WAN \
user="寬帶賬號" \
password="寬帶密碼" \
profile=default \
use-peer-dns=yes \
add-default-route=yes
添加成功後,RouterOS會自動開始撥號,在終端也可以用monitor命令實時監控PPPoE撥號端口的狀態:
/interface/pppoe-client/monitor [ find running ]
status: connected
uptime: 13h59m53s
active-links: 1
encoding:
service-name:
ac-name: SH-SH-ML-MSE-2.MAN.NE40E
ac-mac: D0:D0:4B:06:EC:CC
mtu: 1492
mru: 1492
local-address: 124.78.123.123
remote-address: 124.78.123.1
local-ipv6-address: fe80::5
remote-ipv6-address: fe80::d2d0:4bff:fe06:eccc
-- [Q quit|D dump|C-z pause]
這時候RouterOS自己已經可以上網了,但是路由器下面的設備還不行,因為沒有配置NAT。在終端執行這條命令,來創建一條NAT規則:
/ip/firewall/nat/add \
chain=srcnat \
action=masquerade \
out-interface="PPPoE接口的名字" \
comment=NAT
現在路由下的設備就可以上網了。
配置IPv6
電信寬帶已經支持了IPv6,那既然有了,我不能不用。電信會給寬帶分配一個前綴,下級設備通過前綴來分配自己的地址,就是prefix delegation。所以我只需要在RouterOS中配置一個IPv6的DHCP client就行。
/ipv6/dhcp-client/add \
interface="PPPoE客户端名字" \
add-default-route=yes \
pool-name=ipv6_pool \
pool-prefix-length=60 \
prefix-hint=::/56 \
request=prefix \
use-interface-duid=yes
然後檢查DHCP client的狀態,是bound的話就説明已經成功獲取到地址和前綴。
/ipv6/dhcp-client/print
Columns: INTERFACE, STATUS, REQUEST, PREFIX
# INTERFACE STATUS REQUEST PREFIX
0 China Telecom bound prefix 240e:38a:5d27:5c00::/56, 2d21h48m59s
然後讓電腦重新連接路由,就能看到電腦成功獲取到IPv6地址了。
配置防火牆
畢竟路由器這種玩意不能在網上裸奔,該禁的端口就得禁。
首先創建兩個interface list,把公網接口和內網接口歸類到各自的列表中,方便後面創建防火牆規則。
/interface list
# 給內網接口的list
add name=local
# 給公網接口的list
add name=internet
/interface list member
# LAN口歸進local這個list
add interface=LAN list=local
# WAN口和PPPoE口歸進internet這個list
add interface=WAN list=internet
add interface="China Telecom" list=internet
然後添加IPv4的防火牆規則:
/ip firewall filter
# 放行狀態為established、related、untracked的數據包
add action=accept chain=input comment="accept established,related,untracked" connection-state=established,related,untracked
# 允許外網ping,不想允許的話就不執行這條
add action=accept chain=input comment="accept ping" protocol=icmp
# 丟棄invalid狀態的包
add action=drop chain=input comment="drop invalid" connection-state=invalid
# 兜底規則,丟棄一切來自公網的包
add action=drop chain=input comment="drop all from WAN" in-interface-list=internet
# RouterOS的快速跟蹤功能,可以跟蹤已建立的連接並讓這些流量走快速通道,以降低設備的CPU負載
# 好像必須要專門的硬件才能發揮作用,但總之先加在這裏
add action=fasttrack-connection chain=forward comment="defconf: fasttrack" connection-state=established,related hw-offload=yes
add action=accept chain=forward comment="accept established,related, untracked" connection-state=established,related,untracked
# 在forward鏈上也丟棄掉invalid狀態的包
add action=drop chain=forward comment="drop invalid" connection-state=invalid
# 丟棄所有來自公網,且無端口轉發規則匹配的包
add action=drop chain=forward comment="drop all from WAN not DSTNATed" connection-nat-state=!dstnat connection-state=new in-interface-list=internet
對於IPv6,要先創建兩份address list,分別包含可以放行的地址和有問題的地址:
/ipv6 firewall address-list
add address=fe80::/16 list=allowed
add address=ff02::/16 comment=multicast list=allowed
add address=::/128 comment="defconf: unspecified address" list=bad_ipv6
add address=::1/128 comment="defconf: lo" list=bad_ipv6
add address=fec0::/10 comment="defconf: site-local" list=bad_ipv6
add address=::ffff:0.0.0.0/96 comment="defconf: ipv4-mapped" list=bad_ipv6
add address=::/96 comment="defconf: ipv4 compat" list=bad_ipv6
add address=100::/64 comment="defconf: discard only " list=bad_ipv6
add address=2001:db8::/32 comment="defconf: documentation" list=bad_ipv6
add address=2001:10::/28 comment="defconf: ORCHID" list=bad_ipv6
add address=3ffe::/16 comment="defconf: 6bone" list=bad_ipv6
add address=::224.0.0.0/100 comment="defconf: other" list=bad_ipv6
add address=::127.0.0.0/104 comment="defconf: other" list=bad_ipv6
add address=::/104 comment="defconf: other" list=bad_ipv6
add address=::255.0.0.0/104 comment="defconf: other" list=bad_ipv6
然後配置防火牆規則(其中一些規則我也不明白是啥作用,但是既然包含在默認配置裏,那配進去應該不會造成什麼問題):
/ipv6 firewall filter
# 放行狀態為established、related、untracked的數據包
add action=accept chain=input comment="defconf: accept established,related,untracked" connection-state=established,related,untracked
# 丟棄invalid狀態的包
add action=drop chain=input comment="defconf: drop invalid" connection-state=invalid
# 允許IPv6 ping
add action=accept chain=input comment="defconf: accept ICMPv6" protocol=icmpv6
# 允許IPv6 traceroute
add action=accept chain=input comment="defconf: accept UDP traceroute" port=33434-33534 protocol=udp
# 允許DHCPv6 prefix delegation的包
add action=accept chain=input comment="defconf: accept DHCPv6-Client prefix delegation." dst-port=546 protocol=udp src-address=fe80::/16
# 允許IKE數據包
add action=accept chain=input comment="defconf: accept IKE" dst-port=500,4500 protocol=udp
add action=accept chain=input comment="defconf: accept ipsec AH" protocol=ipsec-ah
add action=accept chain=input comment="defconf: accept ipsec ESP" protocol=ipsec-esp
add action=accept chain=input comment="defconf: accept all that matches ipsec policy" ipsec-policy=in,ipsec
# 兜底規則,丟棄一切不是從local接口列表發出的包
add action=drop chain=input comment="defconf: drop everything else not coming from LAN" in-interface-list=!local
# forward鏈上放行狀態為established、related、untracked的數據包
add action=accept chain=forward comment="defconf: accept established,related,untracked" connection-state=established,related,untracked
# forward鏈上丟棄invalid狀態的包
add action=drop chain=forward comment="defconf: drop invalid" connection-state=invalid
# 禁止來自bad_ipv6這個地址列表裏面的地址
add action=drop chain=forward comment="defconf: drop packets with bad src ipv6" src-address-list=bad_ipv6
add action=drop chain=forward comment="defconf: drop packets with bad dst ipv6" dst-address-list=bad_ipv6
add action=drop chain=forward comment="defconf: rfc4890 drop hop-limit=1" hop-limit=equal:1 protocol=icmpv6
add action=accept chain=forward comment="defconf: accept ICMPv6" protocol=icmpv6
add action=accept chain=forward comment="defconf: accept HIP" protocol=139
add action=accept chain=forward comment="defconf: accept IKE" dst-port=500,4500 protocol=udp
add action=accept chain=forward comment="defconf: accept ipsec AH" protocol=ipsec-ah
add action=accept chain=forward comment="defconf: accept ipsec ESP" protocol=ipsec-esp
add action=accept chain=forward comment="defconf: accept all that matches ipsec policy" ipsec-policy=in,ipsec
add action=drop chain=forward comment="defconf: drop everything else not coming from LAN" in-interface-list=!local
RouterOS裏一些其它的配置
最後就是一些雜七雜八的配置,比如開啓NTP客户端來自動同步時間:
/system ntp client
set enabled=yes
/system ntp client servers
add address=time.windows.com
add address=time.nist.gov
add address=time.apple.com
禁用掉不需要的服務以減小攻擊面:
/ip service
# 禁用telnet
set telnet disabled=yes
# 禁用ftp
set ftp disabled=yes
# 限制www、ssh、winbox服務都只能從內網訪問
set www address=192.168.1.0/24
set ssh address=192.168.1.0/24
set www-ssl address=192.168.1.0/24 disabled=no
set winbox address=192.168.1.0/24
# API用不到,所以禁用
set api disabled=yes
set api-ssl disabled=yes
開啓UPnP,雖然説開這玩意會有安全隱患,但是開了這麼多年也沒因為它出過事,這玩意也沒法從外網開端口轉發,也就是説首先內網得有機器中毒,我自認為我的使用習慣還算是安全的,所以,開。
# 啓用UPnP
/ip upnp
set enabled=yes
/ip upnp interfaces
# 配置LAN口作為內網端
add interface=LAN type=internal
# 配置PPPoE端口作為公網端
add interface="PPPoE接口的名字" type=external
開啓雲服務,包括DDNS和自動備份:
/ip cloud
set ddns-enabled=yes ddns-update-interval=1h update-time=yes