為什么?
我發現目前所有的HOWTO 都缺乏新的Linux 2.4.x 內核中的新Iptables 函數的信息,于是我試圖回答象一些新的可能性在諸如狀態匹配之中的問題. 假設問一下, 你的服務器上能否構建這么一種情況,它 允許被動的FTP訪問 ,但不許從IRC中流出DCCs. 我將在例子 rc.firewall文件中構建這種情況,你可以在你的/etc/rc.d/ scripts中使用。是的,最初這篇文章是偽裝成HOWTO文檔的形式書寫的,因為許多人只接受HOWTO文檔,。
還有一個小腳本,我寫它只是為使你在配置它的時候能象我一樣振奮,具體文件可以在flush-iptables.txt中獲得.
怎么樣?
我已經向Marc Boucher 及netfilter團隊的其他核心成員提出了問題。對他們的工作以及對我在為boingworld.com書寫這個指南時的幫助表示極大的謝意。這個文檔將一步一步教你setup過程,讓你對iptables包有更多的了解。這大部分的東西都基于例子rc.firewall 文件,因為我發現這是學習iptables的一個好方法。我不太確定如何組織這篇文章,但我最后決定自頂向下地跟隨rc.firewall 文件,換句話說,你可以閱讀rc.firewall 文件,當你碰到不懂的東西時再來查看這個文件。
你是誰?
我是這樣一個人,在我的局域網上有很多舊機器,等待連接到Internet上并保證安全。在這一點上,新的iptables 是從舊的ipchains 上的一個很好的升級,以前,你可以通過丟失所有的包,并將它們不送往特定的端口來建立一個安全的網絡,但這將導致類似被動的 FTPs 或在IRC中流出DCCs的問題,你得服務器分配端口,并告知客戶端,然后再讓客戶連接。但是,新的iptables 代碼中也有一些小毛病,在某些方面我發現這些代碼并沒有為作為完整的產品發布做好準備,但我仍然建議那些使用ipchains 或更老的ipfwadm 的人進行升級,除非他們對正在使用的代碼滿意,或則它們足以滿足他們的需要。
從哪獲得 ?
iptables 用戶空間包可以從netfilter 的一個主頁獲得。iptables 還使用了內核空間包,在配置時可以加入內核,有用的部分我們將在下文討論。
內核setup
運行iptables 最基本的部分,你需要將下面的選項配置入內核:
CONFIG_PACKET
CONFIG_NETFILTER
當然你需要配置好你的接口,使它們工作,那就是Ethernet, PPP 和 SLIP 接口。如果你想用更高級的選項,你需要將下面的選項配置入內核:
CONFIG_IP_NF_CONNTRACK
CONFIG_IP_NF_FTP
CONFIG_IP_NF_IPTABLES
CONFIG_IP_NF_MATCH_LIMIT
CONFIG_IP_NF_MATCH_MAC
CONFIG_IP_NF_MATCH_MARK
CONFIG_IP_NF_MATCH_MULTIPORT
CONFIG_IP_NF_MATCH_TOS
CONFIG_IP_NF_MATCH_STATE
CONFIG_IP_NF_MATCH_UNCLEAN
CONFIG_IP_NF_MATCH_OWNER
CONFIG_IP_NF_FILTER
CONFIG_IP_NF_TARGET_REJECT
CONFIG_IP_NF_TARGET_MIRROR
CONFIG_IP_NF_NAT
CONFIG_IP_NF_NAT_NEEDED
CONFIG_IP_NF_TARGET_MASQUERADE
CONFIG_IP_NF_TARGET_REDIRECT
CONFIG_IP_NF_NAT_FTP
你還可以看到很多,在此我不一一解釋,如果你需要或好奇可以自己仔細去看看。built-in 在配置時有幫助,其他命令對于了解基本的東西會有幫助,詳細情況請看一下netfilter 主頁上的HOWTO"s
下文中的一些選項是你所需要使用而且我也將要講述的.
CONFIG_PACKET
CONFIG_NETFILTER
CONFIG_IP_NF_CONNTRACK
CONFIG_IP_NF_FTP
CONFIG_IP_NF_IPTABLES
CONFIG_IP_NF_MATCH_STATE
CONFIG_IP_NF_MATCH_UNCLEAN
CONFIG_IP_NF_TARGET_REJECT
CONFIG_IP_NF_TARGET_MASQUERADE
使用過的選項的解釋
CONFIG_PACKET 使得類似tcpdump 的程序工作,在本指南中并沒有真正使用,但因為你讀了,我假設你對安全方面感興趣, 在這一點上,tcpdump和snort是好的添加。
CONFIG_NETFILTER 能使內核中信息包進行過濾,沒有這一選項,你不能使用iptables ,沒有它你也不能偽裝你的連接。
CONFIG_IP_NF_CONNTRACK ------連接跟蹤,它跟蹤連接,并知道在一個連接中信息包如何、在哪相關聯。它在偽裝或做任何一種NAT操作的時候需要!
CONFIG_IP_NF_FTP 跟蹤FTP連接,因為它與基本的過濾器有點問題,所以是分開的代碼。當你想在FTP的連接上偽裝時需要它。
CONFIG_IP_NF_IPTABLES 是iptables 支持,如果你想使用iptables就需要它。(如果你不需要它我不知道你為什么要讀這篇文章)。
CONFIG_IP_NF_MATCH_STATE 是iptables的狀態匹配代碼,對2.3.x 和 2.4.x 內核來說它是一種新的特性,但到目前為止還沒有很好的文檔對它加以描述,這也是我所想補救的。它所做的就是在基于信息包與其他連接的關系上增加包過濾的可能性,例如你可以使一個被動的FTP 客戶通過一個其他方面是完全關閉的服務器,下載文件,列表目錄等。
CONFIG_IP_NF_MATCH_UNCLEAN 支持通過觀察包頭部的一系列域來匹配不干凈的包或無效包。
CONFIG_IP_NF_TARGET_REJECT 這段代碼向你的過濾器中增加REJECT 目標。換句話說,它可以讓你用`ICMP error" 回答,而不只是丟棄死包。這在你想告訴別人無法連接時有好處。
CONFIG_IP_NF_NAT 允許你做偽裝、端口傳送等等操作。如果你只有一個配置的IP ,但是還想將所有的網絡設備都連到Internet 上,就需要它將你的局域網連到Internet 上。
CONFIG_IP_NF_TARGET_MASQUERADE 使改變你的局域網到 Internet 的連接成為可能,使他們看起來象是從其他的主機而不是普通的box IP來。想知道它在理論上是怎么工作的請查看masquerading HOWTO。
當然你可能不會用到所有的這些選項,或者你想使用其他的配置選項,以上這些是我在這個指南中將要用到的,為了在你的網絡設備上建立基本的安全體制。
用戶設置
在這你要做的就是獲取iptables 包并配置好它, iptables包在netfilter的一個主頁可下載. 。當然,安裝這個包也是個好主意。
rc.firewall 文件
例子 rc.firewall
好了,你已經建立好了一切,準備好看看例子rc.firewall文件 。這個文件很長,有很多注釋,看看它再回來看解釋。
rc.firewall的解釋
額外模塊的初始加載
首先我們注意到模塊關聯文件通過發布/sbin/depmod ——一個命令而保持最新的。然后我們加載一些我們感興趣的模塊。比如你想要支持REJECT 和MASQUERADE 目標,但你沒有將它在你的內核中編譯,我們就加載這些模塊。
下一步是加載ipt_owner 模塊的選擇,比如只允許特定用戶做特定連接等。在這個例子中我不用它,但基本上,你可以只允許根做與redhat 和 DROP及其他一切的 FTP 和 HTTP連接?;蛘叱四愕挠脩艉透酝?,你不許其他用戶從你的網絡設備連接Internet,可能對其他人不方便,但你在黑客攻擊前可能安全些。
這之后是我們狀態匹配過濾器使用的第一部分,ip_conntrack_ftp 和 ip_conntrack_irc的加載。通過它可以做我在本文一開始就鼓吹的事情: 狀態匹配,比如不允許被動的FTP 而允許DCC 工作,我們只加載了ip_conntrack_ftp 模塊,卻沒加載ip_conntrack_irc模塊。為使他們工作,這兩者必須沒被編譯進內核,我重復一遍,必須沒有。反之亦然,我們在哪希望被動的FTP 工作,卻沒發送DCC ,當然我們得用其他方式做,加載IRC 模塊,而不是FTP 模塊。它所做的就是比如增加內核辨認一個與當前活躍的FTP 控制流程相關聯的被動FTP連接的能力,但因為IRC 模塊沒被加載,內核沒法辨認它是否與當前某個活躍的流相關聯,因此它不允許這些連接。如果你用相反的方式做,相反的結果成立。
為了IP傳送的內核初始化及其他
之后,我們通過給/proc/sys/net/ipv4/ip_forward 回應一個 ”1”來開始IP 傳送 ,可以使用下面的方式:
echo "1" > /proc/sys/net/ipv4/ip_forward
萬一你需要動態的IP 支持,比如你使用SLIP, PPP或DHCP等等 ,你需要做下面的操作來啟動ip_dynaddr 選項:
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
如果還有其他選項你要開啟,那么你要遵循它們的格式,有其他的文章介紹如何去做這些工作,在本文中就不做介紹了。
真正開始偽裝
我們第一個任務就是開始真正的偽裝,是嗎?至少對我是這樣的。首先我們向nat table添加一條規則,在POSTROUTING 鏈上,該規則將偽裝出自我們與Internet連接的接口的所有包。對我來說這是eth0,-t 告訴我們用哪個表,在這種情況下是nat,-A 告訴我們,我們將在一個叫做POSTROUTING 的已存在鏈上加一個新規則,-o eth0 告訴我們匹配eth0 上的所有流出包,我們最后的目標是偽裝包。所有與這條規則匹配的包都被偽裝,看起來象來自你的Internet 接口。很簡單,是嗎?
下一步是接收所有來自輸入接口eth1 的并通過默認表過濾器中的FORWARD鏈的包,eth1是與內部網絡連接的接口。所有在我們網絡設備被傳送的包都將穿過過濾器表中的FORWARD 鏈。
下一件事是接收所有來自任何地方的建立或關聯某個連接的包。換句話說,在eth1后我們先在本地網絡設備發送一個包,因為它來自eth1, 所以我們接收它,然后當Internet 網絡設備應答的時候,它被這個規則俘獲,因為連接在兩個方向上都看見了這個包。
最后的事情就是記錄滑過邊緣命中省缺策略的負載,這是那些應該通過卻沒有通過的包。在其他情況下,他們可能是那些顯然不能通過的包,你要通報這一點。我們允許這條規則每分鐘最多匹配3次,限制是3。這意味著在這條線上,我們每分鐘最多得到3條記錄(log entries),限制仍是3,所以如果我們在2秒鐘內得到3條記錄,下條記錄我們要等1分鐘。如果有人對你傾倒廢物的話這是好的,否則會產生許多兆字節的日志記錄。我們在日志前加一個前綴——log-prefix,將日志級別設為log-level,日志級別將告訴syslogd或logging facility這條日志到底重要到什么程度。
不同鏈的規則取代,為什么?
我用盡可能多的節約CPU資源 的方式取代了不同的鏈。不讓TCP 包穿過ICMP,
UDP 和 TCP規則,我只是匹配TCP 包,讓TCP 包穿過另一條鏈。使用這種方法我們并沒有耗費太多資源。下面的圖畫試著解釋一個包如何穿過你的ipfilters。這副圖來自
。
首先做一個路由決策,如果它的目的地是你的主機,它是發向INPUT,如果它的目的地是本地網的某個網絡設備,它是發向FORWARD。然后它們穿過那些鏈。如果你的本地網絡設備對去往服務器的包做出應答,它們將穿過OUTPUT 鏈。
這有一幅圖給出它們怎么穿過INPUT 、 FORWARD 、 OUTPUT鏈,
當一個包碰到INPUT 鏈,它首先被檢查是否是ICMP 包,如果是,則被發往icmp_packets 被檢查是否被允許。如果允許,我們只是離開INPUT 鏈接收這個包。如果不允許,它將到達icmp_packets 鏈尾,回到INPUT 鏈,到達鏈尾做更多的檢查,看它是否來自本地主機或本地網,如果是它將被接收。通過檢查它是否是一個已建立或相關連接的一部分來檢查這個包是否屬于其他連接,在這種情況下我們要接收它們。如果它什么也不匹配,它將由丟棄鏈規則來處理,這條規則負責丟棄它所碰到的任何東西。
如果是個TCP 包,它不會匹配是ICMP 包的規則,傳到下一個檢查是否是TCP包的規則。因為是,所以匹配,將被傳送到tcp_packets 鏈。這里我們將檢查它是否去往我們所允許或不允許的一個端口,如果是, 我們將它傳送到允許的鏈做最后的檢查。如果在檢查中它失敗了,它將被送到INPUT 鏈,穿過與ICMP 包相同的路。
UDP包基本上一樣,除了它要穿過udpincoming_packets 鏈,如果它在那什么規則也沒匹配,它將被送到INPUT 鏈,穿過與TCP包和ICMP 包相同的路 。具體圖片可以在以下地址獲得.
如果包去往或來自我們的本地網,它將被路由到FORWARD鏈。如果包來自我們的局域網,我們接收它,不多不少。如果我們愿意,我們可以只接收SYN包,但我跳過它了。如果包去往我們的本地網,我們只是匹配已建立的或相關的流,因為我們不想建立從外部到我們本地網的新連接。如果這些規則都不匹配,包將被我們的鏈規則丟棄。具體圖片可以在以下地址獲得.
這個鏈是很直接的。我們允許任何東西從本地主機發出,我們允許任何東西從本地網的ip發出,最后我們允許任何東西從我們自己的ip 發出到internet。你可能在某種情況下希望消除這一切,不過不要忘了消除OUTPUT 鏈的默認規則是丟棄所有的東西。
建立不同的使用鏈
現在你有點了解包如何穿過不同鏈以及它們之間的從屬關系,我們負責將它們聯系起來。 首先我們用一個簡單的命令配置不同鏈上的默認規則。iptables -P
默認規則在包不能與鏈中規則匹配時使用。然后我們建立我們想與-N 命令一同使用的不同的特殊鏈。新鏈將建立起來而且內部沒有任何規則。我們使用的鏈是icmp_packets,tcp_packets, udpincoming_packets 和tcp_packets允許的鏈。在eth0上的包,凡是屬于ICMP 類的,將被重定向到icmp_packets,屬于TCP 類的,將被重定向到tcp_packets ,而來自eth0 的UDP 類包則定向到 udpincoming_packets 鏈。
TCP允許的鏈,允許TCP前的最后一次檢查
如果一個包來自eth0 是TCP 類的,它穿過tcp_packets 鏈,如果連接與一個允許的端口相反,我們將要做一些最后的檢查來看我們是否真的允許它。首先我們象以前一樣建立鏈。然后我們檢查包是否是SYN 類的。如果是,它很可能是一個新連接的第一個包,當然,我們允許它。然后我們檢查包是否來自一個已建立的或相關的連接,如果是,我們當然也允許它。一個已建立的連接(ESTABLISHED connection )是一個雙向都有負載的連接,因為我們獲取了一個SYN包和一個對SYN包的應答,連接必為已建立(ESTABLISHED)狀態。鏈中的最后一條規則將把剩下的所有東西丟棄。在這種情況下意味著沒有看到兩個方向的負載,也就是沒對SYN包做應答,或者他們開始與一個不是SYN的包連接。不開始一個與SYN 包的連接沒有什么實際用途,除了對 那些進行端口掃描的人。當前沒有可利用的TCP/IP 應用支持打開一個除了SYN 包的TCP 連接,所以丟棄這些廢物, 因為它99%是進行端口掃描。
ICMP鏈
這是我們決定ICMP 類允許什么的地方。如果一個ICMP類型的包在INPUT 鏈上來自eth0,我們將使它重定向到icmp_packets 鏈。在這我們將檢查什么種類的ICMP類被允許。象現在我只允許傳入的ICMP Echo Replies, Destination unreachable, Redirect 和 Time Exceeded。
我允許這些ICMP 包的原因如下,Echo Replies是你ping 其他主機時獲得的,如果不允許這個,我們就不能ping 其他主機了。Destination Unreachable 在特定主機無法到達時使用,所以比如我們發出一個HTTP 請求,主機不可到達,無法找到主機路由的最后一個網關應答Destination Unreachable 告訴我們找不到它。這使我們不用等到瀏覽器的60秒或更多的超時設定到達。Redirect,我允許它因為我可能沒有使用到達一個主機的最佳路徑,比如我向Gateway 1(G1) 發送一個包,與Gateway 2(G2)在同一個網段,G1 將包發給G2,G2可能告訴你使用G2而不是G1 來節省一跳。這樣我們有時可以傳送的快一點,不是很多,但至少好一點。Time Exceeded被允許是因為我們可能想跟蹤一些主機或一個包獲得的生存期為0,我們將得到關于這個的應答。比如當你跟蹤某個人時,你從TTL = 1開始,在向外的第一跳它減小到0,從第一個網關返回一個Time Exceeded 到我們跟蹤的主機,則TTL = 2 ,第二個網關發送Time Exceeded,等等,直到我們從想到達的主機得到應答。
這是ICMP 類的一個總列表:
Table 1. ICMP types
Type Code Description
0 0 Echo Reply
3 0 Network Unreachable
3 1 Host Unreachable
3 2 Protocol Unreachable
3 3 Port Unreachable
3 4 Fragmentation needed but no frag bit set
3 5 Source routing failed
3 6 Destination network unknown
3 7 Destination host unknown
3 8 Source host isolated (obsolete)
3 9 Destination network administratively prohibited
3 10 Destination host administratively prohibited
3 11 Network unreachable for TOS
3 12 Host unreachable for TOS
3 13 Communication administratively prohibited by filtering
3 14 Host precedence violation
3 15 Precedence cutoff in effect
4 0 Source quelch
5 0 Redirect for network
5 1 Redirect for host
5 2 Redirect for TOS and network
5 3 Redirect for TOS and host
8 0 Echo request
9 0 Router advertisement
10 0 Route sollicitation
11 0 TTL equals 0 during transit
11 1 TTL equals 0 during reassembly
12 0 IP header bad (catchall error)
12 1 Required options missing
13 0 Timestamp request (obsolete)
14 0 Timestamp reply (obsolete)
15 0 Information request (obsolete)
16 0 Information reply (obsolete)
17 0 Address mask request
18 0 Address mask reply ?/TD>
如想獲取更多的信息,我建議你閱讀下面的網站和報告:
The Internet Control Message Protocol ICMP
RFC792
又及,阻礙你想要做的某些事情可能是我的錯誤,但對我來說,阻礙其它我不允許的ICMP 類型將會使我的一切東西都工作的很好。
TCP 鏈
現在我們講TCP連接。它指定了從Internet的防火墻上什么端口可以被使用。當然這還要做更多的檢查,所以我們發送每一個TCP包,其中總有一個會到達我們前面提到的允許的鏈中。一個tcp_packets 告訴iptables 在哪個鏈中添加新規則,規則被添在鏈尾。-p TCP 告訴它匹配TCP包,-s 0/0 匹配所有的源地址,從0.0.0.0 ,掩碼為0.0.0.0,換句話說就是所有的源地址,實際上這是省缺的行為,但我在這忽略用它。--dport 21表示目標端口21,換句話說,如果包去向端口21他們也匹配。如果所有的標準都匹配了,包就去向允許的鏈。如果它有任何一條規則沒匹配,它將被傳回到發送它到tcp_packets 鏈的鏈。
象現在,我允許TCP port 21,或FTP 控制端口,它用來控制FTP 連接,稍后我還允許所有的相關連接,而且那樣我還允許PASSIVE 和 PORT 連接,因為ip_conntrack_ftp 模塊被加載。如果我們完全不允許FTP ,我們可以卸載ip_conntrack_ftp 模塊,從rc.firewall 文件中刪除那條鏈。
端口22是SSH,比允許端口23上的telnet 好,如果你想允許外面的人使用你網絡設備上的 shell。
端口80是HTTP,換句話說就是你的網絡服務器,如果你不想在你的站點上運行一個網絡服務器就刪掉它。
最后,我們允許端口113,它是IDENTD ,對于使用象IRC的協議工作好有用處。
如果你想增加更多的開放端口,那怎樣做則就是你自己的事情了。
UDP 鏈
現在,如果我們在INPUT 鏈上獲得一個UDP 包,我們則將它繼續傳送到udpincoming_packets。
現在,如果我們確實在INPUT 鏈上獲得一個UDP 包,我們則將它繼續傳送到udpincoming_packets,在那用-p UDP 再為UDP協議做一個匹配,匹配了所有的源地址為0.0.0.0 掩碼為0.0.0.0 的東西,換句話說所有的東西又匹配了。如果他們還有源端口53,我們直接接收它們。
現在,我從端口53 接收來的UDP 包,用來做DNS 查找,沒有這個我們做不了域名查找而且我們只能使用IP"s。我們不希望這種行為,所以我們當然允許DNS。
我個人還允許端口123,是NTP 或網絡時間協議(network time protocol)。這個協議用來將你的計算機的時間設置為與具有非常準確的時鐘的服務器相同的時間。雖然你們大多數人可能不用這個協議,我允許它是因為我知道有些人用。
我們現在還允許端口2074,用于象speak freely 一類的實時多媒體應用。使用speak freely你可以通過喇叭、麥克風或耳機與其他人實時交談。
端口4000,現在眾所周知是ICQ協議。我覺得沒有必要進一步解釋它是干什么的。
nat table的PREROUTING 鏈
PREROUTING 鏈與它的字面意思一樣,在它們真正遇到將它們送到過濾表上不同的INPUT/FORWARD/OUTPUT 鏈的路由表之前過濾包。這是檢查包是否具欺騙性的好地方。
首先我們檢查顯然欺騙的IP 地址,就象萬一我們從Internet 接口處獲得一個包,聲明有一個源IP 192.168.x.x, 10.x.x.x 或 172.16.x.x, 我們馬上把它們扔掉,因為這些地址是為本地內部網保留的,顯然不能在Internet上使用。這也可以反過來使用,比如我們從$LAN_IFACE 處獲得一個包,聲明不是從$LAN_IP_RANGE的IP地址處來的,我們也把它扔掉 。
INPUT 鏈
象我寫的INPUT 鏈大多使用其他鏈來工作。在這種方法下,我們并沒有從iptables處獲得太多的負載,因此它在那些高負載下可能丟失包的慢機器上也能工作的很好。
在這我們對壞包做特別檢查。如果你想完全了解這一點,你要看附錄的regarding state NEW and non-SYN packets getting through other rules。在特殊條件下這些包被允許,但99%的情況下我們不希望這些包通過。所以我們將它們記錄到日志并丟棄。首先我們匹配引入接口$INET_IFACE的INPUT 鏈的所有ICMP包,引入接口是eth0,把包傳到前面講過的icmp_packets。然后我們對$INET_IFACE 上的TCP 包做同樣的匹配,并將它們送到tcp_packets 鏈,之后所有的UDP 包送到udpincoming_packets 鏈。最后我們檢查來自$LOCALHOST_IP的所有東西,一般是127.0.0.1 ,接收從那來的所有負載,對來自$LAN_IP_RANGE的做同樣的事,一般是192.168.0.0/24,這之后要考慮一下安全問題了,我們允許來自我們自己Internet IP 的任何東西,它們或者已建立連接或者與某些連接相關聯。我們還允許我們局域網的廣播負載,一些應用依賴于它,象Samba , 沒有它這些應用無法很好地工作。
在我們遇到INPUT 鏈的默認規則前,我們把它記入日志以便發現可能的問題或bugs。它或者是一個我們不允許的包,或者是對我們做壞事的人,或者是我們防火墻中的一個問題,不允許那些被允許的包。無論是那種情況我們都想知道然后做出處理。雖然每分鐘我們記錄不超過3個包,這是為了使日志文件不被垃圾充斥,我們還為日志記錄加了前綴,使我們知道它是哪來的。
不被匹配的東西就會被INPUT 鏈的默認規則扔掉。默認規則是很早以前設置的,你應該記得。
OUTPUT 鏈
因為我知道除了我之外沒人使用這個部分用做防火墻和工作站的網絡設備,我允許來自它擁有源地址$LOCALHOST_IP, $LAN_IP 或 $STATIC_IP的任何東西。其他的所有東西都以某種方式欺騙,盡管這樣我還是懷疑某個我知道的人會在我的網絡設備上這么做。最后,我們將扔掉的所有東西記錄下來。如果它確實被扔掉了,我們確定會因為這個或那個而想知道它。不管它是一個令人厭惡的錯誤或是一個奇怪的包,都是欺騙。最后我們扔掉默認規則中的包。
FORWARD 鏈
我雖然沒在rc.firewall 例子文件中建立一個特別的塊,但是我將對其中的幾行加以評論。象現在這樣,我用下面這行接收來自我們局域網的所有包:
/usr/local/sbin/iptables -A FORWARD -i $LAN_IFACE -j ACCEPT
所以不管情況怎樣來自我們本地網接口的任何東西都被接收。之后我們接收來自任何地方具有ESTABLISHED 或RELATED狀態的任何東西,換句話說,如果我們打開一個從我們局域網到Internet上某個東西的連接,我們允許從那個站點回來的具有ESTABLISHED 或RELATED狀態的包。之后我們記錄所有的東西并丟棄它。我們每分鐘最多記錄3個日志記錄以防止日志文件溢出,加一個短前綴, 可做文件內的字符串查找。同樣我們也可以做調試級的記錄。我們最后會碰到FORWARD鏈的默認規則,丟棄所有東西。
其他例子
rc.DMZ.firewall.txt
你將在下書URL處找到這一腳本:rc.DMZ.firewall.txt
。這一腳本是為那些擁有一個可信賴的網絡、一個De-Militarized Zone 、一個Internet 連接的人。De-Militarized Zone 是1-to-1 NAT"ed ,需要你在防火墻上做一些IP別名,就是你必須使網絡設備認識來自多于一個IP的包。在這個指南的后面你將看到如何做IP別名(IP aliasing )的例子,現在 你還看不到什么實際的例子。從圖中你可以看出你需要2個內部網絡。一個使用的ip范圍是192.168.0.0/24 ,包括De-Militarized Zone。如果internet 上的某個人向我們的DNS_IP發送一個包,我們使用DNAT(Destination Network Adress Translation)將包發送到DMZ上的DNS 。當DNS 看到我們的包時,包將去向真正的DNS 內部網IP,而不是外部的DNS IP。如果包不被翻譯,DNS不應答包。DNAT 代碼如下面的例子:
$IPTABLES -t nat -A PREROUTING -p TCP -i $INET_IFACE -d $DNS_IP –dport 53 -j DNAT --to-destination $DMZ_DNS_IP
首先DNAT 只能在nat table的PREROUTING 鏈中執行。然后我們來看看擁有匹配$DNS_IP的目的IP的$INET_IFACE 上的TCP協議,被指向端口53,是DNS"s中地域傳送的TCP 端口。如果我們真得到了一個目的為DNAT的包,即Destination NAT。之后我們用--to-destination 選項規定想讓包去的地方,將它賦值$DMZ_DNS_IP,即我們DMZ上DNS 的IP。這就是DNAT 工作的基本原理。當對DNAT包的應答穿過防火墻,它自動被un-DNAT"ed。
現在你該知道一切是怎么工作的,能夠在較簡單的情況下地了解這個腳本了吧? 如果有什么你不了解,而且我的指南也沒講,那么請發郵件給我,因為那也許是我的錯誤。
沒有DCC的被動FTP , 感興趣的額外閱讀
這是關于2.4.x 內核的新iptables 支持的真正美好的部分之一,比如你可以允許被動的FTP 連接,但不允許DCC 發送帶有新狀態匹配代碼的函數。你可能會問自己如何做到,只要你想就很簡單。只要編譯內核中的ip_conntrack_irc 和ip_conntrack_ftp 模塊。這些模塊做的就是增加對conntrack 模塊的支持,使它可以識別一個被動的FTP 連接或一個DCC發送連接。比如你想允許一個被動的FTP連接而不允許DCC發送,你將加載ip_conntrack_ftp 模塊,而不是ip_conntrack_irc 模塊,然后做:
/usr/local/sbin/iptables -A INPUT -p TCP -m state --state RELATED –j ACCEPT
允許被動的FTP 而不允許DCC。如果你想做相反的,你就加載ip_conntrack_irc 模塊而不是ip_conntrack_ftp 模塊。
規定 NEW 信息包 但沒有 SYN 置位
iptables 有一個特點沒被很好的說明, 因而可能被許多人忽視。如果你使用狀態NEW,SYN 位沒置的包將穿過你的防火墻。有這個特點是因為特定情況下我們不認為一個包是另一個防火墻上已建立連接的一部分。這個特點使得有兩個或更多的防火墻成為可能。這個子網的防火墻將被我們的第二防火墻取代,狀態NEW 因此允許相當多的任何種類的TCP連接,不管這是否是三方握手(3-way handshake) 。為解決這個問題,我們向防火墻的INPUT, OUTPUT 和 FORWARD 鏈添加如下規則:
$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New not syn:"
$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP"
上述規則將解決這個問題。這是netfilter/iptables 計劃中文檔的嚴重問題,應該被提出。換句話說在你的防火墻上對此種行為應該發出嚴重警告。
使用賦值的 IP"s的奇怪的ISP"s
我增加了這個是因為我的一個朋友告訴我我幾乎忘光了的一件事,一些愚蠢的ISP"s為他們的本地網 使用用IANA 賦值的IP"s 。例如瑞典的ISP 和電話壟斷者Telia在他們的DNS 服務器上使用這種方法,使用10.x.x.x IP 范圍。你最可能遇到的問題是,在這個腳本中我們不允許任何在10.x.x.x范圍內的IP"s 到我們的連接,因為可能有欺騙。好,這有個例子,你在那些規則上的花些力氣。你可能在欺騙部分插入一個ACCEPT 規則,允許來自那些DNS 服務器的負載,或者你可以注釋那部分腳本。它看起來象這樣:
/usr/local/sbin/iptables -t nat -I PREROUTING -i eth1 -s 10.0.0.1/32 –j ACCEPT
我將咒罵這些ISP"s。這個范圍不是為你用來做填充的,至少在我的知識范圍內不是,對于大的公司站點更不是,或者對于你的家庭網絡,但你不能迫使我們開放自己只因為你的一些whince 。
更新并刷新你的表
如果你弄亂了你的iptables,有命令可以刷新它,你不必要重啟動。到現在為止我遇到這個問題好多次了,所以我想我將在這回答它。如果你錯誤地增加了一條規則,你可以在你加錯的那一行上將-A 參數改為-D,iptables 將發現錯誤行并替你抹去,萬一你有幾行看起來相同,它抹去它發現的與你的規則匹配的第一個實例。如果這不是你想要的行為,你就要試著使用-D 選項,iptables -D INPUT 10,將INPUT鏈中的第十條規則抹去。
還有你想刷新整個鏈的情況,這時你要執行-F 選項。比如iptables -F INPUT將抹去整個INPUT 鏈,雖然它不會改變默認規則。因此如果默認規則被置為“DROP” ,而且你想象上面一樣使用,則你要阻塞整個INPUT鏈,重置鏈規則,象你置“DROP”一樣做。例如iptables -P INPUT ACCEPT。
我做了一個小的腳本 (作為附錄)可以刷新并重置你的iptables,你在創建你的rc.firewall文件時可以考慮使用。還有一件事情,如果你在弄亂的表中變的混亂,這個腳本不會抹去它們,它只添加抹去它們需要的幾行,但在這我不添加它們,因為弄亂的表在我的rc.firewall 腳本中不使用。
其他的資源及連接
這是我獲得信息的一些連接:
system control via /proc etc
The official site of iptables and netfilter
The official netfilter FAQ
Rusty"s Unreliable Guide to packet filtering
Rusty"s Unreliable Guide to Network Address Translation
Rusty"s Unreliable Netfilter Hacking HOWTO
Netfilter user mailing-list
當然,還包括iptables 的原始資料,文檔及幫助我的人。
貢獻者
我感謝下面的人在我寫這篇文章時對我的幫助:
Fabrice Marie, 修改我的語法及拼寫. 感謝他將指南修改成 DocBook 格式并帶有 make files等等。
Marc Boucher, 在使用狀態匹配代碼上給予了我很大的幫助。
Frode E. Nyboe,完善了 rc.firewall 的規則,在我重寫ruleset時給了我很大靈感,使我引入了在同一文件中使用多重表格的方法。*
Chapman Brad, Alexander W. Janssen, 他們使我認識到,我在想包如何以它們顯示的順序穿過基本的 NAT和 filters tables時最初是想錯了。
Michiel Brandenburg, Myles Uyema,幫助我書寫一些狀態匹配代碼并使它們工作。
Kent `Artech" Stahre, 幫助我從繪圖的煩瑣工作中解脫出來,我知道我熱中于繪圖,但是你是我所知道的繪圖最好的人,還感謝你幫我檢查指南的錯誤。
Jeremy `Spliffy" Smith, 感謝在可能擾亂人的素材上給我以暗示,感謝嘗試它并檢查我寫的東西的錯誤。
還有所有我曾經談過話、向他們詢問過建議的朋友。
例子 rc.firewall <>
#!/bin/sh
#
# rc.firewall - Initial SIMPLE IP Firewall test script for 2.4.x
#
# Author: Oskar Andreasson
# (c) of BoingWorld.com, use at your own risk, do whatever you please
with
# it as long as you don"t distribute this without due credits to
# BoingWorld.com
#
###########
# Configuration options, these will speed you up getting this script to
# work with your own setup.
#
# your LAN"s IP range and localhost IP. /24 means to only use the first
24
# bits of the 32 bit IP adress. the same as netmask 255.255.255.0
#
# STATIC_IP is used by me to allow myself to do anything to myself,
might
# be a security risc but sometimes I want this. If you don"t have a
static
# IP, I suggest not using this option at all for now but it"s stil
# enabled per default and will add some really nifty security bugs for
all
# those who skips reading the documentation=)
LAN_IP_RANGE="192.168.0.0/24"
LAN_IP="192.168.0.2/32"
LAN_BCAST_ADRESS="192.168.0.255/32"
LOCALHOST_IP="127.0.0.1/32"
STATIC_IP="194.236.50.155/32"
INET_IFACE="eth0"
LAN_IFACE="eth1"
IPTABLES="/usr/local/sbin/iptables"
#########
# Load all required IPTables modules
#
#
# Needed to initially load modules
#
/sbin/depmod -a
#
# Adds some iptables targets like LOG, REJECT and MASQUARADE.
#
/sbin/modprobe ipt_LOG
#/sbin/modprobe ipt_REJECT
/sbin/modprobe ipt_MASQUERADE
#
# Support for owner matching
#
#/sbin/modprobe ipt_owner
#
# Support for connection tracking of FTP and IRC.
#
#/sbin/modprobe ip_conntrack_ftp
#/sbin/modprobe ip_conntrack_irc
#
# Enable ip_forward, this is critical since it is turned off as defaul
in Linux.
#
echo "1" > /proc/sys/net/ipv4/ip_forward
#
# Dynamic IP users:
#
#echo "1" > /proc/sys/net/ipv4/ip_dynaddr
#
# Enable simple IP Forwarding and Masquerading
#
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE
#
# Bad TCP packets we don"t want
#
$IPTABLES -A FORWARD -p tcp ! --syn -m state --state NEW -j LOG
--log-prefix "New not syn:"
$IPTABLES -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP"
#
# Aclearcase/" target="_blank" >ccept the packets we actually want to forward
#
$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG
--log-level DEBUG --log-prefix "IPT FORWARD packet died: "
#
# Set default policies for the INPUT, FORWARD and OUTPUT chains
#
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
#
# Create separate chains for ICMP, TCP and UDP to traverse
#
$IPTABLES -N icmp_packets
$IPTABLES -N tcp_packets
$IPTABLES -N udpincoming_packets
#
# The allowed chain for TCP connections
#
$IPTABLES -N allowed
$IPTABLES -A allowed -p TCP --syn -j ACCEPT
$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j
ACCEPT
$IPTABLES -A allowed -p TCP -j DROP
#
# ICMP rules
#
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 0 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 3 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 5 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT
#
# TCP rules
#
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 21 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 22 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 80 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 113 -j allowed
#
# UDP ports
#
$IPTABLES -A udpincoming_packets -p UDP -s 0/0 --source-port 53 -j
ACCEPT
$IPTABLES -A udpincoming_packets -p UDP -s 0/0 --source-port 123 -j
ACCEPT
$IPTABLES -A udpincoming_packets -p UDP -s 0/0 --source-port 2074 -j
ACCEPT
$IPTABLES -A udpincoming_packets -p UDP -s 0/0 --source-port 4000 -j
ACCEPT
#
# PREROUTING chain.
#
# Do some checks for obviously spoofed IP"s
#
$IPTABLES -t nat -A PREROUTING -i $INET_IFACE -s 192.168.0.0/16 -j DROP
$IPTABLES -t nat -A PREROUTING -i $INET_IFACE -s 10.0.0.0/8 -j DROP
$IPTABLES -t nat -A PREROUTING -i $INET_IFACE -s 172.16.0.0/12 -j DROP
#
# INPUT chain
#
# Take care of bad TCP packets that we don"t want
#
$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j LOG
--log-prefix "New not syn:"
$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP"
#
# Rules for incoming packets from the internet
#
$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets
$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j tcp_packets
$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j udpincoming_packets
#
# Rules for special networks not part of the Internet
#
$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -d $LAN_BCAST_ADRESS -j ACCEPT
$IPTABLES -A INPUT -p ALL -d $LOCALHOST_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -d $LAN_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -d $STATIC_IP -m state --state
ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG
--log-level DEBUG --log-prefix "IPT INPUT packet died: "
#
# OUTPUT chain
#
$IPTABLES -A OUTPUT -p tcp ! --syn -m state --state NEW -j LOG
--log-prefix "New not syn:"
$IPTABLES -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP"
$IPTABLES -A OUTPUT -p ALL -s $LOCALHOST_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $STATIC_IP -j ACCEPT
$IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG
--log-level DEBUG --log-prefix "IPT OUTPUT packet died: "
例子 rc.DMZ.firewall <>
#!/bin/sh
#
# rc.DMZ.firewall - DMZ IP Firewall script for Linux 2.4.x
#
# Author: Oskar Andreasson
# (c) of BoingWorld.com, use at your own risk, do whatever you please
with
# it as long as you don"t distribute this without due credits to
# BoingWorld.com
#
###########
# Configuration options, these will speed you up getting this script to
# work with your own setup.
#
# your LAN"s IP range and localhost IP. /24 means to only use the first
24
# bits of the 32 bit IP adress. the same as netmask 255.255.255.0
#
# STATIC_IP is used by me to allow myself to do anything to myself,
might
# be a security risc but sometimes I want this. If you don"t have a
static
# IP, I suggest not using this option at all for now but it"s stil
# enabled per default and will add some really nifty security bugs for
all
# those who skips reading the documentation=)
LAN_IP_RANGE="192.168.0.0/24"
LAN_IP="192.168.0.2/32"
LAN_BCAST_ADRESS="192.168.0.255/32"
LAN_IFACE="eth1"
INET_IP="194.236.50.152/32"
INET_IFACE="eth0"
HTTP_IP="194.236.50.153/32"
DNS_IP="194.236.50.154/32"
DMZ_HTTP_IP="192.168.1.2/32"
DMZ_DNS_IP="192.168.1.3/32"
DMZ_IP="192.168.1.1/32"
DMZ_IFACE="eth2"
LO_IP="127.0.0.1/32"
LO_IFACE="127.0.0.1/32"
IPTABLES="/usr/local/sbin/iptables"
###########################################
#
# Load all required IPTables modules
#
#
# Needed to initially load modules
#
/sbin/depmod -a
#
# Adds some iptables targets like LOG, REJECT and MASQUARADE.
#
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_MASQUERADE
#
# Support for connection tracking of FTP and IRC.
#
#/sbin/modprobe ip_conntrack_ftp
#/sbin/modprobe ip_conntrack_irc
#CRITICAL: Enable IP forwarding since it is disabled by default.
#
echo "1" > /proc/sys/net/ipv4/ip_forward
#
# Dynamic IP users:
#
#echo "1" > /proc/sys/net/ipv4/ip_dynaddr
###########################################
#
# Chain Policies gets set up before any bad packets gets through
#
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
#
# the allowed chain for TCP connections, utilized in the FORWARD chain
#
$IPTABLES -N allowed
$IPTABLES -A allowed -p TCP --syn -j ACCEPT
$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j
ACCEPT
$IPTABLES -A allowed -p TCP -j DROP
#
# ICMP rules, utilized in the FORWARD chain
#
$IPTABLES -N icmp_packets
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 0 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 3 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 5 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT
###########################################
# POSTROUTING chain in the nat table
#
# Enable IP SNAT for all internal networks trying to get out on the
Internet
#
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source
$INET_IP
###########################################
# PREROUTING chain in the nat table
#
# Do some checks for obviously spoofed IP"s
#
$IPTABLES -t nat -A PREROUTING -i $INET_IFACE -s 192.168.0.0/16 -j DROP
$IPTABLES -t nat -A PREROUTING -i $INET_IFACE -s 10.0.0.0/8 -j DROP
$IPTABLES -t nat -A PREROUTING -i $INET_IFACE -s 172.16.0.0/12 -j DROP
$IPTABLES -t nat -A PREROUTING -i $INET_IFACE -s $INET_IP -j DROP
#
# Enable IP Destination NAT for DMZ zone
#
$IPTABLES -t nat -A PREROUTING -p TCP -i $INET_IFACE -d $HTTP_IP --dport
80 -j DNAT --to-destination $DMZ_HTTP_IP
$IPTABLES -t nat -A PREROUTING -p TCP -i $INET_IFACE -d $DNS_IP --dport
53 -j DNAT --to-destination $DMZ_DNS_IP
$IPTABLES -t nat -A PREROUTING -p UDP -i $INET_IFACE -d $DNS_IP --dport
53 -j DNAT --to-destination $DMZ_DNS_IP
###########################################
#
# FORWARD chain
#
# Get rid of bad TCP packets
#
$IPTABLES -A FORWARD -p tcp ! --syn -m state --state NEW -j LOG
--log-prefix "New not syn:"
$IPTABLES -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP
#
# DMZ section
#
# General rules
#
$IPTABLES -A FORWARD -i $DMZ_IFACE -o $INET_IFACE -j ACCEPT
$IPTABLES -A FORWARD -i $INET_IFACE -o $DMZ_IFACE -m state --state
ESTABLISHED,RELATED -j ACCEPTED
#
# HTTP server
#
$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $DMZ_IFACE -d $DMZ_HTTP_IP
--dport 80 -j allowed
$IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $DMZ_IFACE -d DMZ_HTTP_IP
-j icmp_packets
#
# DNS server
#
$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $DMZ_IFACE -d $DMZ_DNS_IP
--dport 53 -j allowed
$IPTABLES -A FORWARD -p UDP -i $INET_IFACE -o $DMZ_IFACE -d $DMZ_DNS_IP
--dport 53 -j ACCEPT
$IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $DMZ_IFACE -d $DMZ_DNS_IP
-j icmp_packets
#
# LAN section
#
$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
#
# LOG all packets reaching here
#
$IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG
--log-level DEBUG --log-prefix "IPT FORWARD packet died: "
###########################################################
#
# Firewall rules
# Rules applying to the firewall box
#
#
# INPUT chain
#
# Get rid of bad packets
#
$IPTABLES -A FORWARD -p tcp ! --syn -m state --state NEW -j LOG
--log-prefix "New not syn:"
$IPTABLES -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP
#
# Packets from the Internet to this box
#
$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets
#
# Packets from LAN, DMZ or LOCALHOST
#
# From DMZ Interface to DMZ firewall IP
$IPTABLES -A INPUT -p ALL -i $DMZ_IFACE -d $DMZ_IP -j ACCEPT
# From LAN Interface to LAN firewall IP
$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -d $LAN_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -d $LAN_BCAST_ADRESS -j ACCEPT
# From Localhost interface to Localhost IP
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -d $LO_IP -j ACCEPT
# All established and related packets incoming from the internet to the
firewall
$IPTABLES -A INPUT -p ALL -d $INET_IP -m state --state
ESTABLISHED,RELATED -j ACCEPT
# Logging rule
$IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG
--log-level DEB
###########################################################
#
# OUTPUT chain
#
#
# Get rid of bad TCP packets
#
$IPTABLES -A FORWARD -p tcp ! --syn -m state --state NEW -j LOG
--log-prefix "New not syn:"
$IPTABLES -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP
#
# Allow ourself to send packets not spoofed everywhere
#
$IPTABLES -A OUTPUT -p ALL -d $LO_IFACE -s $LO_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -d $LAN_IP-s $LAN_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -d $INET_IFACE -s $INET_IP -j ACCEPT
#
# Logging rule
#
$IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG
--log-level DEBUG --log-prefix "IPT OUTPUT packet died: "
刷新規則
#!/bin/sh
#
# Resets the iptables to default values, in case you screw something up
# while setting your rc.firewall up - as I did quite a few times;)
#
# Author: Oskar Andreasson
# (c) of BoingWorld.com, use at your own risk, do whatever you please
with
# it as long as you don"t distribute this with due credits to
# BoingWorld.com
#
# reset the default policies in the filter table.
#
/usr/local/sbin/iptables -P INPUT ACCEPT
/usr/local/sbin/iptables -P FORWARD ACCEPT
/usr/local/sbin/iptables -P OUTPUT ACCEPT
#
# reset the default policies in the nat table.
#
/usr/local/sbin/iptables -t nat -P PREROUTING ACCEPT
/usr/local/sbin/iptables -t nat -P POSTROUTING ACCEPT
/usr/local/sbin/iptables -t nat -P OUTPUT ACCEPT
#
# flush all the rules in the filter and nat tables.
#
/usr/local/sbin/iptables -F
/usr/local/sbin/iptables -t nat -F
#
# erase all chains that"s not default in filter and nat table.
#
/usr/local/sbin/iptables -X
/usr/local/sbin/iptables -t nat -X