1 changed files with 111 additions and 2 deletions
-
113README.md
@ -1,3 +1,112 @@ |
|||
# wpimocall |
|||
Of course. This is a more advanced and interesting use case. You want to **dynamically identify traffic** going to WhatsApp and IMO and then **force only that traffic** through a VPN tunnel (likely for policy or security reasons). |
|||
|
|||
Whatsapp and IMO Voice Call |
|||
This is achievable on MikroTik using a combination of **DNS hijacking**, **dynamic address lists**, and **policy-based routing**. |
|||
|
|||
The core idea is: |
|||
1. **Catch DNS requests** for key domains (`whatsapp.net`, `imo.im`, etc.). |
|||
2. **Resolve those domains** and **dynamically add** the resulting IP addresses to an address list. |
|||
3. **Create a routing rule** that sends any traffic destined for IPs in that address list through your VPN interface. |
|||
|
|||
This method is far superior to a static IP list because it automatically updates itself. |
|||
|
|||
--- |
|||
|
|||
### Step-by-Step Configuration Guide |
|||
|
|||
#### Prerequisites: |
|||
* A working VPN connection (PPTP, L2TP, SSTP, or OpenVPN) set up on your MikroTik. Its interface is named `vpn-out1` in this example. |
|||
* Your main gateway (e.g., for direct internet traffic) has a route with a distance of `1`. |
|||
|
|||
#### Step 1: Create the Dynamic Address List |
|||
We'll create a list to hold the IPs of the blocked services. |
|||
|
|||
```bash |
|||
/ip firewall address-list |
|||
add list=vpn-services address=31.13.64.0/18 comment="Meta WhatsApp Range - EXAMPLE" disabled=no |
|||
add list=vpn-services address=157.240.0.0/16 comment="Meta WhatsApp Range - EXAMPLE" disabled=no |
|||
# We start with some known ranges but the script will populate it dynamically. |
|||
``` |
|||
|
|||
#### Step 2: Hijack DNS Requests to Identify Domains |
|||
We use the MikroTik as the DNS server for the network and use a script to catch requests for specific domains. |
|||
|
|||
**2.1. Set up the router as the DNS server** for your DHCP clients (if it isn't already): |
|||
```bash |
|||
/ip dhcp-server network |
|||
set [ find ] dns-server=192.168.88.1 # Replace with your router's LAN IP |
|||
``` |
|||
|
|||
**2.2. Create a script to resolve domains and add them to the list:** |
|||
Go to **System > Scripts** and create a new script called `resolve-vpn-domains`: |
|||
|
|||
```bash |
|||
:local domain [/ip dns cache all find where name ~ "whatsapp" or name ~ "imo\.im" or name ~ "wa\.me" and type="A" and expired=false] |
|||
:foreach i in=$domain do={ |
|||
:local resolvedAddress [/ip dns cache all get $i address] |
|||
:local resolvedName [/ip dns cache all get $i name] |
|||
:if ([:len $resolvedAddress] > 0) do={ |
|||
/ip firewall address-list add list=vpn-services address=$resolvedAddress comment="$resolvedName" timeout=3h |
|||
} |
|||
} |
|||
``` |
|||
*This script runs every 3 hours, finds non-expired DNS cache entries for key domains, and adds their IPs to the `vpn-services` list with a 3-hour timeout.* |
|||
|
|||
**2.3. Schedule the script to run periodically:** |
|||
Go to **System > Scheduler** and add a new task: |
|||
* **Name:** `update-vpn-ips` |
|||
* **Interval:** `03:00:00` (every 3 hours) |
|||
* **On Event:** `resolve-vpn-domains` |
|||
|
|||
#### Step 3: Create the Policy-Based Routing Rule |
|||
This is the most important step. It tells the router what to do with the traffic going to the IPs in our dynamic list. |
|||
|
|||
**3.1. First, mark the connection** when a packet is destined for an IP in our `vpn-services` list. This mark will follow the entire connection. |
|||
```bash |
|||
/ip firewall mangle |
|||
add chain=prerouting action=mark-connection new-connection-mark=vpn_conn passthrough=yes dst-address-list=vpn-services comment="Mark Connections for VPN Services" |
|||
``` |
|||
|
|||
**3.2. Then, mark the routing** for all packets that are part of that marked connection. |
|||
```bash |
|||
/ip firewall mangle |
|||
add chain=prerouting action=mark-routing new-routing-mark=vpn_route passthrough=yes connection-mark=vpn_conn comment="Mark Routing for VPN Route" |
|||
``` |
|||
|
|||
**3.3. Finally, create a route** that uses the VPN interface for traffic with the `vpn_route` mark. |
|||
```bash |
|||
/ip route |
|||
add dst-address=0.0.0.0/0 gateway=vpn-out1 routing-mark=vpn_route check-gateway=ping comment="Route VPN-marked traffic through VPN" |
|||
``` |
|||
* **dst-address=0.0.0.0/0:** This is the default route, but it only applies to packets with the `vpn_route` mark. |
|||
* **gateway=vpn-out1:** The name of your VPN interface. |
|||
* **check-gateway=ping:** This is crucial. It will disable this route if the VPN gateway becomes unreachable, preventing a black hole. |
|||
|
|||
--- |
|||
|
|||
### Step 4: Verification and Monitoring |
|||
|
|||
**1. Check your dynamic address list to see if it's populating:** |
|||
```bash |
|||
/ip firewall address-list print where list=vpn-services |
|||
``` |
|||
You should see entries with comments showing the domain name and a timeout counting down. |
|||
|
|||
**2. Check your connections to see the marking and routing in action:** |
|||
```bash |
|||
/ip firewall connection print where connection-mark=vpn_conn |
|||
``` |
|||
|
|||
**3. Check the routes:** |
|||
```bash |
|||
/ip route print |
|||
``` |
|||
You should see your main route (distance=1, main table) and the special route for `vpn_route` (dynamic table). |
|||
|
|||
### Important Considerations & Enhancements |
|||
|
|||
* **Kill Switch:** The `check-gateway=ping` parameter acts as a basic kill switch. If the VPN drops, the route is disabled, and traffic won't leak out the main WAN. For a stronger kill switch, you would need more complex firewall rules to drop all traffic not going through the VPN. |
|||
* **Performance:** This method uses connection tracking and is very efficient on modern MikroTik hardware (hAP ac², RB4011, etc.). |
|||
* **Completeness:** This method is very good but not 100% perfect. Some services, especially IMO, might use hard-coded IPs or other Google domains that are harder to catch. The L7 method from the previous answer is more accurate for identification but is more CPU-intensive and can't be used for routing decisions as easily. |
|||
* **Multiple VPNs:** You can create different address lists and routing marks for different services to send them through different VPN tunnels. |
|||
|
|||
This solution provides a powerful, dynamic, and maintainable way to achieve your goal of selectively routing specific application traffic through a VPN. |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue