天天看點

linux網絡配置和防火牆配置一例

網絡拓撲如下:hostA/B/C處于同一個區域網路:

hostA:

eth0:192.168.0.2

----------------------

hostB:

eth0:192.168.0.1

eth1:10.0.0.1

hostC:

eth0:192.168.0.3

eth1:10.0.0.3

hostA-route

10.0.0.0/24(-net) 192.168.0.1(gw)

---------------------

hostB-iptables

FORWARD(DROP)

-A FORWARD -d 10.0.0.3 -j ACCEPT 

在hostA上ping 10.0.0.3竟然通了,說明hostB的規則沒有起作用?或者說iptables有問題?其實不是的,資料可以從10.0.0.1也就是hostB走,但是回應卻不一定非要原路傳回啊,更何況三台機器在一個交換機上插着,是以資料到達hostC之後,回應時根據源位址hostA的eth0查找路由,發現和自己在一個網絡中,于是直接從eth0出去了,而不是原路回去,是以可以ping通,如果想使得事情更不混亂一點,隻需要在hostB上配置一條nat即可:

-A POSTROUTING -o eth1 -j MASQUERADE

這樣資料就不能不原路傳回了,肯定ping不通了,但是加上下面一條規則就又通了:

-A INPUT -m state --state ESTABLISHED -j ACCEPT

上述的網絡拓撲非常糟糕,在共享式區域網路絡中配置不同的子網會帶來很多隐含的問題,查起來很困難,需要你對網絡十分精通才可以,是以最好不要這麼配置。

     ESTABLISHED狀态的連接配接是一個雙向有資料的連接配接,用于友善配置防火牆。由于linux的iptables中的filter表是基于包而非連接配接的,如果你隻在一個方向允許資料通過的話,該資料包所屬連接配接的回應資料将被阻止在防火牆,是以需要配置一個反方向允許的政策,如此一來,整個filter表就會擴大一倍。實際上隻需要配置下面一條政策就可以了:

原理是--state是基于ip_conntrack的,而conntrack在filter表的政策之前起作用,而conntrack隻要看見回應的資料包就會将此資料包所屬的連接配接狀态設定為ESTABLISHED,進而使得上述配置生效。總之,上述配置需要第一個正向資料包可以通過防火牆,之後的兩個方向的資料包自然也就都可以通過了。

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1271823

繼續閱讀