『壹』 急!!!利用 iptables 實現 linux 防火牆功能有關問題
自己看:
什麼是Iptables?
iptables 是建立在 netfilter 架構基礎上的一個包過濾管理工具,最主要的作用是用來做防火牆或透明代理。Iptables 從 ipchains 發展而來,它的功能更為強大。Iptables 提供以下三種功能:包過濾、NAT(網路地址轉換)和通用的 pre-route packet mangling。包過濾:用來過濾包,但是不修改包的內容。Iptables 在包過濾方面相對於 ipchians 的主要優點是速度更快,使用更方便。NAT:NAT 可以分為源地址 NAT 和目的地址 NAT。
Iptables 可以追加、插入或刪除包過濾規則。實際上真正執行這些過慮規則的是 netfilter 及其相關模塊(如 iptables 模塊和 nat 模塊)。Netfilter 是 Linux 核心中一個通用架構,它提供了一系列的 「表」(tables),每個表由若干 「鏈」(chains)組成,而每條鏈中可以有一條或數條 「規則」(rule)組成。
系統預設的表為 「filter」,該表中包含了 INPUT、FORWARD 和 OUTPUT 3 個鏈。
每一條鏈中可以有一條或數條規則,每一條規則都是這樣定義的:如果數據包頭符合這樣的條件,就這樣處理這個數據包。當一個數據包到達一個鏈時,系統就會從第一條規則開始檢查,看是否符合該規則所定義的條件: 如果滿足,系統將根據該條規則所定義的方法處理該數據包;如果不滿足則繼續檢查下一條規則。最後,如果該數據包不符合該鏈中任一條規則的話,系統就會根據該鏈預先定義的策略來處理該數據包。
? table,chain,rule
iptables 可以操縱3 個表:filter 表,nat 表,mangle 表。
NAT 和一般的 mangle 用 -t 參數指定要操作哪個表。filter 是默認的表,如果沒有 -t 參數,就默認對 filter 表操作。
Rule 規則:過濾規則,埠轉發規則等,例如:禁止任何機器 ping 我們的伺服器,可以在伺服器上設置一條規則:
iptables -A INPUT -s ! 127.0.0.1 -p icmp -j DROP
從 –s 開始即是一條規則,-j 前面是規則的條件,-j 開始是規則的行為(目的)。整條命令解釋為,在filter 表中的 INPUT 規則鏈中插入一條規則,所有源地址不為 127.0.0.1 的 icmp 包都被拋棄。
Chain 規則鏈:由一系列規則組成,每個包順序經過 chain 中的每一條規則。chain 又分為系統 chain和用戶創建的 chain。下面先敘述系統 chain。
filter 表的系統 chain: INPUT,FORWAD,OUTPUT
nat 表的系統 chain: PREROUTING,POSTROUTING,OUTPUT
mangle 表的系統 chain: PREROUTING,OUTPUT
每條系統 chain 在確定的位置被檢查。比如在包過濾中,所有的目的地址為本地的包,則會進入INPUT 規則鏈,而從本地出去的包會進入 OUTPUT 規則鏈。
所有的 table 和 chain 開機時都為空,設置 iptables 的方法就是在合適的 table 和系統 chain 中添相應的規則。
--------------------------------------------------------------
IPTABLES 語法:
表: iptables從其使用的三個表(filter、nat、mangle)而得名, 對包過濾只使用 filter 表, filter還是默認表,無需顯示說明.
操作命令: 即添加、刪除、更新等。
鏈:對於包過濾可以針對filter表中的INPUT、OUTPUT、FORWARD鏈,也可以操作用戶自定義的鏈。
規則匹配器:可以指定各種規則匹配,如IP地址、埠、包類型等。
目標動作:當規則匹配一個包時,真正要執行的任務,常用的有:
ACCEPT 允許包通過
DROP 丟棄包
一些擴展的目標還有:
REJECT 拒絕包,丟棄包同時給發送者發送沒有接受的通知
LOG 包有關信息記錄到日誌
TOS 改寫包的TOS值
為使FORWARD規則能夠生效,可使用下面2種方法的某種:
[root@rhlinux root]# vi /proc/sys/net/ipv4/ip_forward
[root@rhlinux root]# echo "1" > /proc/sys/net/ipv4/ip_forward
[root@rhlinux root]# vi /etc/sysconfig/network
[root@rhlinux root]# echo "FORWARD_IPV4=true" > /etc/sysconfig/network
--------------------------------------------------------
iptables語法可以簡化為下面的形式:
iptables [-t table] CMD [chain] [rule-matcher] [-j target]
--------------------------------------------------------
常用操作命令:
-A 或 -append 在所選鏈尾加入一條或多條規則
-D 或 -delete 在所選鏈尾部刪除一條或者多條規則
-R 或 -replace 在所選鏈中替換一條匹配規則
-I 或 -insert 以給出的規則號在所選鏈中插入一條或者多條規則. 如果規則號為1,即在鏈頭部.
-L 或 -list 列出指定鏈中的所有規則,如果沒有指定鏈,將列出鏈中的所有規則.
-F 或 -flush 清除指定鏈和表中的所由規則, 假如不指定鏈,那麼所有鏈都將被清空.
-N 或 -new-chain 以指定名創建一條新的用戶自定義鏈,不能與已有鏈名相同.
-X 或 -delete-chain 刪除指定的用戶定義簾,必需保證鏈中的規則都不在使用時才能刪除,若沒有指定鏈,則刪除所有用戶鏈.
-P 或 -policy 為永久簾指定默認規則(內置鏈策略),用戶定義簾沒有預設規則,預設規則也使規則鏈中的最後一條規則,用-L顯示時它在第一行顯示.
-C 或 -check 檢查給定的包是否與指定鏈的規則相匹配.
-Z 或 -zero 將指定簾中所由的規則包位元組(BYTE)計數器清零.
-h 顯示幫助信息.
-------------------------------------------------------------
常用匹配規則器:
-p , [!] protocol 指出要匹配的協議,可以是tcp, udp, icmp, all, 前綴!為邏輯非,表示除該協議外的所有協議.
-s [!] address[/mask] 指定源地址或者地址范圍.
-sport [!] port[:port] 指定源埠號或范圍,可以用埠號也可以用/ETC/SERVICES文件中的名子.
-d [!] address[/mask] 指定目的地址或者地址范圍.
-dport [!] port[:port] 指定目的埠號或范圍,可以用埠號也可以用/ETC/SERVICES文件中的名子.
-icmp-type [!] typename 指定匹配規則的ICMP信息類型(可以使用 iptables -p icmp -h 查看有效的ICMP類型名)
-i [!] interface name[+] 匹配單獨或某種類型的介面,此參數忽略時,默認符合所有介面,介面可以使用"!"來匹配捕食指定介面來的包.參數interface是介面名,如 eth0, eht1, ppp0等,指定一個目前不存在的介面是完全合法的,規則直到介面工作時才起作用,折中指定對於PPP等類似連接是非常有用的."+"表示匹配所有此類型介面.該選項只針對於INPUT,FORWARD和PREROUTING鏈是合法的.
-o [!] interface name[+] 匹配規則的對外網路介面,該選項只針對於OUTPUT,FORWARD,POSTROUTING鏈是合法的.
[!] --syn 僅僅匹配設置了SYN位, 清除了ACK, FIN位的TCP包. 這些包表示請求初始化的TCP連接.阻止從介面來的這樣的包將會阻止外來的TCP連接請求.但輸出的TCP連接請求將不受影響.這個參數僅僅當協議類型設置為了TCP才能使用. 此參數可以使用"!"標志匹配已存在的返回包,一般用於限制網路流量,即只允許已有的,向外發送的連接所返回的包.
----------------------------------------------------------
如何制定永久規則集:
/etc/sysconfig/iptables 文件是 iptables 守護進程調用的默認規則集文件.
可以使用以下命令保存執行過的IPTABLES命令:
/sbin/iptables-save > /etc/sysconfig/iptables
要恢復原來的規則庫,可以使用:
/sbin/iptables-restore < /etc/sysconfig/iptables
iptables命令和route等命令一樣,重啟之後就會恢復,所以:
[root@rhlinux root]# service iptables save
將當前規則儲存到 /etc/sysconfig/iptables: [ 確定 ]
令一種方法是 /etc/rc.d/init.d/iptables 是IPTABLES的啟動腳本,所以:
[root@rhlinux root]# /etc/rc.d/init.d/iptables save
將當前規則儲存到 /etc/sysconfig/iptables: [ 確定 ]
以上幾種方法只使用某種即可.
若要自定義腳本,可直接使用iptables命令編寫一個規則腳本,並在啟動時執行:
例如若規則使用腳本文件名/etc/fw/rule, 則可以在/etc/rc.d/rc.local中加入以下代碼:
if [-x /etc/fw/rule]; then /etc/fw/sule; fi;
這樣每次啟動都執行該規則腳本,如果用這種方法,建議NTSYSV中停止IPTABLES.
----------------------------------------------------------
實例:
鏈基本操作:
[root@rh34 root]# iptables -L -n
(列出表/鏈中的所有規則,包過濾防火牆默認使用的是filter表,因此使用此命令將列出filter表中所有內容,-n參數可加快顯示速度,也可不加-n參數。)
[root@rh34 root]# iptables -F
(清除預設表filter中所有規則鏈中的規則)
[root@rh34 root]# iptables -X
(清除預設表filter中使用者自定義鏈中的規則)
[root@rh34 root]# iptables -Z
(將指定鏈規則中的所有包位元組計數器清零)
------------------------------------------------------------
設置鏈的默認策略,默認允許所有,或者丟棄所有:
[root@rh34 root]# iptables -P INPUT ACCEPT
[root@rh34 root]# iptables -P OUTPUT ACCEPT
[root@rh34 root]# iptables -P FORWARD ACCEPT
(以上我們在不同方向設置默認允許策略,若丟棄則應是DROP,嚴格意義上防火牆應該是DROP然後再允許特定)
---------------------------------------------------------------
向鏈中添加規則,下面的例子是開放指定網路介面(信任介面時比較實用):
[root@rh34 root]# iptables -A INPUT -i eth1 -j ACCEPT
[root@rh34 root]# iptables -A OUTPUT -o eth1 -j ACCEPT
[root@rh34 root]# iptables -A FORWARD -i eth1 -j ACCEPT
[root@rh34 root]# iptables -A FORWARD -o eth1 -j ACCEPT
--------------------------------------------------------------
使用用戶自定義鏈:
[root@rh34 root]# iptables -N brus
(創建一個用戶自定義名叫brus的鏈)
[root@rh34 root]# iptables -A brus -s 0/0 -d 0/0 -p icmp -j DROP
(在此鏈中設置了一條規則)
[root@rh34 root]# iptables -A INPUT -s 0/0 -d 0/0 -j brus
(向默認的INPUT鏈添加一條規則,使所有包都由brus自定義鏈處理)
----------------------------------------------------------------
基本匹配規則實例:
匹配協議:
iptables -A INPUT -p tcp
(指定匹配協議為TCP)
iptables -A INPUT -p ! tcp
(指定匹配TCP以外的協議)
匹配地址:
iptables -A INPUT -s 192.168.1.1
(匹配主機)
iptables -A INPUT -s 192.168.1.0/24
(匹配網路)
iptables -A FORWARD -s ! 192.168.1.1
(匹配以外的主機)
iptables -A FORWARD -s ! 192.168.1.0/24
(匹配以外的網路)
匹配介面:
iptables -A INPUT -i eth0
iptables -A FORWARD -o eth0
(匹配某個指定的介面)
iptables -A FORWARD -o ppp+
(匹配所有類型為ppp的介面)
匹配埠:
iptables -A INPUT -p tcp --sport www
iptables -A INPUT -p tcp --sport 80
(匹配單一指定源埠)
iptables -A INPUT -p ucp --dport 53
(匹配單一指定目的埠)
iptables -A INPUT -p ucp --dport ! 53
(指定埠以外)
iptables -A INPUT -p tcp --dport 22:80
(指定埠范圍,這里我們實現的是22到80埠)
---------------------------------------------------------------------------------
指定IP碎片的處理:
[root@rh34 root]# iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.1.234 --dport 80 -j ACCEPT
[root@rh34 root]# iptables -A FORWARD -f -p tcp -s 192.168.1.0/24 -d 192.168.1.234 --dport 80 -j ACCEPT
[root@rh34 root]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.1.0/24 192.168.1.234 tcp dpt:http
ACCEPT tcp -f 192.168.1.0/24 192.168.1.234 tcp dpt:http
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
----------------------------------------------------------------------------------
設置擴展的規測匹配:
(希望獲得匹配的簡要說明,可使用: iptables -m name_of_match --help)
多埠匹配擴展:
iptables -A INPUT -p tcp -m multiport --source-port 22,53,80
(匹配多個源埠)
iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80
(匹配多個目的埠)
iptables -A INPUT -p tcp -m multiport --port 22,53,80
(匹配多個埠,無論是源還是目的埠)
-----------------------------------------------------------------------------
TCP匹配擴展:
iptables -A INPUT -p tcp --tcp-flags SYN,FIN,ACK SYN
(表示SYN、ACK、FIN的標志都要被檢查,但是只有設置了SYN的才匹配)
iptables -A INPUT -p tcp --tcp-flags ALL SYN,ACK
(表示ALL:SYN、ACK、FIN、RST、URG、PSH的標志都被檢查,但是只有設置了SYN和ACK的才匹配)
iptables -p tcp --syn
(選項--syn是以上的一種特殊情況,相當於「--tcp-flags SYN,RST,ACK SYN」的簡寫)
--------------------------------------------------------------------------------
limit速率匹配擴展:
[root@redhatlinux9 root]# iptables -A FORWARD -m limit --limit 300/hour
(表示限制每小時允許通過300個數據包)
[root@redhatlinux9 root]# iptables -A INPUT -m limit --limit-burst 10
(--limit-burst指定觸發時間的值(默認為5),用來比對瞬間大量數據包的數量。)
(上面的例子用來比對一次同時湧入的數據包是否超過十個,超過此上限的包將直接被丟棄)
[root@redhatlinux9 root]# iptables -A FORWARD -p icmp -m limit --limit 3/m --limit-burst 3
(假設均勻通過,平均每分鍾3個,那麼觸發值burst保持為3。如果每分鍾通過的包的數目小於3,那麼觸發值busrt將在每個周期(若每分鍾允許通過3個,則周期數為20秒)後加1,但最大值為3。每分鍾要通過的包數量如果超過3,那麼觸發值busrt將減掉超出的數值,例如第二分鍾有4個包,那麼觸發值變為2,同時4個包都可以通過,第三分鍾有6個包,則只能通過5個,觸發值busrt變為0。之後,每分鍾如果包數量小於等於3個,則觸發值busrt將加1,如果每分鍾包數大於3,觸發值busrt將逐漸減少,最終維持為0)
(即每分鍾允許的最大包數量等於限制速率(本例中為3)加上當前的觸發值busrt數。任何情況下,都可以保證3個包通過,觸發值busrt相當於是允許額外的包數量)
---------------------------------------------------------------------------------
基於狀態的匹配擴展(連接跟蹤):
每個網路連接包括以下信息:源和目的地址、源和目的埠號,稱為套接字對(cocket pairs);協議類型、連接狀態(TCP協議)和超時時間等。防火牆把這些叫做狀態(stateful)。能夠監測每個連接狀態的防火牆叫做狀態寶過濾防火牆,除了能完成普通包過濾防火牆的功能外,還在自己的內存中維護一個跟蹤連接狀態的表,所以擁有更大的安全性。
其命令格式如下:
iptables -m state --state [!] state [,state,state,state]
state表示一個用逗號隔開的的列表,用來指定的連接狀態可以有以下4種:
NEW:該包想要開始一個連接(重新連接或將連接重定向)。
RELATED:該包屬於某個已經建立的連接所建立的新連接。例如FTP的數據傳輸連接和控制連接之間就是RELATED關系。
ESTABLISHED:該包屬於某個已經建立的連接。
INVALID:該包不匹配於任何連接,通常這些包會被DROP。
例如:
[root@redhatlinux9 root]# iptables -A INPUT -m state --state RELATED,ESTABLISHED
(匹配已經建立的連接或由已經建立的連接所建立的新連接。即匹配所有的TCP回應包)
[root@redhatlinux9 root]# iptables -A INPUT -m state --state NEW -i ! eth0
(匹配所有從非eth0介面來的連接請求包)
下面是一個被動(Passive)FTP連接模式的典型連接跟蹤
[root@redhatlinux9 root]# iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT
[root@redhatlinux9 root]# iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT
下面是一個主動(Active)FTP連接模式的典型連接跟蹤
[root@redhatlinux9 root]# iptables -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@redhatlinux9 root]# iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
--------------------------------------------------------------------------------------
日誌記錄:
格式為: -j LOG --log-level 7 --log-prefix "......"
[root@redhatlinux9 root]# iptables -A FORWARD -m tcp -p tcp -j LOG
[root@redhatlinux9 root]# iptables -A FORWARD -m icmp -p icmp -f -j LOG
[root@redhatlinux9 root]# iptables -A FORWARD -s 192.168.1.0/24 -d 10.10.10.0/24 -p tcp --sport 80 -j LOG
[root@redhatlinux9 root]# iptables -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-prefix "INPUT packet died:"
[root@redhatlinux9 root]# iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New net syn:"
------------------------------------------------
回答你的問題:
1:設置為DROP默認不允許,然後你再開啟,這樣比門戶大開再阻止某些服務來的安全(避免遺漏)
2:前面阻止了後面就無效了,有先後順序的.
3:你了解了服務和埠號等即可用規則限制.
『貳』 如果要禁掉所有UDP埠 iptables里怎麼配
新建DWORD值:SMBDeviceEnabled
設為0
關閉自己的139埠,ipc和RPC漏洞存在於此。
關閉139埠的方法是在「網路和撥號連接」中「本地連接」中選取「Internet協議(TCP/IP)」屬性,進入「高級TCP/IP設置」「WinS設置」裡面有一項「禁用TCP/IP的NETBIOS」,打沒族勾就關閉了139埠。
同時也關閉了UDP137、138埠。
關閉Windows默認埠139、445等 —closeport.bat的使用說明
自從Windows2000以來,Windows系統增強了網路服務功能,這同時也降低了安全性,各種蠕蟲病毒一波波的肆虐,Windows的網路安全為人們所詬病。
網路本來是一個歡樂繽紛的五彩樂園,但是安全問題使美好的網路蒙上了陰影,使人們小心翼翼如履薄冰,難以在網路上自由順暢的呼吸,網路成為許多用戶心中難舍的痛難解的結。
造成這種結果的主要原因是是windows系統默認開啟了一些網路功能開啟一些埠,從而置廣大用戶於危地。
這些功能用戶一般用不到,反而成為了重要的安全隱患,給了蠕蟲和駭客們可乘之機,成為他們大顯身手的樂土。
人們不得求助於防火牆、助手和補丁等等莫名其妙烏七八糟的東西,把一切搞得越來越復雜,因為它們往往給你帶來更多的煩惱。
其實,把Windows的一些默認埠關掉,就可以解決絕大部分的問題。
這兩天,研究了一下埠的問枯悄弊題。寫了一個腳本用來關掉這些默認埠,後面有解釋,我的理解不一定正確,其中或有不當之處,歡迎各位批評指正。
這個腳本我在Windows 2003 Server上測試通過,在WinXP和Win2000上面應該也能適用。
[使用說明]
將以下代碼復制下來,存為closeport.bat(注意,每個命令應該在一行中)。
運行closeport,重啟計算機即可。cmd下運行netstat -an,你會發現相應的埠都已經停止了。
如果希望打開所有埠,運行closeport -o,重啟計算機即可。
你可以自己將腳本中你不希望的功能命令掉,然後再運行它。
[注意事項]
1.運行本程序前,最好手工停用DCOM。
方法如下,利用Windows NT/2000/XP標准集成的「dcomcnfg.exe」工具。從命令行執行,打開分布式COM屬性窗口,取消「在這台計算機上啟用分布式COM」選項即可。(Window 2000\XP\2003 的配運胡置對話框有所不同)。
雖然,這個腳本可以停用DCOM,但是它是通過修改注冊表的鍵值。我不知道效果是否與之相同。
2.重啟計算機後,出現過TCP/IP Driver不能啟動。因此無法上網的情況。
如果遇到這種情況。請在「設備管理器」中,選擇顯示隱藏的設備,按連接查看設備,找到TCP/IP protocol driver,在驅動程序頁面設置為自動。重啟計算機即可。
3.本腳本完全沒有任何擔保,請慎重使用。最好閱讀後面的解釋。你可以更好的了解和定製使用它。
================================
@ echo off
rem
rem closeport.bat version 0.2
rem by Spirituel@SMTH
rem
rem This file close the default ports of Windows.
rem Why and how to use it, please conct to the README.txt.
rem I tested it on Windows 2003 Server. And it should work on WindowsXP and windows2000 as well.
rem If you understand it and find some error, you can describe it clearly and contact with me.
rem Corrections are welcome.
rem NOTICE: NO WARRANTY totally. Please use it carefully.
echo Close the default ports of Windows system.
echo [usage] Use the parameter -o to open the ports again.
echo You can change the file to customize them for yourself.
if "%1"=="-o" goto :open
@ rem -----------------------------------------------
@ rem disable some services, you can add "rem" on the command if you do not want it effects
echo on
@ rem disable the NetBT(NetBios over tcp/ip) device driver, close port TCP139/UDP137/UDP138/TCP445
reg add "HKLM\SYSTEM\CurrentControlSet\Services\NetBT" /v Start /t REG_DWORD /d 0x4 /f
@ rem disable the LmHosts(TCP/IP NetBIOS Helper) device driver, it depends on NetBT
reg add "HKLM\SYSTEM\CurrentControlSet\Services\LmHosts" /v Start /t REG_DWORD /d 0x4 /f
@ rem disable the lanmanserver(server) service, stop IPC$ net share
reg add "HKLM\SYSTEM\CurrentControlSet\Services\lanmanserver" /v Start /t REG_DWORD /d 0x4 /f
@ rem disable the dfs(Distribute File System) service, it depends on server
reg add "HKLM\SYSTEM\CurrentControlSet\Services\Dfs" /v Start /t REG_DWORD /d 0x4 /f
@ rem disable the Browser(Computer Browser) service, it depends on server
reg add "HKLM\SYSTEM\CurrentControlSet\Services\Browser" /v Start /t REG_DWORD /d 0x4 /f
@ rem disable the W32Time(Windows Timer) service, close port UDP123
reg add "HKLM\SYSTEM\CurrentControlSet\Services\W32Time" /v Start /t REG_DWORD /d 0x4 /f
@ rem disable the TermService(Terminal Services) service, its default port is TCP3389
reg add "HKLM\SYSTEM\CurrentControlSet\Services\TermService" /v Start /t REG_DWORD /d 0x4 /f
@ rem disable DCOM
reg add "HKLM\SOFTWARE\Microsoft\Ole" /v EnableDCOM /t REG_SZ /d N /f
goto :end
:open
@ rem -----------------------------------------------
@ rem enable some services, you can add "rem" on the command if you do not want it effects
echo on
@ rem enable the NetBT(NetBios over tcp/ip) device driver, port TCP139/UDP137/UDP138/TCP445
reg add "HKLM\SYSTEM\CurrentControlSet\Services\NetBT" /v Start /t REG_DWORD /d 0x1 /f
@ rem enable the LmHosts(TCP/IP NetBIOS Helper) device driver, it depends on NetBT
reg add "HKLM\SYSTEM\CurrentControlSet\Services\LmHosts" /v Start /t REG_DWORD /d 0x2 /f
@ rem enable the lanmanserver(server) service, stop IPC$ net share
reg add "HKLM\SYSTEM\CurrentControlSet\Services\lanmanserver" /v Start /t REG_DWORD /d 0x2 /f
@ rem enable the dfs(Distribute File System) service, it depends on server
reg add "HKLM\SYSTEM\CurrentControlSet\Services\Dfs" /v Start /t REG_DWORD /d 0x2 /f
@ rem enable the Browser(Computer Browser) service, it depends on server
reg add "HKLM\SYSTEM\CurrentControlSet\Services\Browser" /v Start /t REG_DWORD /d 0x2 /f
@ rem enable the W32Time(Windows Timer) service, port UDP123
reg add "HKLM\SYSTEM\CurrentControlSet\Services\W32Time" /v Start /t REG_DWORD /d 0x2 /f
@ rem enable the TermService(Terminal Services) service, its default port is TCP3389
reg add "HKLM\SYSTEM\CurrentControlSet\Services\TermService" /v Start /t REG_DWORD /d 0x2 /f
@ rem enable DCOM
reg add "HKLM\SOFTWARE\Microsoft\Ole" /v EnableDCOM /t REG_SZ /d Y /f
:end
@ rem enable tcpip device driver
reg add "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip" /v Start /t REG_DWORD /d 0x2 /f
@echo off
pause
================================
[解釋說明]
Windows問題主要來自TCP135、TCP139、TCP445等默認埠、提供的IPC$默認共享,以及沒有默認開啟但非常危險的終端服務(Terminial Services)。這個腳本可以把它們關掉。下面是腳本中命令的解釋。
1. NetBios和IPC$的問題。
reg add "HKLM\SYSTEM\CurrentControlSet\Services\NetBT" /v Start /t REG_DWORD /d 0x4 /f
禁用NetBT的驅動程序。這可以關閉TCP139/UDP137/UDP138/TCP445。
由於IPC$是利用了這些埠,因此應該已經不能使用了,這會使你的網路列印機和網路文件共享無效。
『叄』 Linux系統如何阻擋UDP攻擊
UDP Server程序
1、編寫UDP Server程序的步驟
(1)使用socket()來建立一個UDP socket,第二個參數為SOCK_DGRAM。
(2)初始化sockaddr_in結構的變數,並賦值。sockaddr_in結構定義:
struct sockaddr_in {
uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
這里使用「08」作為服務程序的埠,使用「INADDR_ANY」作為綁定的IP地址即任何主機上的地址。
(3)使用bind()把上面的socket和定義的IP地址和埠綁定。這里檢查bind()是否執行成功,如果有錯誤就退出。這樣可以防止服務程序重復運行的問題。
(4)進入無限循環程序,使用recvfrom()進入等待狀態,直到接收到客戶程序發送的數據,就處理收到的數據,並向客戶程序發送反饋。這里是直接把收到的數據發回給客戶程序。
2、udpserv.c程序內容:
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 80
#define SERV_PORT 8888
void do_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen)
{
int n;
socklen_t len;
char mesg[MAXLINE];
for(;;)
{
len = clilen;
/* waiting for receive data */
n = recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);
/* sent data back to client */
sendto(sockfd, mesg, n, 0, pcliaddr, len);
}
}
int main(void)
{
int sockfd;
struct sockaddr_in servaddr, cliaddr;
sockfd = socket(AF_INET, SOCK_DGRAM, 0); /* create a socket */
/* init servaddr */
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
/* bind address and port to socket */
if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
{
perror("bind error");
exit(1);
}
do_echo(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
return 0;
}
UDP Client程序
1、編寫UDP Client程序的步驟
(1)初始化sockaddr_in結構的變數,並賦值。這里使用「8888」作為連接的服務程序的埠,從命令行參數讀取IP地址,並且判斷IP地址是否符合要求。
(2)使用socket()來建立一個UDP socket,第二個參數為SOCK_DGRAM。
(3)使用connect()來建立與服務程序的連接。與TCP協議不同,UDP的connect()並沒有與服務程序三次握手。上面我們說了UDP是非連接的,實際上也可以是連接的。使用連接的UDP,kernel可以直接返回錯誤信息給用戶程序,從而避免由於沒有接收到數據而導致調用recvfrom()一直等待下去,看上去好像客戶程序沒有反應一樣。
(4)向服務程序發送數據,因為使用連接的UDP,所以使用write()來替代sendto()。這里的數據直接從標准輸入讀取用戶輸入。
(5)接收服務程序發回的數據,同樣使用read()來替代recvfrom()。
(6)處理接收到的數據,這里是直接輸出到標准輸出上。
2、udpclient.c程序內容:
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAXLINE 80
#define SERV_PORT 8888
void do_cli(FILE *fp, int sockfd, struct sockaddr *pservaddr, socklen_t servlen)
{
int n;
char sendline[MAXLINE], recvline[MAXLINE + 1];
/* connect to server */
if(connect(sockfd, (struct sockaddr *)pservaddr, servlen) == -1)
{
perror("connect error");
exit(1);
}
while(fgets(sendline, MAXLINE, fp) != NULL)
{
/* read a line and send to server */
write(sockfd, sendline, strlen(sendline));
/* receive data from server */
n = read(sockfd, recvline, MAXLINE);
if(n == -1)
{
perror("read error");
exit(1);
}
recvline[n] = 0; /* terminate string */
fputs(recvline, stdout);
}
}
int main(int argc, char **argv)
{
int sockfd;
struct sockaddr_in srvaddr;
/* check args */
if(argc != 2)
{
printf("usage: udpclient <IPaddress>\n");
exit(1);
}
/* init servaddr */
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
{
printf("[%s] is not a valid IPaddress\n", argv[1]);
exit(1);
}
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
do_cli(stdin, sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
return 0;
}
運行例子程序
1、編譯例子程序
使用如下命令來編譯例子程序:
gcc -Wall -o udpserv udpserv.c
gcc -Wall -o udpclient udpclient.c
編譯完成生成了udpserv和udpclient兩個可執行程序。
2、運行UDP Server程序
執行./udpserv &命令來啟動服務程序。我們可以使用netstat -ln命令來觀察服務程序綁定的IP地址和埠,部分輸出信息如下:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
udp 0 0 0.0.0.0:32768 0.0.0.0:*
udp 0 0 0.0.0.0:8888 0.0.0.0:*
udp 0 0 0.0.0.0:111 0.0.0.0:*
udp 0 0 0.0.0.0:882 0.0.0.0:*
可以看到udp處有「0.0.0.0:8888」的內容,說明服務程序已經正常運行,可以接收主機上任何IP地址且埠為8888的數據。
如果這時再執行./udpserv &命令,就會看到如下信息:
bind error: Address already in use
說明已經有一個服務程序在運行了。
3、運行UDP Client程序
執行./udpclient 127.0.0.1命令來啟動客戶程序,使用127.0.0.1來連接服務程序,執行效果如下:
Hello, World!
Hello, World!
this is a test
this is a test
^d
輸入的數據都正確從服務程序返回了,按ctrl+d可以結束輸入,退出程序。
如果服務程序沒有啟動,而執行客戶程序,就會看到如下信息:
$ ./udpclient 127.0.0.1
test
read error: Connection refused
說明指定的IP地址和埠沒有服務程序綁定,客戶程序就退出了。這就是使用connect()的好處,注意,這里錯誤信息是在向服務程序發送數據後收到的,而不是在調用connect()時。如果你使用tcpmp程序來抓包,會發現收到的是ICMP的錯誤信息。
參考資料:http://www.cnpaf.net/Class/UDP/0532918532729212.html
『肆』 iptables如何設置讓DHCP通過
要允許DHCP通過iptables,您需要添加以下規則:
iptables -A INPUT -p udp --dport 67:68 --sport 67:68 -j ACCEPT
iptables -A OUTPUT -p udp --dport 67:68 --sport 67:68 -j ACCEPT
這些規則將允許DHCP伺服器(埠67)和客戶端(埠68)之間的UDP通信通過型段iptables。這將確保您的DHCP請求和響應可以正常傳輸。
請注意,這些規則將放寬iptables的UDP過濾規則,因此在添加這些者世規則之前,請確保您的卜嫌譽網路環境是安全的,並且只有受信任的設備可以連接到您的網路。
『伍』 如何使用iptables防火牆攔截無效的UDP攻擊數據
你得看看 linux IPtales 學大激習之路, 好多配置的命令
1、關閉所有的 INPUT FORWARD OUTPUT 只對某些埠開放。
下面是命令實現:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
再用命令 iptables -L -n 查看 是否設置好, 好看到全部 DROP 了
這樣的螞氏設置好了,我們只是臨時的, 重啟伺服器還是會恢復原來沒有設置的狀態
還要使用 service iptables save 進行保存
看到信息 firewall rules 防火牆的規則 其實就是保存在 /etc/sysconfig/iptables
可以打開文件查看 vi /etc/sysconfig/iptables
2、
下面我只打開22埠,看我滾物襪是如何操作的,就是下面2個語句
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
再查看下 iptables -L -n 是否添加上去, 看到添加了
『陸』 淺談iptables
iptables是linux系統下用來做防火牆的二進制文件(linux上位於/sbin/iptables,android中位於/system/bin/iptables),底層依賴於內核的netfilter模塊,用來完成封包過濾、封包重定向和網路地址轉換(NAT)等功能(在android上需要root使用)。
舉個例子來簡單看看iptables命令的基本用法。
意思是在nat轉發表的OUTPUT輸出鏈中增加這樣一條規則:倘若OUTPUT輸出鏈攔到了tcp請求,則將其重定向到本地的8123埠。
可以看到iptables中有 表 、 鏈 和 規則 的概念,那麼先通過iptables傳輸數據包的過程來簡單了解下表和鏈是什麼以及他們之間的關系。
可以看到 鏈 就是對數據包傳輸路徑的一種抽象,一個數據包根據其具體場景以固定的順序依次經過PREROUTING、INPUT等各個鏈,在經過各個鏈時,又有不同的表在監聽這個鏈,而nat、filter等 表 中有包含一系列的 規則 ,當一個數據包到達一個鏈時,iptables就會從鏈中第一條規則開始檢查,看該數據包是否滿足規則所定義的條件。如果滿足,系統就會根據該條規則所定義的方法處理該數據包;否則iptables將繼續檢查下一條規則。
值得注意的是,
至此我們了解了表、鏈和規則是什麼以及他們之間的關系,下面來具體看下 iptables命令的基本用法 。
更多關於各command、parameter的具體含義以及用法可以參考 https://wangchujiang.com/linux-command/c/iptables.html
iptables對網路數據包做過濾或攔截時其維度只能局限於網路數據包收發的ip地址、埠號、網卡、tcp/udp協議,因此可以推測iptables最終是在ip層對網路數據包做的攔截。
那iptables基於netfilter具體是怎麼做到在各個鏈上對數據包做攔截的呢?
/net/ipv4/ip_output.c
/net/ipv4/ip_input.c
/net/ipv4/ip_forward.c
可以看到內核在每一個數據轉發的關鍵節點都調用了NF_HOOK這個宏,來看下NF_HOOK這個宏幹了啥
關於NF_HOOK相關具體邏輯可參見 https://sites.google.com/site/ibms/network-security-development/netfilter%E8%AE%BE%E8%AE%A1%E4%B8%8E%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90
『柒』 linux/unix -shell值iptables基礎知識
原文參考:
iptables防火牆可以用於創建過濾(filter)與NAT規則。所有Linux發行版都能使用iptables,因此理解如何配置 iptables將會幫助你更有效地管理Linux防火牆。如果你是第一次接觸iptables,你會覺得它很復雜,但是一旦你理解iptables的工 作原理,你會發現其實它很簡單。
首先介紹iptables的結構:iptables -> Tables -> Chains -> Rules. 簡單地講,tables由chains組成,而chains又由rules組成。如下圖所示。 [圖片上傳失敗...(image-ba5408-1536195185275)]
圖: IPTables Table, Chain, and Rule Structure
一、iptables的表與鏈
iptables具有Filter, NAT, Mangle, Raw四種內建表:
1. Filter表
Filter表示iptables的默認表,因此如果你沒有自定義表,那麼就默認使用filter表,它具有以下三種內建鏈:
2. NAT表
NAT表有三種內建鏈:
3. Mangle表
Mangle表用於指定如何處理數據包。它能改變TCP頭中的QoS位。Mangle表具有5個內建鏈:
4. Raw表
Raw表用於處理異常,它具有2個內建鏈:
5.小結
下圖展示了iptables的三個內建表:
[圖片上傳失敗...(image-753d8c-1536195185272)]
圖: IPTables 內建表
二、IPTABLES 規則(Rules)
牢記以下三點式理解iptables規則的關鍵:
目標值(Target Values)
下面是你可以在target里指定的特殊值:
如果你執行iptables –list你將看到防火牆上的可用規則。下例說明當前系統沒有定義防火牆,你可以看到,它顯示了默認的filter表,以及表內默認的input鏈, forward鏈, output鏈。
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
查看mangle表:
查看NAT表:
查看RAW表:
!注意:如果不指定 -t 選項,就只會顯示默認的 filter 表。因此,以下兩種命令形式是一個意思:
(or)
以下例子表明在filter表的input鏈, forward鏈, output鏈中存在規則:
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 RH-Firewall-1-INPUT all — 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 RH-Firewall-1-INPUT all – 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Chain RH-Firewall-1-INPUT (2 references)
num target prot opt source destination
1 ACCEPT all – 0.0.0.0/0 0.0.0.0/0
2 ACCEPT icmp – 0.0.0.0/0 0.0.0.0/0 icmp type 255
3 ACCEPT esp – 0.0.0.0/0 0.0.0.0/0
4 ACCEPT ah – 0.0.0.0/0 0.0.0.0/0
5 ACCEPT udp – 0.0.0.0/0 224.0.0.251 udp dpt:5353
6 ACCEPT udp – 0.0.0.0/0 0.0.0.0/0 udp dpt:631
7 ACCEPT tcp – 0.0.0.0/0 0.0.0.0/0 tcp dpt:631
8 ACCEPT all – 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
9 ACCEPT tcp – 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
10 REJECT all – 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
以上輸出包含下列欄位:
三、清空所有iptables規則
在配置iptables之前,你通常需要用iptables –list命令或者iptables-save命令查看有無現存規則,因為有時需要刪除現有的iptables規則:
iptables –flush
或者
iptables -F
這兩條命令是等效的。但是並非執行後就萬事大吉了。你仍然需要檢查規則是不是真的清空了,因為有的linux發行版上這個命令不會清除NAT表中的規則,此時只能手動清除:
iptables -t NAT -F
四、永久生效
當你刪除、添加規則後,這些更改並不能永久生效,這些規則很有可能在系統重啟後恢復原樣。為了讓配置永久生效,根據平台的不同,具體操作也不同。下面進行簡單介紹:
1.Ubuntu
首先,保存現有的規則:
iptables-save > /etc/iptables.rules
然後新建一個bash腳本,並保存到 /etc/network/if-pre-up.d/ 目錄下:
iptables-restore < /etc/iptables.rules
這樣,每次系統重啟後iptables規則都會被自動載入。
!注意:不要嘗試在.bashrc或者.profile中執行以上命令,因為用戶通常不是root,而且這只能在登錄時載入iptables規則。
2.CentOS, RedHat
service iptables save
service iptables stop
service iptables start
查看當前規則:
cat /etc/sysconfig/iptables
五、追加iptables規則
可以使用iptables -A命令追加新規則,其中 -A 表示 Append 。因此, 新的規則將追加到鏈尾。
一般而言,最後一條規則用於丟棄(DROP)所有數據包。如果你已經有這樣的規則了,並且使用 -A 參數添加新規則,那麼就是無用功。
1.語法
iptables -A chain firewall-rule
2.描述規則的基本參數
以下這些規則參數用於描述數據包的協議、源地址、目的地址、允許經過的網路介面,以及如何處理這些數據包。這些描述是對規則的基本描述。
-p 協議(protocol)
-s 源地址(source)
-d 目的地址(destination)
-j 執行目標(jump to target)
-i 輸入介面(input interface)
-o 輸出(out interface)
3.描述規則的擴展參數
對規則有了一個基本描述之後,有時候我們還希望指定埠、TCP標志、ICMP類型等內容。
–sport 源埠(source port)針對 -p tcp 或者 -p udp
–-dport 目的埠(destination port)針對-p tcp 或者 -p udp
-–tcp-flags TCP標志 針對-p tcp
-–icmp-type ICMP類型 針對-p icmp
4.追加規則的完整實例:僅允許SSH服務
本例實現的規則將僅允許SSH數據包通過本地計算機,其他一切連接(包括ping)都將被拒絕。
iptables -F
iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT
iptables -A INPUT -j DROP
六、更改默認策略
上例的例子僅對接收的數據包過濾,而對於要發送出去的數據包卻沒有任何限制。本節主要介紹如何更改鏈策略,以改變鏈的行為。
1. 默認鏈策略
/!警告 :請勿在遠程連接的伺服器、虛擬機上測試!
當我們使用-L選項驗證當前規則是發現,所有的鏈旁邊都有 policy ACCEPT 標注,這表明當前鏈的默認策略為ACCEPT:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp – anywhere anywhere tcp dpt:ssh
DROP all – anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
這種情況下,如果沒有明確添加DROP規則,那麼默認情況下將採用ACCEPT策略進行過濾。除非:
a)為以上三個鏈單獨添加DROP規則:
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
iptables -A FORWARD -j DROP
b)更改默認策略:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
糟糕!!如果你嚴格按照上一節的例子配置了iptables,並且現在使用的是SSH進行連接的,那麼會話恐怕已經被迫終止了!
為什麼呢?因為我們已經把OUTPUT鏈策略更改為DROP了。此時雖然伺服器能接收數據,但是無法發送數據:
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp – anywhere anywhere tcp dpt:ssh
DROP all – anywhere anywhere
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy DROP)
target prot opt source destination
七、配置應用程序規則
盡管5.4節已經介紹了如何初步限制除SSH以外的其他連接,但是那是在鏈默認策略為ACCEPT的情況下實現的,並且沒有對輸出數據包進行限 制。本節在上一節基礎上,以SSH和HTTP所使用的埠為例,教大家如何在默認鏈策略為DROP的情況下,進行防火牆設置。在這里,我們將引進一種新的 參數-m state,並檢查數據包的狀態欄位。
1.SSH
iptables -A INPUT -i eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
如果伺服器也需要使用SSH連接其他遠程主機,則還需要增加以下配置:
iptables -A OUTPUT -o eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
2.HTTP
HTTP的配置與SSH類似:
iptables -A INPUT -i eth0 -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp –sport 80 -m state –state ESTABLISHED -j ACCEPT
3.完整的配置
iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
iptables -A INPUT -i eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp –sport 80 -m state –state ESTABLISHED -j ACCEPT
References
[1] Linux Firewall Tutorial: IPTables Tables, Chains, Rules Fundamentals
[2] IPTables Flush: Delete / Remove All Rules On RedHat and CentOS Linux
[3] Linux IPTables: How to Add Firewall Rules (With Allow SSH Example)
[4] Linux IPTables: Incoming and Outgoing Rule Examples (SSH and HTTP)
[5] 25 Most Frequently Used Linux IPTables Rules Examples
[6] man 8 iptables
『捌』 linux中iptables防火牆怎麼設置
Linux系統內核內建了netfilter防火牆機制。Netfilter(數據包過濾機制),所謂的數據包過濾,就是分析進入主機的網路數據包,將數據包的頭部數據提取出來進行分析,以決該連接為放行或阻擋的機制。Netfilter提供了iptables這個程序來作為防火牆數據包過濾的命令。Netfilter是內建的,效率非常高。
我們可以通過iptables命令來設置netfilter的過濾機制。
iptables里有3張表:
> Filter(過濾器),進入Linux本機的數據包有關,是默認的表。
> NAT(地址轉換),與Linux本機無關,主要與Linux主機後的區域網內計算機相關。
> Mangle(破壞者),這個表格主要是與特殊的數據包的路由標志有關(通常不用涉及到這個表的修改,對這個表的修改破壞性很大,慎改之)。
每張表裡都還有多條鏈:
Filter:INPUT, OUTPUT, FORWARD
NAT:PREROUTING, POSTROUTING, OUTPUT
Mangle:PREROUTING, OUTPUT, INPUT, FORWARD
iptables命令的使用
基本格式:iptables [-t table] -CMD chain CRETIRIA -j ACTION
-t table:3張表中的其中一種filter, nat, mangle,如果沒有指定,默認是filter。
CMD:操作命令。查看、添加、替換、刪除等。
chain:鏈。指定是對表中的哪條鏈進行操作搭游,如filter表中的INPUT鏈。
CRETIRIA:匹配模式。對要過薯枝穗濾的數據包進行描述
ACTION:操作。接受、拒絕、丟棄等。
查看
格式:iptables [-t table] -L [-nv]
修改
添加
格式:iptables [-t table] -A chain CRETIRIA -j ACTION
將新規則加入到表table(默認filter)的chain鏈的最後位置
插入
格式:iptables [-t table] -I chain pos CRETIRIA -j ACTION
將新規則插入到table表(默認filter)chain鏈的pos位置。原來之後的規則都往後推一位。pos的有效范圍為:1 ~ num+1
替換
格式:iptables [-t table] -R chain pos CRETIRIA -j ACTION
用新規則替換table表(默認filter)chain鏈的pos位置的規則。pos的有效范圍為:1 ~ num
刪除
格式:iptables [-t table] -D chain pos
刪除table表(默認filter)chain鏈的pos位置的規則。pos的有效范圍為:1 ~ num
包匹配(CRETIRIA)
上面沒有介紹CRETIRIA的規則,在這小節里詳細介紹。包匹配就是用於描述需要過濾的數據包包頭特殊的欄位。
指定網口:
-i :數據包所進入的那個網路介面,例如 eth0、lo等,需與INPUT鏈配合
-o: 數據包所傳出的那麼網路介面,需與OUTPUT鏈配合
指定協議:
-p:tcp, udp, icmp或all
指定IP網路數卜:
-s:來源網路。可以是IP或網路
IP: 192.168.0.100
網路: 192.168.0.0/24 或 192.168.0.0/255.255.255.0 均可
可以在前加 ! 表示取反
-d:目標網格。同 -s
指定埠:
--sport:指定來源埠。可以是單個埠,還可以是連續的埠,例如:1024:65535。
--dport:指定目標埠。同--sport
注意:要指定了tcp或udp協議才會有效。
指定MAC地址:
-m mac --mac-source aa:bb:cc:dd:ee:ff
指定狀態:
-m state --state STATUS
STATUS可以是:
> INVALID,無效包
> ESTABLISHED,已經連接成功的連接狀態
> NEW,想要新立連接的數據包
> RELATED,這個數據包與主機發送出去的數據包有關,(最常用)
例如:只要已建立連接或與已發出請求相關的數據包就予以通過,不合法數據包就丟棄
-m state --state RELATED,ESTABLISHED
ICMP數據比對
ping操作發送的是ICMP包,如果不想被ping到,就可以拒絕。
--icmp-type TYPE
TYPE如下:
8 echo-request(請求)
0 echo-reply(響應)
注意:需要與 -p icmp 配合使用。
操作(ACTION)
DROP,丟棄
ACCEPT,接受
REJECT,拒絕
LOG,跟蹤記錄,將訪問記錄寫入 /var/log/messages
保存配置
將新設置的規則保存到文件
格式:iptables-save [-t table]
將當前的配置保存到 /etc/sysconfig/iptables
其它
格式:iptables [-t table] [-FXZ]
-F :請除所有的已制訂的規則
-X :除掉所有用戶「自定義」的chain
-Z :將所有的統計值清0
『玖』 在linux 下如何設置iptables 防火牆
Linux系統內核內建了netfilter防火牆機制。Netfilter(數據包過濾機制),所謂的數據包過濾,就是分析進入主機的網路數據包,將數據包的頭部數據提取出來進行分析,以決該連接為放行或阻擋的機制。Netfilter提供了iptables這個程序來作為防火牆數據包過濾的命令。Netfilter是內建的,效率非常高。
我們可以通過iptables命令來設置netfilter的過濾機制。
iptables里有3張表:
> Filter(過濾器),進入Linux本機的數據包有關,是默認的表。
> NAT(地址轉換),與Linux本機無關,主要與Linux主機後的區域網內計算機相關。
> Mangle(破壞者),這個表格主要是與特殊的數據包的路由標志有關(通常不用涉及到這個表的修改,對這個表的修改破壞性很大,慎改之)。
每張表裡都還有多條鏈:
Filter:INPUT, OUTPUT, FORWARD
NAT:PREROUTING, POSTROUTING, OUTPUT
Mangle:PREROUTING, OUTPUT, INPUT, FORWARD
iptables命令的使用
基本格式:iptables [-t table] -CMD chain CRETIRIA -j ACTION
-t table:3張表中的其中一種filter, nat, mangle,如果沒有指定,默認是filter。
CMD:操作命令。查看、添加、替換、刪除等。
chain:鏈。指定是對表中的哪條鏈進行操作,如filter表中的INPUT鏈。
CRETIRIA:匹配模式。對要過濾的數據包進行描述
ACTION:操作。接受、拒絕、丟棄等。
查看
格式:iptables [-t table] -L [-nv]
修改
添加
格式:iptables [-t table] -A chain CRETIRIA -j ACTION
將新規則加入到表table(默認filter)的chain鏈的最後位置
插入
格式:iptables [-t table] -I chain pos CRETIRIA -j ACTION
將新規則插入到table表(默認filter)chain鏈的pos位置。原來之後的規則都往後推一位。pos的有效范圍為:1 ~ num+1
替換
格式:iptables [-t table] -R chain pos CRETIRIA -j ACTION
用新規則替換table表(默認filter)chain鏈的pos位置的規則。pos的有效范圍為:1 ~ num
刪除
格式:iptables [-t table] -D chain pos
刪除table表(默認filter)chain鏈的pos位置的規則。pos的有效范圍為:1 ~ num
包匹配(CRETIRIA)
上面沒有介紹CRETIRIA的規則,在這小節里詳細介紹。包匹配就是用於描述需要過濾的數據包包頭特殊的欄位。
指定網口:
-i :數據包所進入的那個網路介面,例如 eth0、lo等,需與INPUT鏈配合
-o: 數據包所傳出的那麼網路介面,需與OUTPUT鏈配合
指定協議:
-p:tcp, udp, icmp或all
指定IP網路:
-s:來源網路。可以是IP或網路
IP: 192.168.0.100
網路: 192.168.0.0/24 或 192.168.0.0/255.255.255.0 均可
可以在前加 ! 表示取反
-d:目標網格。同 -s
指定埠:
--sport:指定來源埠。可以是單個埠,還可以是連續的埠,例如:1024:65535。
--dport:指定目標埠。同--sport
注意:要指定了tcp或udp協議才會有效。
指定MAC地址:
-m mac --mac-source aa:bb:cc:dd:ee:ff
指定狀態:
-m state --state STATUS
STATUS可以是:
> INVALID,無效包
> ESTABLISHED,已經連接成功的連接狀態
> NEW,想要新立連接的數據包
> RELATED,這個數據包與主機發送出去的數據包有關,(最常用)
例如:只要已建立連接或與已發出請求相關的數據包就予以通過,不合法數據包就丟棄
-m state --state RELATED,ESTABLISHED
ICMP數據比對
ping操作發送的是ICMP包,如果不想被ping到,就可以拒絕。
--icmp-type TYPE
TYPE如下:
8 echo-request(請求)
0 echo-reply(響應)
注意:需要與 -p icmp 配合使用。
操作(ACTION)
DROP,丟棄
ACCEPT,接受
REJECT,拒絕
LOG,跟蹤記錄,將訪問記錄寫入 /var/log/messages
保存配置
將新設置的規則保存到文件
格式:iptables-save [-t table]
將當前的配置保存到 /etc/sysconfig/iptables
其它
格式:iptables [-t table] [-FXZ]
-F :請除所有的已制訂的規則
-X :除掉所有用戶「自定義」的chain
-Z :將所有的統計值清0
『拾』 iptables詳解
netfilter/iptables (簡稱為iptables)組成Linux平台下的包過濾防火牆,與大多數的Linux軟體一樣,這個包過濾防火牆是免費的,它可以代替昂貴的商業防火牆解決方案,完成封包過濾、封包重定向和網路地址轉換(NAT)等功能。
iptables和netfilter的關系:
這是第一個要說的地方,Iptables和netfilter的關系是一個很容易讓人搞不清的問題。很多的知道iptables卻不知道 netfilter。其實iptables只是Linux防火牆的管理工具而已,位於/sbin/iptables。真正實現防火牆功能的是 netfilter,它是Linux內核中實現包過濾的內部結構。
規則 (rules)其實就是網路管理員預定義的條件,規則一般的定義為「如果數據包頭符合這樣的條件,就這樣處理這個數據包」。規則存儲在內核空間的信息包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協議(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。當數據包與規則匹配時,iptables就根據規則所定義的方法來處理這些數據包,如放行(accept)、拒絕(reject)和丟棄(drop)等。配置防火牆的 主要工作就是添加、修改和刪除這些規則。
① 當一個數據包進入網卡時,它首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需要轉送出去。
② 如果數據包就是進入本機的,它就會沿著圖向下移動,到達INPUT鏈。數據包到了INPUT鏈後,任何進程都會收到它。本機上運行的程序可以發送數據包,這些數據包會經過OUTPUT鏈,然後到達POSTROUTING鏈輸出。
③ 如果數據包是要轉發出去的,且內核允許轉發,數據包就會如圖所示向右移動,經過FORWARD鏈,然後到達POSTROUTING鏈輸出。
過程圖如下:
Iptables採用「表」和「鏈」的分層結構。
表 (tables)提供特定的功能,iptables內置了4個表,即filter表、nat表、mangle表和raw表,分別用於實現包過濾,網路地址轉換、包重構(修改)和數據跟蹤處理。
(1)filter表——三個鏈:INPUT、FORWARD、OUTPUT
作用:過濾數據包 內核模塊:iptables_filter.
(2)Nat表——三個鏈:PREROUTING、POSTROUTING、OUTPUT
作用:用於網路地址轉換(IP、埠) 內核模塊:iptable_nat
(3)Mangle表——五個鏈:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改數據包的服務類型、TTL、並且可以配置路由實現QOS內核模塊:iptable_mangle(別看這個表這么麻煩,咱們設置策略時幾乎都不會用到它)
(4)Raw表——兩個鏈:OUTPUT、PREROUTING
作用:決定數據包是否被狀態跟蹤機制處理 內核模塊:iptable_raw
Raw——mangle——nat——filter
鏈 (chains)是數據包傳播的路徑,每一條鏈其實就是眾多規則中的一個檢查清單,每一條鏈中可以有一 條或數條規則。當一個數據包到達一個鏈時,iptables就會從鏈中第一條規則開始檢查,看該數據包是否滿足規則所定義的條件。如果滿足,系統就會根據 該條規則所定義的方法處理該數據包;否則iptables將繼續檢查下一條規則,如果該數據包不符合鏈中任一條規則,iptables就會根據該鏈預先定 義的默認策略來處理數據包。
(1)INPUT——進來的數據包應用此規則鏈中的策略
(2)OUTPUT——外出的數據包應用此規則鏈中的策略
(3)FORWARD——轉發數據包時應用此規則鏈中的策略
(4)PREROUTING——對數據包作路由選擇前應用此鏈中的規則
(記住!所有的數據包進來的時侯都先由這個鏈處理)
(5)POSTROUTING——對數據包作路由選擇後應用此鏈中的規則(所有的數據包出來的時侯都先由這個鏈處理)
從外界到達防火牆的數據包,先被PREROUTING規則鏈處理(是否修改數據包地址等),之後會進行路由選擇(判斷該數據包應該發往何處),如果數據包 的目標主機是防火牆本機(比如說Internet用戶訪問防火牆主機中的web伺服器的數據包),那麼內核將其傳給INPUT鏈進行處理(決定是否允許通 過等),通過以後再交給系統上層的應用程序(比如Apache伺服器)進行響應。
來自外界的數據包到達防火牆後,首先被PREROUTING規則鏈處理,之後會進行路由選擇,如果數據包的目標地址是其它外部地址(比如區域網用戶通過網 關訪問QQ站點的數據包),則內核將其傳遞給FORWARD鏈進行處理(是否轉發或攔截),然後再交給POSTROUTING規則鏈(是否修改數據包的地 址等)進行處理。
防火牆本機向外部地址發送的數據包(比如在防火牆主機中測試公網DNS伺服器時),首先被OUTPUT規則鏈處理,之後進行路由選擇,然後傳遞給POSTROUTING規則鏈(是否修改數據包的地址等)進行處理。
iptables-save把規則保存到文件中,再由目錄rc.d下的腳本(/etc/rc.d/init.d/iptables)自動裝載
使用命令iptables-save來保存規則。一般用
iptables-save > /etc/sysconfig/iptables
生成保存規則的文件 /etc/sysconfig/iptables,
也可以用
service iptables save
它能把規則自動保存在/etc/sysconfig/iptables中。
當計算機啟動時,rc.d下的腳本將用命令iptables-restore調用這個文件,從而就自動恢復了規則。
刪除INPUT鏈的第一條規則:
1.拒絕進入防火牆的所有ICMP協議數據包
2.允許防火牆轉發除ICMP協議以外的所有數據包
說明:使用「!」可以將條件取反。
3.拒絕轉發來自192.168.1.10主機的數據,允許轉發來自192.168.0.0/24網段的數據
說明:注意要把拒絕的放在前面不然就不起作用了啊。
4.丟棄從外網介面(eth1)進入防火牆本機的源地址為私網地址的數據包
5.封堵網段(192.168.1.0/24),兩小時後解封。
說明:這個策略咱們藉助crond計劃任務來完成,就再好不過了。
[1] Stopped at now 2 hours
6.只允許管理員從202.13.0.0/16網段使用SSH遠程登錄防火牆主機。
說明:這個用法比較適合對設備進行遠程管理時使用,比如位於分公司中的SQL伺服器需要被總公司的管理員管理時。
7.允許本機開放從TCP埠20-1024提供的應用服務。
8.允許轉發來自192.168.0.0/24區域網段的DNS解析請求數據包。
9.禁止其他主機ping防火牆主機,但是允許從防火牆上ping其他主機
10.禁止轉發來自MAC地址為00:0C:29:27:55:3F的和主機的數據包
說明:iptables中使用「-m 模塊關鍵字」的形式調用顯示匹配。咱們這里用「-m mac –mac-source」來表示數據包的源MAC地址。
11.允許防火牆本機對外開放TCP埠20、21、25、110以及被動模式FTP埠1250-1280
說明:這里用「-m multiport –dport」來指定目的埠及范圍
12.禁止轉發源IP地址為192.168.1.20-192.168.1.99的TCP數據包。
說明:此處用「-m –iprange –src-range」指定IP范圍。
13.禁止轉發與正常TCP連接無關的非—syn請求數據包。
說明:「-m state」表示數據包的連接狀態,「NEW」表示與任何連接無關的,新的嘛!
14.拒絕訪問防火牆的新數據包,但允許響應連接或與已有連接相關的數據包
說明:「ESTABLISHED」表示已經響應請求或者已經建立連接的數據包,「RELATED」表示與已建立的連接有相關性的,比如FTP數據連接等。
15.只開放本機的web服務(80)、FTP(20、21、20450-20480),放行外部主機發住伺服器其它埠的應答數據包,將其他入站數據包均予以丟棄處理。