用Linux+iptables構建防火牆執行個體

來源:互聯網
上載者:User
前言

用Linux+iptables做防火牆具有很高的靈活性和穩定性(老兄我的防火牆自從做了之後還一直沒有重啟過),但安裝和設定起 來比較麻煩,而且容易出錯,本文旨在用為公司做防火牆的執行個體,讓大家對Linux+iptables做防火牆的安裝和配置有一個大致的瞭解,希望能起到拋 磚引玉的作用。

系統內容與網路規化

先瞭解一下公司的環境,公司利用2M ADSL專線上網,電信分配公用IP為218.4.62.12/29,網關為218.4.62.13 ,公司有電腦五十多台,使用DHCP,IP是192.168.2.XXX,DHCP Server建在iptables Server上;另公司有一電腦培訓中心,使用指定固定IP,IP為192.168.20.XXX,為了更加快速的瀏覽網頁,我們架了一台Squid Server,所有電腦通過Squid Server瀏覽網頁,公司還另有一台WEB Server+Mail Server+Ftp Server。其IP為218.4.62.18。以上電腦和伺服器要求全架在防火牆內。我們規化如下:

                                網路配線圖
,Iptables Server上有三塊網卡,eth0上加有二個IP,218.4.62.14和218.4.62.18。
其 中218.4.62.14為共用上網,218.4.62.18為WEB Server專用,Eth1的IP為192..168.2.9;為了使培訓中心PC與公司PC之間互不訪問,所以直接從Iptables Server接到Switch-B,eth2接至Switch-A,串連培訓中心PC和Squid Server, Web Server。
網路規化好了後,就開始裝伺服器了,Iptables Server 用的系統為Redhat Linux V7.3。在裝伺服器時要注意選上防火牆的安裝包。

IPTABLES基礎

Iptables文法:
   Iptables [-t TABLE] ACTION [PATTERN] [-j TARGET]
TABLE:

有filter,nat,mangle;若無指定,預設為filter table.

ACTION(對Chains執行的動作):

ACTION    說明
-L Chain    顯示Chain中的所有規則
-A Chain    對Chain新增一條規則
-D Chain    刪除Chain中的一條規則
-I Chain    在Chain中插入一條規則
-R Chain    替換Chain中的某一條規則
-P Chain    對Chain設定的預設的Policy
-F Chain    清除Chain中的所有規則
-N Chain    自訂一個Chain
-X    清除所有的自訂Chain

CHAINS:

Iptables 有五條預設的Chains(規則鏈),如下表:

Chains    發生的時機
PREROUTING    資料包進入本機後,進入Route Table前
INPUT    資料包通過Route Table後,目地為本機
OUTPUT    由本機發出,進入Route Table前
FORWARD    通過Route Table後,目地不是本機時
POSTROUTING    通過Route Table後,送到網卡前

PATTERN(設定條件部份):

參數    內容    說明
-p    Protocol    通訊協議,如tcp,udp,icmp,all等。。。
-s    Address    指定的Source Address為Address
-d    Address    指定的Destination Address為Address
-I    Interface    指定資料包進入的網卡
-o    Interface    指定資料包輸出的網卡
-m    Match    指定進階選項,如mac,state,multiport等。。。

TARGET(常用的動作):

TARGET    說明
ACCEPT    讓這個資料包通過
DROP    丟棄資料包
RETURN    不作對比直接返回
QUEUE    傳給User-Space的應用軟體處理這個資料包
SNAT    nat專用:轉譯來源地址
DNAT    nat專用:轉譯目地地址
MASQUERADE    nat專用:轉譯來源地址成為NIC的MAC
REDIRECT    nat專用:轉送到原生某個PORT

用/etc/rc.d/init.d/iptables save可在/etc/sysconfig/中產生一iptables檔案,大家可以看到,它有三個*號開始的行,其每一個以*號開始的行對應一個 table,以COMMIT表示此table 的結束。可將要定的規則加入到對應的table中,如下:

[root@jiaoyuang init.d]# ./iptables saveSaving current rules to /etc/sysconfig/iptables:           [  OK  ][root@jiaoyuang init.d]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.2.4 on Sat Sep 28 16:51:22 2002
*mangle
:PREROUTING ACCEPT [61522:8074850]
:OUTPUT ACCEPT [1079:79301]
COMMIT
# Completed on Sat Sep 28 16:51:22 2002
# Generated by iptables-save v1.2.4 on Sat Sep 28 16:51:22 2002
*nat
:PREROUTING ACCEPT [31850:5091703]
:POSTROUTING ACCEPT [20:1240]
:OUTPUT ACCEPT [12:776]
COMMIT
# Completed on Sat Sep 28 16:51:22 2002
# Generated by iptables-save v1.2.4 on Sat Sep 28 16:51:22 2002
*filter
:INPUT ACCEPT [61444:8070296]
:FORWARD ACCEPT [34:1984]
:OUTPUT ACCEPT [1079:79301]
COMMIT

安裝並啟動IPTABLES

在 安裝RedHat Linux V7.3後,iptables就已經被安裝了,但預設啟動的是ipchains。你在安裝時所定義的一些規則也在 /etc/sysconfig/ipchains中被定義。我們需要將其停止,才能啟動iptables(注意:雖然不停止ipchains也可以啟動 iptables,但這時iptables並沒有真正的起作用。Ipchains和iptables是兩個防火牆,你只能選擇一個)。

service ipchains stop (停止ipchains)
chkconfig --level 2345 ipchains off  (使ipchains系統啟動時不自動啟動)
chkconfig --level 2345 iptables on   (使iptables 在系統啟動時自動啟動)
vi /etc/rc.d/rc.local         (編輯rc.local,將下面四行加到最後)

ifconfig eth0 add 218.4.62.18 netmask 255.255.255.248
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
echo “1” > /proc/sys/net/ipv4/ip_forward

(第一行是在eth0上再加一個IP:218.4.62.18,因在安裝時只能設一個IP:218.4.62.14。Ip_conntrack_ftp 和ip_nat_ftp為iptables運得必須的兩個模組;最後一行為使開啟伺服器IP轉寄功能。)
(如果你將iptables的模組加到了核心中,以上第二,三行可省略。)
配置DHCP Server,以便讓公司PC自動獲得IP和網關,網關為192.168.2.9。具體的方法請參見相關資料,本文不作詳述。

reboot

重新啟動伺服器後,Iptables 就已經開始運行了。

配置IPTABLES

對iptables 有了一個基本的瞭解後,我們就可以來配置我們的伺服器了。首先要發布我們的WEB Server,將以下二行加入/etc/sysconfig/iptables中的nat table內:

-A PREROUTING -d 218.4.62.18 -j DNAT --to-destination 192.168.20.254
-A POSTROUTING -s 192.168.2.254 -j SNAT --to-source 218.4.62.18

第一行為將至伺服器的所有目地地址為218.4.62.18的包都NAT為192.168.2.254,第二行為將至伺服器的所有源地址為192.168.2.254的包為NAT到218.4.62.18。請把WEB Server 的網關設為192.168.20.9。

下面我們將所有從伺服器共用出去的包都SNAT為218.4.62.14,就可完成共用上網的功能了:

-A POSTROUTING -s 192.168.0.0/16 -j SNAT --to-source 218.4.62.14
   
   將下面的規則加入到/etc/sysconfig/iptables中的filter tables內:
   
-A INPUT -p icmp -m icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 2 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j REJECT --reject-with icmp-port-unreachable
   
   以上兩行是為了防止Dos攻擊做的一個簡單的處理,大家對於各種攻擊可做出相應的處理。

-A INPUT –i eth0 –m state –state ESTABLISHED,RELATED –j ACCEPT-A INPUT –i eth0 –j DROP
    
    以上兩行是做了一個INPUT狀態防火牆的處理,其主要作用為防止外部的串連和攻擊,因其接受ESTABLISHED,RELATED狀態(一個包分為NEW,ESTABLISHED,RELATED,INVALID四種狀態)的包,故又不妨礙從本機出去的串連。
    
由於並不是所有的電腦都可以上網,所以還要對共用上網的電腦做一個限制:

IP限制:
-A FORWARD –s 192.168.2.0/29 –p udp –m multiport –port 53 –j ACCEPT
-A FORWARD –s 192.168.2.0/29 –p tcp –m multiport –port 3128,110,25 –j ACCEPT
-A FORWARD –s 192.168.20.253 –j ACCEPT
充 許192.168.2.0~192.168.2.7和192.168.20.253(squid server)的電腦可上網和發郵件。3128是squid server的proxy port。我們用它去共用上網,110為pop3,25為smtp。Udp的53為DNS所要的port。不過由於使用的是DHCP,可能每次得到的IP 都不一樣,所以我們就要用下面一種MAC限制的方法了。

MAC 限制:
-A FORWARD –m mac -–mac XX:XX:XX:XX:XX:XX –p udp –m multiport –port 53 –j ACCEPT
-A FORWARD –m mac -–mac XX:XX:XX:XX:XX:XX –p tcp –m multiport –port 3128,110,25 –j ACCEPT
如上就可通過網卡來控制上網了,但現在電腦高手多多,改一個MAC的地址好像也不是什麼難事了,怎麼辦呢?那就用我們的第三種方法吧。

MAC+IP限制:
    更改/etc/dhcpd.conf,如果MAC與IP綁定:
subnet 192.168.2.0
  netmask 255.255.255.0{  
      range 192.168.2.30 192.168.2.230;
      option broadcast-address 192.168.2.255;
      option routers 192.168.2.9;
      option domain-name-servers 212.132.16.163;
      host meeting-room        {
          hardware ethernet 00:50:ba:c8:4b:3a;
          fixed-address 192.168.2.35;
     }}
    我們的Iptables改為:0
-A FORWARD –s 192.168.2.35 –m mac -–mac XX:XX:XX:XX:XX:XX –p udp –m multiport –port 53 –j ACCEPT
-A FORWARD –s 192.168.2.35 –m mac -–mac XX:XX:XX:XX:XX:XX –p tcp –m multiport –port 3128,110,25 –j ACCEPT
  這樣做之後,高手也無能為力了,不過公司有位MM是兄台的GF,上班的時候想和她聊聊天,培養培養感情;怎麼辦呢?我們知道QQ用的是udp的4000連接埠,如佔用則4002,4003。。。那麼就如下了:
-A FORWARD –s 192.168.2.35 –m mac -–mac XX:XX:XX:XX:XX:XX –p udp –m multiport –port 53,4000,4001,4002,4003,4004,4005 –j ACCEPT
-A FORWARD –s 192.168.2.35 –m mac -–mac XX:XX:XX:XX:XX:XX –p tcp –m multiport –port 3128,110,25 –j ACCEPT

最後加一句:

-A FORWARD –s 192.168.0.0/16 –j DROP
  
    由於前面應該開的都開了,所以最後全部禁止。呵呵,到此大功告成。
    
總結

世 界上沒有絕對安全的防火牆,安全永遠是相對的。配置iptables的思路是先ACCEPT再DROP。共用上網的辦法還有一個就是用iptables server的Owner,但由於linux沒有像win2k那樣的驗證模式,在驗證owner時有些困難。本人正在測試,但目前還沒有比較好的解決辦 法,哪位兄弟搞定的話請Mail小弟,小弟將不勝感激。值得注意的是在做NAT時,用戶端的網關一定要是iptagles的IP。
如本文有什麼地方有錯誤,還請各位朋友告知。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.