I guess when dealing with firewalls you have to have a clear understanding of which port your application is using.
Today I took it for granted that a SQL Server named instance such as \SQLEXPRESS is sharing the same 1433 port with the default SQL Server instance. Later after I found out it didn’t work, it finally occurred to me that 2 processes cannot listen to the same port.
Anyways, I googled and found out that named instances are using dynamic port by default, which is assigned by SQL Browser who is listening to 1434. You can also view the assigned dynamic port via SQL Server Configuration Manager -> Select your instance -> Double click on TCP/IP -> Click on IP Addresses tab, at the bottom of the page you will see a dynamic port. And below it you can assign a static port, which I did and solved my problem.
Reference: