• Shopee đêm nay có mã cho ngày 5/5

thảo luận Cộng đồng người dùng MikroTik Router

Thanks thím đã hướng dẫn và giải thích rất rất kỹ!
View attachment 2375788

Script đầy đủ cho mọi người tham khảo
Code:
/ip firewall filter
add action=accept chain=input connection-state=established,related,untracked comment="Accept established related untracked"
add action=drop chain=input connection-state=invalid comment="Drop invalid"
add action=drop chain=input icmp-options=8:0-255 protocol=icmp in-interface=!bridge1 comment="Block ping"
add action=accept chain=input protocol=icmp comment="Accept ICMP"
add action=accept chain=input in-interface-list=LAN comment="Allow LAN access to router and Internet"
add action=drop chain=input comment="Drop all other input"
add action=fasttrack-connection chain=forward connection-state=established,related hw-offload=yes comment="Fasttrack"
add action=accept chain=forward connection-state=established,related,untracked comment="Accept established related untracked"
add action=drop chain=forward connection-state=invalid comment="Drop invalid"
add action=accept chain=forward connection-state=new in-interface-list=LAN comment="Allow LAN access to router and Internet"
add action=accept chain=forward connection-nat-state=dstnat comment="Accept Port forwards"
add action=drop chain=forward comment="Drop all other forward"

Nhân tiện mình muốn hỏi fq_codel có áp dụng dung với fasttrack được k? Tính năng này dùng để chừa băng thông để các gói tin nhỏ (như ping server game) đi qua router mà k bị nghẽn (ping cao) có phải k?

Simple Queues thì không tương thích với fasttrack bác ạ. Cả Queue Tree với parent=global.


1710069705039.png


Như vậy nếu muốn giữ fasttrack thì bác còn lại Interface Queue với Quee Tree có parent là interface cụ thể. Với Interface Queue thì bác tìm hiểu thread này


Gồm cả các post bên dưới của chú chủ topic mducharme. Còn đây là hướng dẫn sử dụng Queue Tree, set parent là cái interface WAN


Hiện em không dùng queue gì, chỉ để cái mặc định only-hardware-queue trên đống interface, latency thêm lúc test download với hết đường truyền chỉ single digit

1710070504099.png


Còn hôm nào đường bandwidth đến Cloudflare không đủ 1Gbps, 700-800Mbps chẳng hạn, thì cái test này download speed cũng chỉ được thế (vì nó dùng Cloudflare), lúc đấy thì additional latency toàn +0 ms.
 
các bác có cấu hình hairpin nat cho ipv6 không nhỉ, mình dùng reverse proxy bị lỗi trong Lan nghi là do ipv6

Bình thường IPv6 không cần NAT nên cũng không cần hairpin NAT. Các thiết bị trong LAN của bác sẽ có địa chỉ global hết (global unicast address) với prefix từ nhà mạng, phần interface-id chọn bằng SLAAC. Bình thường router của bác sẽ bật forwarding.

1710071396084.png

Cái setting IPv6 Forward này bật mặc định.

Khi bác cấu hình địa chỉ IPv6 trên các interface LAN hay VLAN (thí dụ bridge) thì RouterOS cũng tự cấu hình route cho dải prefix tương ứng với interface đó. Nếu không tắt setting "Advertise" của địa chỉ và thiết lập neighbor discovery đầy đủ nữa thì các thiết bị trong interface sẽ được gán IP trong dải prefix. Khi này với cái địa chỉ IPv6 global của từng thiết bị có thể truy cập đến các thiết bị của bác bất kể từ ngoài WAN hay từ trong LAN, cả từ VLAN này sang VLAN khác NẾU tường lửa IPv6 của bác không ngăn việc này trên chain forward. Nếu bác sử dụng cấu hình tường lửa IPv6 mặc định mà em có post ở mấy trang trước thì cái rule này

Code:
/ipv6 firewall filter
add chain=forward action=drop in-interface-list=!LAN comment="defconf: drop everything else not coming from LAN"

mặc định sẽ block forwarding từ ngoài WAN vào các thiết bị đằng sau router, ngay cả khi đã biết đúng địa chỉ IPv6 của chúng. Nhưng không ngăn giữa các thiết bị trong các interface của list LAN. Nếu bác muốn ở bên ngoài WAN cũng truy cập được thiết bị trong mạng qua IPv6 thì bác dùng địa chỉ của thiết bị, nhưng trong cấu hình tường lửa thì cần thêm rule accept forward với dst-address là địa chỉ IPv6 của thiết bị, với số cổng và protocol nữa nếu cần lọc thêm. Chứ không dùng địa chỉ IPv6 của router và dst-nat gì cả.

Nếu prefix nhà mạng cấp cho bác không cố định mà thay đổi mỗi khi quay lại PPPoE thì cách cấu hình này hơi bất tiện. Giải pháp mà em dùng là đưa địa chỉ của thiết bị vào address list, sau đó rule accept thì dùng dst-address-list. Sau đó ở phần script của DHCPv6 client, chạy script tự động update phần prefix của các địa chỉ trong các address list mỗi khi được nhà mạng cấp cho prefix mới. Ngoài ra địa chỉ IPv6 dài nên thường bác sẽ gán cho nó subdomain rồi chạy script tự update DDNS mỗi khi prefix thay đổi cùng cái script kia luôn.
 
Simple Queues thì không tương thích với fasttrack bác ạ. Cả Queue Tree với parent=global.


View attachment 2375881

Như vậy nếu muốn giữ fasttrack thì bác còn lại Interface Queue với Quee Tree có parent là interface cụ thể. Với Interface Queue thì bác tìm hiểu thread này


Gồm cả các post bên dưới của chú chủ topic mducharme. Còn đây là hướng dẫn sử dụng Queue Tree, set parent là cái interface WAN


Hiện em không dùng queue gì, chỉ để cái mặc định only-hardware-queue trên đống interface, latency thêm lúc test download với hết đường truyền chỉ single digit

View attachment 2375895

Còn hôm nào đường bandwidth đến Cloudflare không đủ 1Gbps, 700-800Mbps chẳng hạn, thì cái test này download speed cũng chỉ được thế (vì nó dùng Cloudflare), lúc đấy thì additional latency toàn +0 ms.
Thanks thím đã tận tình giải thích, hiện tại mạng ở nhà sử dụng gia đình nên cũng chưa giới hạn gì. Sẵn tiện nên hỏi để ghi chú lại sau này mình cần xài đến :smile:
 
Thanks thím đã hướng dẫn và giải thích rất rất kỹ!
View attachment 2375788

Script đầy đủ cho mọi người tham khảo
Code:
/ip firewall filter
add action=accept chain=input connection-state=established,related,untracked comment="Accept established related untracked"
add action=drop chain=input connection-state=invalid comment="Drop invalid"
add action=drop chain=input icmp-options=8:0-255 protocol=icmp in-interface=!bridge1 comment="Block ping"
add action=accept chain=input protocol=icmp comment="Accept ICMP"
add action=accept chain=input in-interface-list=LAN comment="Allow LAN access to router and Internet"
add action=drop chain=input comment="Drop all other input"
add action=fasttrack-connection chain=forward connection-state=established,related hw-offload=yes comment="Fasttrack"
add action=accept chain=forward connection-state=established,related,untracked comment="Accept established related untracked"
add action=drop chain=forward connection-state=invalid comment="Drop invalid"
add action=accept chain=forward connection-state=new in-interface-list=LAN comment="Allow LAN access to router and Internet"
add action=accept chain=forward connection-nat-state=dstnat comment="Accept Port forwards"
add action=drop chain=forward comment="Drop all other forward"
làm theo cái script này xong kg có internet luôn, phải vào winbox = MAC rồi xoá hết filter mới vào lại internet đc. Hic

via theNEXTvoz for iPad
 
làm theo cái script này xong kg có internet luôn, phải vào winbox = MAC rồi xoá hết filter mới vào lại internet đc. Hic

via theNEXTvoz for iPad
Để có thời gian mình edit lại script và hướng dẫn đầy đủ sau. Dạo này hơi bận nơi sơ sót tý.
Đấy là vì bác chưa tạo các interface list LAN, WAN và chưa cho các interface vào list tương ứng. Thí dụ cái bridge của bác vào list LAN.
Thím cho mình hỏi cái untracked trong connection-state thì firewall để làm gì? Mình thấy fasttrack ipv4 không có bật và 2 cái rule accept cho chain inputforward cũng chỉ có connection-state=established,related. Nhưng bên ipv6 thì lại có cả 3 connection-state=established,related
 
ae cho hỏi flash firmware x86 về bản cũ có dùng netinstall được không ta hay phải dùng cách khác ? Bản 7.13 nó bị detect wan quá (disconnect liên tục) :(
 
Dùng downgrade xuống , hoặc netinstall càng sạch :)
Mấy hôm nữa tôi cũng xuống cài hết lại. Giờ đang bận chưa làm đc :sad:
 
Để có thời gian mình edit lại script và hướng dẫn đầy đủ sau. Dạo này hơi bận nơi sơ sót tý.

Thím cho mình hỏi cái untracked trong connection-state thì firewall để làm gì? Mình thấy fasttrack ipv4 không có bật và 2 cái rule accept cho chain inputforward cũng chỉ có connection-state=established,related. Nhưng bên ipv6 thì lại có cả 3 connection-state=established,related

Chắc bác nhìn nhầm đấy ạ. Hai rules accept bên IPv4 ở chain input với forward kia nó vẫn có ",untracked" đấy, chỉ có cái rule fasttrack là không có thôi. Để nói cái untracked này nó là gì thì em nói sơ qua về connection tracking ạ:

Một packet IP (áp dụng cả với IPv4 và IPv6) thông thường sẽ có trong header của nó thông tin về địa chỉ nguồn, địa chỉ đích của packet, loại protocol, và tùy protocol sẽ có hoặc không có thêm các thông tin khác như options, codes, cổng nguồn cổng đích (với các protocol UDP và TCP quen thuộc). Trong rất nhiều trường hợp, chỉ cần những thông tin này của một packet, kết hợp với bảng routes của router (bảng chứa các dải địa chỉ đích, interface và gateway (không bắt buộc) tương ứng, cùng với số distance (1 dạng giúp sắp xếp thứ tự ưu tiên)) là đủ để router có thể chuyển tiếp những packet đơn lẻ này đến đích cần đến (qua gateway ở 1 interface, hay vào thẳng layer 2 của 1 interface). Thậm chí thông tin lưu trong packet đơn lẻ này trong rất nhiều trường hợp cũng đủ để viết các rules firewall để lọc các packet này, có cho qua hay không dựa vào các thông tin có trong packet đơn lẻ này.

Điều gì xảy ra nếu bác cần dùng NAT. NAT bao gồm cả address translation, lẫn port translation, và tất nhiên là cả tính năng port forwarding. Với NAT thì 1 packet khi chạy qua tường lửa có thể có địa chỉ nguồn và/hoặc địa chỉ đích, cũng như cổng nguồn và/hoặc cổng đích của nó bị sửa đổi bởi các rules. Thí dụ từ trong LAN PC 192.168.0.5 bác gửi 1 packet UDP ra ngoài internet, vào cổng 53 của địa chỉ đích 8.8.8.8, cổng nguồn từ PC là 49300. Với NAT (thường là rule masquerade) router của bác sẽ tìm được gateway ứng với địa chỉ đích 8.8.8.8, thường là gateway ra WAN với route tới 0.0.0.0/0. Interface này là interface WAN với rule masquerade, router của bác sẽ áp dụng srcnat, sửa địa chỉ nguồn của packet từ 192.168.0.5 thành địa chỉ public của router trên cái interface, có thể phải sửa cả cổng source 49300 nếu đã có kết nối khác dùng cổng này của router. Packet UDP với đích 8.8.8.8:53 và nguồn là địa chỉ IP và cổng mới này sẽ được gửi qua gateway vào internet. Giờ google dns trả lời và gửi packet trở lại, source address và port bây giờ là 8.8.8.8:53 destination address là địa chỉ WAN của router và cái cổng đích là 49300 hoặc có thể là cổng đã bị thay thế ở trên. Với thông tin từ cái packet duy nhất này, và mỗi cái bảng routes, làm thế nào mà router biết cách chuyển tiếp gói trả lời này tới cái PC gốc?

Tương tự với port forwarding. Giả sử bác cấu hình forward cổng 8080 TCP của router tới cổng 80 của máy 192.168.0.10 trong LAN. Khi từ ngoài gửi packet vào cổng 8080 của router, router sẽ sửa địa chỉ đích của packet thành 192.168.0.10 và cổng đích thành 80. Sau đó khi thiết bị 192.168.0.10 gửi packet trả lời. Vì chỉ có thông tin từ mỗi packet này, router sẽ không biết đây là packet trả lời cho 1 packet trước. Router phải làm thế nào đó để biết rằng bây giờ phải sửa cổng nguồn của packet thành 8080 (và địa chỉ nguồn của packet thành địa chỉ WAN của router)?

Hay giả sử bác không dùng NAT, tức là địa chỉ IP trong LAN của bác là địa chỉ từ bên ngoài internet trỏ vào được (là trường hợp với IPv6), thế nhưng bác lại có 2 đường WAN 1 & 2 kết nối ra internet. Trong bảng routes của bác có 2 entry tới ::0/0 (hoặc 0.0.0.0/0) với 2 gateway của 2 đường WAN tương ứng, nhưng WAN1 có distance nhỏ hơn. Giờ bác nhận được 1 packet từ địa chỉ ngoài internet, đến qua đường WAN2 với địa chỉ đích là thiết bị trong LAN. Router của bác chỉ dùng thông tin trong packet này dễ dàng chuyển tiếp nó đến được thiết bị. Thiết bị sau đó gửi packet trả lời, với địa chỉ đích là địa chỉ từ ngoài internet kia. Với thông tin duy nhất từ packet, router chỉ biết cách chọn dòng route đầu tiên ứng với cái gateway của WAN1 vì distance nhỏ hơn, và nhờ gateway đó chuyển tiếp, trong khi lẽ ra nó phải dùng gateway của WAN2. Có cách nào để nó biết dùng gateway của WAN2?

Hoặc nếu các rules tường lửa của bác cần các điều kiện dựa trên các trạng thái của 1 kết nối TCP như số bytes đã truyền, hay tốc độ hiện thời. Nếu chỉ có thông tin từ packet đơn lẻ thì không làm được điều này.

Hay có những giao thức đặc biệt như FTP, cần 2 kết nối, một cho command, một để truyền dữ liệu. FTP ở chế độ passive thì client nối vào cổng 21 của server để gửi lệnh, khi cần truyền file thì server sẽ gửi thông tin về cổng và địa chỉ IP để client tạo kết nối thứ 2 dùng để truyền dữ liệu. Giờ giả sử bác muốn cấu hình firewall để chỉ cho phép tạo kết nối để truyền file qua FTP. Bác sẽ có rule nghiêm ngặt block packet đi ra ngoài chỉ cho đến cổng 21 của server đích. Nhưng giờ làm thế nào để có rule ngoại lệ cho các packet gửi đến cái đường truyền data kia, khi cổng và địa chỉ đích không biết trước được?

Câu trả lời cho tất cả những cái này là tính năng connection tracking Connection tracking - RouterOS - MikroTik Documentation (https://help.mikrotik.com/docs/display/ROS/Connection+tracking) trong cấu hình tường lửa. Có thể bật tắt ở đây:

1710188791306.png


Nếu Enabled=No thì firewall chỉ sử dụng thông tin từ các packet đơn lẻ. Để auto tương đương với disabled khi không có rule nào trong các bảng của cấu hình tường lửa, khi có 1 rule bất kỳ thì auto sẽ tương đương với Enabled=Yes, bật connection tracking. Phải bật connection tracking thì NAT và những properties sau mới sử dụng được trong các rules của tường lửa:

1710189107884.png


Khi bật connection tracking thì RouterOS sẽ cấp phát bộ nhớ để lưu các entries chứa thông tin về các kết nối (connections). Các entries này chính là nội dụng bác nhìn thấy ở bảng Connections trong cửa sổ tường lửa IPv4 và IPv6. Số lượng entries tối đa phụ thuộc vào kích thước RAM của router, ghi ở dòng status Max Entries bên dưới cửa sổ.

Với mỗi một packet được firewall xử lý, trước tiên firewall sẽ tìm xem có thể gán packet đó với 1 cái connection entry sẵn có nào không. Nếu không được thì 1 entry mới sẽ được tạo ra, ứng với connection mới. connection-state của packet sẽ là "new". Khi nhận được packet trả lời cho packet này , nếu có, packet đó cũng sẽ được gán với cái connection entry này, và sẽ có connection-state là established. Tương tự với packet trả lời cho packet trả lời này. Tóm lại các packet sau gửi đi gửi lại giữa 2 đầu kết nối sẽ được gán với cái connection entry này và có connection-state=established.

Trong trường hợp sử dụng NAT thì sau khi packet đầu (connection-state=new) đi qua các rules NAT (scrnat (gồm cả masquerade), dstnat) khi các địa chỉ và cổng nguồn đích bị các rules chỉnh sửa, thì thông tin các địa chỉ và cổng đã bị chỉnh sửa từ cái gì sang cái gì sẽ được nhớ lại trong cái connection entry này, và thuộc tính connection-nat-state sẽ có giá trị dstnat hoặc srcnat tương ứng. Với những thông tin được lưu lại này, firewall sẽ biết cách khôi phục lại giá trị cổng và địa chỉ ban đầu khi tiếp nhận và chuyển tiếp các packets trả lời. Như vậy giải quyết được vấn đề ở trên với NAT và port forwarding.

Trong kết nối cũng có field để lưu thông tin connection-mark, mà bác có thể dùng các rules mangle để đặt và sửa. Với cách này với trường hợp multi-WAN bác có thể viết rules để "nhớ" packet đầu của connection đến từ đường WAN nào, và đánh dấu lên connection (connection-mark) để sau này tường lửa route các packets trả lời của cùng kết nối đi ra đúng bằng đường WAN đó. Đây là cấu hình thường gặp khi load balancing nhiều đường WAN.

Và với thông tin lưu lại, tường lửa cũng có thể đếm số packets và bytes đã gửi nhận của các packets gắn với kết nối này, cũng như tốc độ hiện thời (rate) đường gửi và nhận. Ngoài ra trạng thái hiện thời của 1 kết nối TCP (established, time-wait, close, syn-sent, syn-received) cũng có thể được biết (thuộc tính tcp-state) vì các packet kiểu SYN, SYN ACK, FIN, FIN ACK v.v... của kết nối được đọc và ghi nhận.

Vấn đề của giao thức như giao thức FTP ở trên cũng được giải quyết. Các packet của kết nối data được tạo thêm kia cũng sẽ được ghép với cái connection entry của kết nối command tới cổng 21 của server kia, khác biệt là connection-state của chúng sẽ là "related". Với rule accept connection-state="related" ở trên đỉnh như với cấu hình firewall của bác thì khi kết nối đường truyền lệnh cổng 21 kia đã được tường lửa cho phép đi qua thì các packet của kết nối data cũng mặc định được cho qua.

Và vì trong cùng 1 kết nối, ngoại trừ packet đầu tiên có connection-state=new, hầu hết các packet còn lại sẽ có state=established hoặc related, nêu nếu trong tường lửa của bác có rules accept với connection-state=established,related và đặt ở tít trên đầu, thì hầu hết các packets sẽ được xử lý ngay bằng 1 rule này ngay lập tức, và sau khi đã được accept thì các rules phức tạp và nhiều hơn bên dưới sẽ được bỏ qua không cần phải xử lý. Nói cách khác là đa số các rules tường lửa phức tạp của bác bên dưới sẽ chỉ cần phải mang ra áp dụng với packet đầu tiên, packet có connection-state=new, mà thôi. Nếu packet đầu được accept thì các packet sau đó không cần phải chạy qua hầu hết các rules đó nữa, giảm tải CPU đi rất nhiều.

Bây giờ đến phần giải thích về connection-state=untracked. Như bác có thể thấy, việc gán các packet vào connection tương ứng sẵn có khá tốn tài nguyên, cả bộ nhớ lẫn CPU. Nhiều lúc có những packets mà bác có thể drop hoặc accept ngay được, chỉ với thông tin có sẵn trong header của packet, mà không cần đến các thông tin khác mà cái connection tracking nó cung cấp thêm. Nói cách khác là không cần sử dụng connection tracking với các packet đó. Để làm việc này bác có thể tạo các rules "raw" trong cấu hình tường lửa.


Các rules này tương tự như các rules ở bảng filter, nhưng hoạt động trên chain prerouting và output, và chỉ sử dụng được ít thông tin có sẵn trong packet và thông tin về các interfaces. Nếu bác drop packet ngay ở chỗ rule raw thì packet không phải đi qua connection tracking hay qua các bảng còn lại nữa, nên sẽ sử dụng ít tài nguyên hơn nhiều so với việc bác drop chúng ở bảng filter sau khi đã chạy qua connection tracking. Vì thế nếu muốn block DoS với DDoS thì bác nên dùng rule raw để drop ở đây.

Ngoài các action như accept và drop, bác có thể đặt action=notrack. Khi đó packet sẽ không đưa cho chạy qua connection tracking, và sẽ có connection-state mặc định là untracked. Và vì bác đã không drop chúng, nên có nghĩa là bác có muốn cho packet được đi qua tường lửa. Chính vì thế ở cấu hình tường lửa mặc định, cái rule accept ở phía trên nó có thêm ",untracked" ở phần connection-state. Như thế các packets đã được rules raw cho qua này sẽ được accept ngay lập tức và không bị xử lý bởi các rules còn lại bên dưới. Bản thân các rules bên dưới nhiều khi cũng không có khả năng xử lý các packets này vì thiếu toàn bộ phần thông tin liên quan đến connection.

Tất nhiên khi không có connection tracking thì cũng không biết gì đến connection-state established hay related. Tức là khác với việc ở bảng filter phần lớn các rules chỉ phải đem ra xử lý với các packet đầu tiên của kết nối, thì các rules ở bảng raw sẽ phải mang ra áp dụng với tất cả các packets, cả ban đầu lẫn tiếp theo. Như vậy nếu bảng raw có quá nhiều rules cũng sẽ không tốt và có khả năng sẽ làm chậm hơn so với việc cho packet qua connection tracking và xử lý bởi các bảng khác như thường lệ.
 
Dùng downgrade xuống , hoặc netinstall càng sạch :)
Mấy hôm nữa tôi cũng xuống cài hết lại. Giờ đang bận chưa làm đc :sad:
mình đang ko ở quê, wireguard về modem thì cài netinstall được ko nhỉ b? sợ đang dở chừng bị ngắt kết nối nó ko tiếp tục thì toang
 
mình đang ko ở quê, wireguard về modem thì cài netinstall được ko nhỉ b? sợ đang dở chừng bị ngắt kết nối nó ko tiếp tục thì toang
Netinstall xóa sạch cấu hình trên router bác ạ, giống như format lại toàn bộ ổ flash trước khi copy cái main packet (bản chất là 1 cái squash partition) lên và áp dụng cấu hình mặc định. Bác mà dùng chính router đó để chỗ quê vào Internet với host Wireguard thì đương nhiên sau đó hết đường vào lại được từ xa nếu không có ai ở quê giúp cấu hình lại.
 
Chắc bác nhìn nhầm đấy ạ. Hai rules accept bên IPv4 ở chain input với forward kia nó vẫn có ",untracked" đấy, chỉ có cái rule fasttrack là không có thôi. Để nói cái untracked này nó là gì thì em nói sơ qua về connection tracking ạ:

Một packet IP (áp dụng cả với IPv4 và IPv6) thông thường sẽ có trong header của nó thông tin về địa chỉ nguồn, địa chỉ đích của packet, loại protocol, và tùy protocol sẽ có hoặc không có thêm các thông tin khác như options, codes, cổng nguồn cổng đích (với các protocol UDP và TCP quen thuộc). Trong rất nhiều trường hợp, chỉ cần những thông tin này của một packet, kết hợp với bảng routes của router (bảng chứa các dải địa chỉ đích, interface và gateway (không bắt buộc) tương ứng, cùng với số distance (1 dạng giúp sắp xếp thứ tự ưu tiên)) là đủ để router có thể chuyển tiếp những packet đơn lẻ này đến đích cần đến (qua gateway ở 1 interface, hay vào thẳng layer 2 của 1 interface). Thậm chí thông tin lưu trong packet đơn lẻ này trong rất nhiều trường hợp cũng đủ để viết các rules firewall để lọc các packet này, có cho qua hay không dựa vào các thông tin có trong packet đơn lẻ này.

Điều gì xảy ra nếu bác cần dùng NAT. NAT bao gồm cả address translation, lẫn port translation, và tất nhiên là cả tính năng port forwarding. Với NAT thì 1 packet khi chạy qua tường lửa có thể có địa chỉ nguồn và/hoặc địa chỉ đích, cũng như cổng nguồn và/hoặc cổng đích của nó bị sửa đổi bởi các rules. Thí dụ từ trong LAN PC 192.168.0.5 bác gửi 1 packet UDP ra ngoài internet, vào cổng 53 của địa chỉ đích 8.8.8.8, cổng nguồn từ PC là 49300. Với NAT (thường là rule masquerade) router của bác sẽ tìm được gateway ứng với địa chỉ đích 8.8.8.8, thường là gateway ra WAN với route tới 0.0.0.0/0. Interface này là interface WAN với rule masquerade, router của bác sẽ áp dụng srcnat, sửa địa chỉ nguồn của packet từ 192.168.0.5 thành địa chỉ public của router trên cái interface, có thể phải sửa cả cổng source 49300 nếu đã có kết nối khác dùng cổng này của router. Packet UDP với đích 8.8.8.8:53 và nguồn là địa chỉ IP và cổng mới này sẽ được gửi qua gateway vào internet. Giờ google dns trả lời và gửi packet trở lại, source address và port bây giờ là 8.8.8.8:53 destination address là địa chỉ WAN của router và cái cổng đích là 49300 hoặc có thể là cổng đã bị thay thế ở trên. Với thông tin từ cái packet duy nhất này, và mỗi cái bảng routes, làm thế nào mà router biết cách chuyển tiếp gói trả lời này tới cái PC gốc?

Tương tự với port forwarding. Giả sử bác cấu hình forward cổng 8080 TCP của router tới cổng 80 của máy 192.168.0.10 trong LAN. Khi từ ngoài gửi packet vào cổng 8080 của router, router sẽ sửa địa chỉ đích của packet thành 192.168.0.10 và cổng đích thành 80. Sau đó khi thiết bị 192.168.0.10 gửi packet trả lời. Vì chỉ có thông tin từ mỗi packet này, router sẽ không biết đây là packet trả lời cho 1 packet trước. Router phải làm thế nào đó để biết rằng bây giờ phải sửa cổng nguồn của packet thành 8080 (và địa chỉ nguồn của packet thành địa chỉ WAN của router)?

Hay giả sử bác không dùng NAT, tức là địa chỉ IP trong LAN của bác là địa chỉ từ bên ngoài internet trỏ vào được (là trường hợp với IPv6), thế nhưng bác lại có 2 đường WAN 1 & 2 kết nối ra internet. Trong bảng routes của bác có 2 entry tới ::0/0 (hoặc 0.0.0.0/0) với 2 gateway của 2 đường WAN tương ứng, nhưng WAN1 có distance nhỏ hơn. Giờ bác nhận được 1 packet từ địa chỉ ngoài internet, đến qua đường WAN2 với địa chỉ đích là thiết bị trong LAN. Router của bác chỉ dùng thông tin trong packet này dễ dàng chuyển tiếp nó đến được thiết bị. Thiết bị sau đó gửi packet trả lời, với địa chỉ đích là địa chỉ từ ngoài internet kia. Với thông tin duy nhất từ packet, router chỉ biết cách chọn dòng route đầu tiên ứng với cái gateway của WAN1 vì distance nhỏ hơn, và nhờ gateway đó chuyển tiếp, trong khi lẽ ra nó phải dùng gateway của WAN2. Có cách nào để nó biết dùng gateway của WAN2?

Hoặc nếu các rules tường lửa của bác cần các điều kiện dựa trên các trạng thái của 1 kết nối TCP như số bytes đã truyền, hay tốc độ hiện thời. Nếu chỉ có thông tin từ packet đơn lẻ thì không làm được điều này.

Hay có những giao thức đặc biệt như FTP, cần 2 kết nối, một cho command, một để truyền dữ liệu. FTP ở chế độ passive thì client nối vào cổng 21 của server để gửi lệnh, khi cần truyền file thì server sẽ gửi thông tin về cổng và địa chỉ IP để client tạo kết nối thứ 2 dùng để truyền dữ liệu. Giờ giả sử bác muốn cấu hình firewall để chỉ cho phép tạo kết nối để truyền file qua FTP. Bác sẽ có rule nghiêm ngặt block packet đi ra ngoài chỉ cho đến cổng 21 của server đích. Nhưng giờ làm thế nào để có rule ngoại lệ cho các packet gửi đến cái đường truyền data kia, khi cổng và địa chỉ đích không biết trước được?

Câu trả lời cho tất cả những cái này là tính năng connection tracking Connection tracking - RouterOS - MikroTik Documentation (https://help.mikrotik.com/docs/display/ROS/Connection+tracking) trong cấu hình tường lửa. Có thể bật tắt ở đây:

View attachment 2378311

Nếu Enabled=No thì firewall chỉ sử dụng thông tin từ các packet đơn lẻ. Để auto tương đương với disabled khi không có rule nào trong các bảng của cấu hình tường lửa, khi có 1 rule bất kỳ thì auto sẽ tương đương với Enabled=Yes, bật connection tracking. Phải bật connection tracking thì NAT và những properties sau mới sử dụng được trong các rules của tường lửa:

View attachment 2378313

Khi bật connection tracking thì RouterOS sẽ cấp phát bộ nhớ để lưu các entries chứa thông tin về các kết nối (connections). Các entries này chính là nội dụng bác nhìn thấy ở bảng Connections trong cửa sổ tường lửa IPv4 và IPv6. Số lượng entries tối đa phụ thuộc vào kích thước RAM của router, ghi ở dòng status Max Entries bên dưới cửa sổ.

Với mỗi một packet được firewall xử lý, trước tiên firewall sẽ tìm xem có thể gán packet đó với 1 cái connection entry sẵn có nào không. Nếu không được thì 1 entry mới sẽ được tạo ra, ứng với connection mới. connection-state của packet sẽ là "new". Khi nhận được packet trả lời cho packet này , nếu có, packet đó cũng sẽ được gán với cái connection entry này, và sẽ có connection-state là established. Tương tự với packet trả lời cho packet trả lời này. Tóm lại các packet sau gửi đi gửi lại giữa 2 đầu kết nối sẽ được gán với cái connection entry này và có connection-state=established.

Trong trường hợp sử dụng NAT thì sau khi packet đầu (connection-state=new) đi qua các rules NAT (scrnat (gồm cả masquerade), dstnat) khi các địa chỉ và cổng nguồn đích bị các rules chỉnh sửa, thì thông tin các địa chỉ và cổng đã bị chỉnh sửa từ cái gì sang cái gì sẽ được nhớ lại trong cái connection entry này, và thuộc tính connection-nat-state sẽ có giá trị dstnat hoặc srcnat tương ứng. Với những thông tin được lưu lại này, firewall sẽ biết cách khôi phục lại giá trị cổng và địa chỉ ban đầu khi tiếp nhận và chuyển tiếp các packets trả lời. Như vậy giải quyết được vấn đề ở trên với NAT và port forwarding.

Trong kết nối cũng có field để lưu thông tin connection-mark, mà bác có thể dùng các rules mangle để đặt và sửa. Với cách này với trường hợp multi-WAN bác có thể viết rules để "nhớ" packet đầu của connection đến từ đường WAN nào, và đánh dấu lên connection (connection-mark) để sau này tường lửa route các packets trả lời của cùng kết nối đi ra đúng bằng đường WAN đó. Đây là cấu hình thường gặp khi load balancing nhiều đường WAN.

Và với thông tin lưu lại, tường lửa cũng có thể đếm số packets và bytes đã gửi nhận của các packets gắn với kết nối này, cũng như tốc độ hiện thời (rate) đường gửi và nhận. Ngoài ra trạng thái hiện thời của 1 kết nối TCP (established, time-wait, close, syn-sent, syn-received) cũng có thể được biết (thuộc tính tcp-state) vì các packet kiểu SYN, SYN ACK, FIN, FIN ACK v.v... của kết nối được đọc và ghi nhận.

Vấn đề của giao thức như giao thức FTP ở trên cũng được giải quyết. Các packet của kết nối data được tạo thêm kia cũng sẽ được ghép với cái connection entry của kết nối command tới cổng 21 của server kia, khác biệt là connection-state của chúng sẽ là "related". Với rule accept connection-state="related" ở trên đỉnh như với cấu hình firewall của bác thì khi kết nối đường truyền lệnh cổng 21 kia đã được tường lửa cho phép đi qua thì các packet của kết nối data cũng mặc định được cho qua.

Và vì trong cùng 1 kết nối, ngoại trừ packet đầu tiên có connection-state=new, hầu hết các packet còn lại sẽ có state=established hoặc related, nêu nếu trong tường lửa của bác có rules accept với connection-state=established,related và đặt ở tít trên đầu, thì hầu hết các packets sẽ được xử lý ngay bằng 1 rule này ngay lập tức, và sau khi đã được accept thì các rules phức tạp và nhiều hơn bên dưới sẽ được bỏ qua không cần phải xử lý. Nói cách khác là đa số các rules tường lửa phức tạp của bác bên dưới sẽ chỉ cần phải mang ra áp dụng với packet đầu tiên, packet có connection-state=new, mà thôi. Nếu packet đầu được accept thì các packet sau đó không cần phải chạy qua hầu hết các rules đó nữa, giảm tải CPU đi rất nhiều.

Bây giờ đến phần giải thích về connection-state=untracked. Như bác có thể thấy, việc gán các packet vào connection tương ứng sẵn có khá tốn tài nguyên, cả bộ nhớ lẫn CPU. Nhiều lúc có những packets mà bác có thể drop hoặc accept ngay được, chỉ với thông tin có sẵn trong header của packet, mà không cần đến các thông tin khác mà cái connection tracking nó cung cấp thêm. Nói cách khác là không cần sử dụng connection tracking với các packet đó. Để làm việc này bác có thể tạo các rules "raw" trong cấu hình tường lửa.


Các rules này tương tự như các rules ở bảng filter, nhưng hoạt động trên chain prerouting và output, và chỉ sử dụng được ít thông tin có sẵn trong packet và thông tin về các interfaces. Nếu bác drop packet ngay ở chỗ rule raw thì packet không phải đi qua connection tracking hay qua các bảng còn lại nữa, nên sẽ sử dụng ít tài nguyên hơn nhiều so với việc bác drop chúng ở bảng filter sau khi đã chạy qua connection tracking. Vì thế nếu muốn block DoS với DDoS thì bác nên dùng rule raw để drop ở đây.

Ngoài các action như accept và drop, bác có thể đặt action=notrack. Khi đó packet sẽ không đưa cho chạy qua connection tracking, và sẽ có connection-state mặc định là untracked. Và vì bác đã không drop chúng, nên có nghĩa là bác có muốn cho packet được đi qua tường lửa. Chính vì thế ở cấu hình tường lửa mặc định, cái rule accept ở phía trên nó có thêm ",untracked" ở phần connection-state. Như thế các packets đã được rules raw cho qua này sẽ được accept ngay lập tức và không bị xử lý bởi các rules còn lại bên dưới. Bản thân các rules bên dưới nhiều khi cũng không có khả năng xử lý các packets này vì thiếu toàn bộ phần thông tin liên quan đến connection.

Tất nhiên khi không có connection tracking thì cũng không biết gì đến connection-state established hay related. Tức là khác với việc ở bảng filter phần lớn các rules chỉ phải đem ra xử lý với các packet đầu tiên của kết nối, thì các rules ở bảng raw sẽ phải mang ra áp dụng với tất cả các packets, cả ban đầu lẫn tiếp theo. Như vậy nếu bảng raw có quá nhiều rules cũng sẽ không tốt và có khả năng sẽ làm chậm hơn so với việc cho packet qua connection tracking và xử lý bởi các bảng khác như thường lệ.
Thanks thím giải thích cặn kẽ và nhiệt tình!

Vì trước đây mình có nhờ thím xem qua cái rule thì k có cái untracked trong IPv4, nhưng lại có trong IPv6. Tham khảo ở trang hướng dẫn của Mikrotik thì k có Building Your First Firewall - RouterOS - MikroTik Documentation (https://help.mikrotik.com/docs/display/ROS/Building+Your+First+Firewall), nhưng cấu hình mặc định trong router thì lại có (ảnh đính kèm).

Trong khi đó thì hướng dẫn bật fasttrack của họ thì lại k có Manual:IP/Fasttrack - MikroTik Wiki (https://wiki.mikrotik.com/wiki/Manual:IP/Fasttrack)

Nên mình muốn hỏi rõ thêm để bật/tắt untracked thì cái nào sẽ tối ưu cho thiết bị để lựa chọn hợp lý.
Mình có tham khảo rule mặc định rồi sử dụng cho ipv4 và ipv6, nhờ thím xem qua có ổn k?

IPv4 thì mình chặn ping từ bên ngoài internet
Code:
/ip firewall filter
add action=accept chain=input connection-state=established,related comment="Accept established related"
add action=accept chain=input in-interface=bridge1 comment="Allow LAN access to router and Internet"
add action=drop chain=input comment="Drop all other input"
add action=accept chain=forward connection-state=established,related comment="Accept established related"
add action=accept chain=forward connection-state=new in-interface=bridge1 comment="Allow LAN access to router and Internet"
add action=accept chain=forward connection-nat-state=dstnat comment="Accept Port forwards"
add action=drop chain=forward comment="Drop all other forward"

Còn IPv6 mới tham khảo chưa rành nhiều, nên chưa kích hoạt IPv6 cho mikrotik để sử dụng
Code:
/ipv6 firewall filter
add chain=input action=accept connection-state=established,related,untracked comment="defconf: accept established,related,untracked"
add chain=input action=drop connection-state=invalid comment="defconf: drop invalid"
add chain=input action=accept protocol=icmpv6 comment="defconf: accept ICMPv6"
add chain=input action=accept protocol=udp dst-port=33434-33534 comment="defconf: accept UDP traceroute"
add chain=input action=accept protocol=udp dst-port=546 src-address=fe80::/10 comment="defconf: accept DHCPv6-Client prefix delegation."
add chain=input action=drop in-interface-list=!LAN comment="defconf: drop everything else not coming from LAN"
add chain=forward action=accept connection-state=established,related,untracked comment="defconf: accept established,related,untracked"
add chain=forward action=drop connection-state=invalid comment="defconf: drop invalid"
add chain=forward action=drop src-address-list=bad_ipv6 comment="defconf: drop packets with bad src ipv6"
add chain=forward action=drop dst-address-list=bad_ipv6 comment="defconf: drop packets with bad dst ipv6"
add chain=forward action=drop protocol=icmpv6 hop-limit=equal:1 comment="defconf: rfc4890 drop hop-limit=1"
add chain=forward action=accept protocol=icmpv6 comment="defconf: accept ICMPv6"
add chain=forward action=drop in-interface-list=!LAN comment="defconf: drop everything else not coming from LAN"

Screenshot 2024-03-12 082018.png
 
Netinstall xóa sạch cấu hình trên router bác ạ, giống như format lại toàn bộ ổ flash trước khi copy cái main packet (bản chất là 1 cái squash partition) lên và áp dụng cấu hình mặc định. Bác mà dùng chính router đó để chỗ quê vào Internet với host Wireguard thì đương nhiên sau đó hết đường vào lại được từ xa nếu không có ai ở quê giúp cấu hình lại.
còn downgrade thì sao b có giữ nguyên mọi thứ ko? à mà bản 6.49.13 ko biết có wireguard chưa nhỉ?
 
Thanks thím giải thích cặn kẽ và nhiệt tình!

Vì trước đây mình có nhờ thím xem qua cái rule thì k có cái untracked trong IPv4, nhưng lại có trong IPv6. Tham khảo ở trang hướng dẫn của Mikrotik thì k có Building Your First Firewall - RouterOS - MikroTik Documentation (https://help.mikrotik.com/docs/display/ROS/Building+Your+First+Firewall), nhưng cấu hình mặc định trong router thì lại có (ảnh đính kèm).

Trong khi đó thì hướng dẫn bật fasttrack của họ thì lại k có Manual:IP/Fasttrack - MikroTik Wiki (https://wiki.mikrotik.com/wiki/Manual:IP/Fasttrack)

Nên mình muốn hỏi rõ thêm để bật/tắt untracked thì cái nào sẽ tối ưu cho thiết bị để lựa chọn hợp lý.


View attachment 2378559

Khi bác không có rules raw nào thì sẽ không có packet nào có connection-state=untracked cả nên rule accept đó có hay không cái checkbox đó cũng tác dụng như nhau. Cấu hình đơn giản ở Building Your First Firewall - RouterOS - MikroTik Documentation (https://help.mikrotik.com/docs/display/ROS/Building+Your+First+Firewall) không có rule raw nào nên không cần untracked trong cái rule accept.

Còn cấu hình defconf nó gần với cái cấu hình mẫu ở bài Advanced Firewall này hơn: Building Advanced Firewall - RouterOS - MikroTik Documentation (https://help.mikrotik.com/docs/display/ROS/Building+Advanced+Firewall) Ở bài đó gồm các thí dụ về RAW filtering bên dưới nên rule accept ở bảng filter phải gồm cả connection-state=untracked.

Tường lửa mặc định cũng có sẵn untracked vì nó nó không ảnh hường gì ngay cả khi bác không có rules RAW nào (nó chỉ là 1 cái OR-condition, khi condition mãi mãi false thì không ảnh hưởng đến kết quả match) và có sẵn untracked ở đó thì người dùng nếu sau này muốn thêm rules vào bảng RAW sẽ không gặp phải bất ngờ không mong muốn vì họ quên/không biết phải update rule bên filter để cho connection-state=untracked đi qua.

Fasttrack không hỗ trợ các packet không có connection tracking. Khi tắt hẳn connection tracking thì cái hoạt động tương đương không phải fasttrack mà là FastPath. Còn muốn áp dụng fasttrack lên các packet thì packet phải được connection tracking xử lý


1710211508820.png


Thế nên không thể cho các packet có connection-state=untracked qua fasttrack xử lý được. Nên rule đó chỉ có connection-state=established,related.

Tóm lại là bác cứ để nó đó, không ảnh hưởng gì hết nếu bác khồng dùng RAW filtering, và cần thiết nếu hôm nào đó bác quyết định thêm rules vào bảng raw với action=notrack.
 
còn downgrade thì sao b có giữ nguyên mọi thứ ko? à mà bản 6.49.13 ko biết có wireguard chưa nhỉ?
Downgrade hoạt đông như upgrade, nó sẽ giữ lai configuration, nhưng mà configuration mới có tương thích với version cũ không thì là chuyện khác. Thỉnh thoảng các bản mới vẫn đổi tên hoặc thêm bớt các tham số. Chưa kể nhiều lúc còn move cả path của setting. RouterOS 6 không có WireGuard bác ạ.

Ngoài ra nếu là router của hãng sản xuất (không phải CHR hay X86) thì bác không downgrade được xuống bản nào thấp hơn bản ghi ở mục "Factory Firmware" trong cửa sổ System - RouterBOARD.
 
Back
Top