kernel版本不同 防火牆機制不同--2004年以後的distributions 已經都爲2.6的kernel
Version 2.0:使用 ipfwadm 這個防火牆機制;
Version 2.2:使用的是 ipchains 這個防火牆機制;
Version 2.4 與 2.6 :主要是使用 Netfilet機制的iptables 這個軟件,不過在某些早期的 Version 2.4 版本也同時支持 ipchains (編譯成爲模塊)。不過,不建議在 2.4 之後的核心版本使用 ipchains !
table
表格 防火牆可以有多個表格 :定義默認政策與規則
Linux的iptables至少有三個表格
管理本機進出的 filter表格
管理後端主機 (防火牆內部的其他計算機) 的 nat 表格
管理特殊旗標使用的 mangle表格 (較少使用)
chain
鏈 表格中可以有多個鏈
filter (過濾器):主要跟進入 Linux 本機的封包有關,這個是預設的 table!
INPUT:主要與想要進入我們 Linux 本機的封包有關;
OUTPUT:主要與我們 Linux 本機所要送出的封包有關;
FORWARD:這個咚咚與 Linux 本機比較沒有關係, 他可以『轉遞封包』到後端的計算機中,與nat table 相關性較高。
nat (地址轉換):是 Network Address Translation 的縮寫, 這個表格主要在進行來源IP與目的 IP 或 port 的轉換,與 Linux 本機較無關,主要與 Linux 主機後的局域網絡內計算機較有相關。
PREROUTING:在進行路由判斷之前所要進行的規則(DNAT/REDIRECT)
POSTROUTING:在進行路由判斷之後所要進行的規則(SNAT/MASQUERADE)
OUTPUT:與發送出去的封包有關
mangle (破壞者):這個表格主要是與特殊的封包的路由旗標有關, 早期僅有 PREROUTING 及 OUTPUT 鏈,不過從 kernel 2.4.18 之後加入了 INPUT 及 FORWARD 鏈。 由於這個表格與特殊旗標相關性較高,所以單純的環境當中,較少使用 mangle table。
[root@www ~]# iptables [-t tables] [-L] [-nv]選項與參數:
-t :後面接 table ,例如 nat 或 filter ,若省略此項目,則使用默認的 filter
-L :列出目前的 table 的規則
-n :不進行 IP 與 HOSTNAME 的反查,顯示訊息的速度會快很多!
-v :列出更多的信息,包括通過該規則的封包總位數、相關的網絡接口等
本機的iptables語法
列出filter table 的三條鏈規則
[root@bird ~]# iptables -L -n
Chain INPUT (policy ACCEPT) INPUT鏈預設政策爲放行
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 規則1
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 規則2
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:23
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:8888
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
target:代表進行的動作, ACCEPT 是放行,而 REJECT 則是拒絕,此外,尚有 DROP (丟棄) 的項目!
prot:代表使用的封包協議,主要有 tcp, udp 及 icmp 三種封包格式;
opt:額外的選項說明
source :代表此規則是針對哪個『來源 IP』進行限制
destination :代表此規則是針對哪個『目標 IP』進行限制
以上的信息結合iptables-save命令查看比較清晰
[root@bird ~]# iptables-save -t filter
# Generated by iptables-save v1.4.7 on Wed Nov 16 21:01:07 2016
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [11661:2912327]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 23 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8888 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Wed Nov 16 21:01:07 2016
修改防火牆規則前 一般都清除本機防火牆(filter)的所有規則 然後逐條添加 這三條規則不會改變預設政策policy
一下只是臨時清除
[root@bird ~]# iptables -F 清除所有的已定製的規則
[root@bird ~]# iptables -X 殺掉所有使用者 自定義的tables
[root@bird ~]# iptables -Z 將所有的chaind的計數與流量統計都歸零
定義預設政策policy
當你的封包不在你設定的規則之內時,則該封包的通過與否,是以 鏈的Policy 的設定爲準
將本機filter表格的INPUT鏈設置爲DROP
[root@bird ~]# iptables -P INPUT DROP
封包的規則配置
[root@www ~]# iptables [-AI 鏈名] [-io 網絡接口] [-p 協議][-s 來源IP/網域] [-d 目標IP/網域] -j [ACCEPT|DROP|REJECT|LOG]選項與參數:
-AI 鏈名:針對某的鏈進行規則的 "插入" 或 "累加"
-A :新增加一條規則,該規則增加在原本規則的最後面。例如原本已經有四條規則,
使用 -A 就可以加上第五條規則!
-I :插入一條規則。如果沒有指定此規則的順序,默認是插入變成第一條規則。
例如原本有四條規則,使用 -I 則該規則變成第一條,而原本四條變成 2~5 號
鏈 :有 INPUT, OUTPUT, FORWARD 等,此鏈名稱又與 -io 有關,請看底下。
-io 網絡接口:設定封包進出的接口規範
-i :封包所進入的那個網絡接口,例如 eth0, lo 等接口。需與 INPUT 鏈配合;
-o :封包所傳出的那個網絡接口,需與 OUTPUT 鏈配合;
-p 協定:設定此規則適用於哪種封包格式
主要的封包格式有: tcp, udp, icmp 及 all 。
-s 來源 IP/網域:設定此規則之封包的來源項目,可指定單純的 IP 或包括網域,例如:
IP :192.168.0.100
網域:192.168.0.0/24, 192.168.0.0/255.255.255.0 均可。
若規範爲『不許』時,則加上 ! 即可,例如:
-s ! 192.168.100.0/24 表示不許 192.168.100.0/24 之封包來源;
-d 目標 IP/網域:同 -s ,只不過這裏指的是目標的 IP 或網域。
-j :後面接動作,主要的動作有接受(ACCEPT)、丟棄(DROP)、拒絕(REJECT)及記錄(LOG)
封包的基礎規則比對:IP,網域及接口裝置(網卡)的配置
沒有指定的選項 則表示該選項完全接受
設定lo爲受信任的裝置 即進入lo的封包都接受
[root@bird ~]# iptables -A INPUT -i lo -j ACCEPT
來自內網的封包都接受
[root@bird ~]# iptables -A INPUT -i eth0 -s 192.168.0.0/24 -j ACCEPT
指定具體ip
[root@bird ~]# iptables -A INPUT -i eth0 -s 192.168.0.x -j DROP
記錄某個規則 (只是記入日誌/var/log/messages中 會繼續依據後續規則對比)
[root@bird ~]# iptables -A INPUT -s 192.168.x.x -j LOG
TCP,UDP的規則比對:針對端口配置
[root@www ~]# iptables [-AI 鏈] [-io 網絡接口] [-p tcp,udp]
\> [-s 來源IP/網域] [--sport 端口範圍]
\> [-d 目標IP/網域] [--dport 端口範圍] -j [ACCEPT|DROP|REJECT]
選項與參數:
--sport 端口範圍:限制來源的端口號碼,端口號碼可以是連續的,例如 1024:65535
—dport 端口範圍:限制目標的端口號碼。
端口21的封包全部拒絕
[root@bird ~]# iptabels -A INPUT -i eth0 -p tcp --dport 21 -j DROP
只要來自 192.168.1.0/24 的 1024:65535 端口的封包,且想要聯機到本機的 ssh port 就予以拒絕
[root@bird ~]# iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 --sport 1024:65534 -dport ssh -j DROP
TCP 還有特殊的旗標flags!針對主動聯機的 SYN 旗標的限制規則
[root@bird ~]# iptables -A INPUT -i eth0 -p tcp -s 192.168.129.124/23 --sport 1:1023 -dport 1:1023 --syn -j DROP
iptables的外掛模塊: state 與 mac
ipchains 沒有所謂的封包狀態模塊,因此我們必須要針對封包的進、出方向進行管控
iptables 免除了這個困擾!他可以透過一個狀態模塊來分析 這個想要進入的封包是否爲剛剛我發出去的響應
[root@www ~]# iptables -A INPUT [-m state] [--state 狀態]選項與參數:
-m :一些 iptables 的外掛模塊,主要常見的有:
state :狀態模塊
mac :網絡卡硬件地址 (hardware address)
--state :一些封包的狀態,主要有:
INVALID :無效的封包,例如數據破損的封包狀態
ESTABLISHED:已經聯機成功的聯機狀態;
NEW :想要新建立聯機的封包狀態;
RELATED :這個最常用!表示這個封包是與我們主機發送出去的封包有關
只要是已建立或相關封包就予以通過 只要是不合法的封包就丟棄 這樣就無需對“響應封包”單獨撰寫規則了
[root@bird ~]# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@bird ~]# iptables -A INPUT -m state --state INVALID -j DROP
針對網卡的接受與拒絕
[root@bird ~]# iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j ACCEPT
ICMP 封包規則的比對:針對是否響應 ping 來設計
通常我們會把 ICMP type 8 (echo request) 拿掉而已,讓遠程主機不知道我們是否存在,也不會接受 ping 的響應就是了
[root@bird ~]# iptables -A INPUT -i eth0 -p icmp --icmp-type 8 -j DROP
因爲客戶端需要檢測網絡是否暢通 所以局域網的路由器主機 建議不要關閉爲好
類別代號 | 類別名稱與意義 |
0 | Echo Reply (代表一個響應信息) |
3 | Destination Unreachable (表示目的地不可到達) |
4 | Source Quench (當 router 的負載過高時,此類別碼可用來讓發送端停止發送訊息) |
5 | Redirect (用來重新導向路由路徑的信息) |
8 | Echo Request (請求響應消息) |
11 | Time Exceeded for a Datagram (當數據封包在某些路由傳送的現象中造成逾時狀態,此類別碼可告知來源該封包已被忽略的訊息) |
12 | Parameter Problem on a Datagram (當一個 ICMP 封包重複之前的錯誤時,會回覆來源主機關於參數錯誤的訊息) |
13 | Timestamp Request (要求對方送出時間訊息,用以計算路由時間的差異,以滿足同步性協議的要求) |
14 | Timestamp Reply (此訊息純粹是響應 Timestamp Request 用的) |
15 | Information Request (在 RARP 協議應用之前,此訊息是用來在開機時取得網絡信息) |
16 | Information Reply (用以響應 Infromation Request 訊息) |
17 | Address Mask Request (這訊息是用來查詢子網 mask 設定信息) |
18 | Address Mask Reply (響應子網 mask 查詢訊息的) |
設置了一個本地虛擬機的規則
規則歸零:清除所有已經存在的規則 (iptables -F...)
預設政策:除了 INPUT 這個自定義鏈設爲 DROP 外,其他爲預設 ACCEPT;
信任本機:由於 lo 對本機來說是相當重要的,因此 lo 必須設定爲信任裝置;
迴應封包:讓本機主動向外要求而響應的封包可以進入本機 (ESTABLISHED,RELATED)
信任用戶:這是非必要的,如果你想要讓區網的來源可用你的主機資源時
#!/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin;export PATH
iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -A INPUT -i lo -j ACCEPT (本機迴環網卡開放)
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT (可以主動請求外部)
iptables -A INPUT -I eht0 -s 192.168.0.124/24 -j ACCEPT 開放了本機ip(宿主是手動設置的DHCP ip)
[root@bird shell]# chmod 744 firewall.sh
[root@bird shell]#./firewall.sh
[root@bird shell]# /etc/init.d/iptables status
表格:filter
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
3 ACCEPT all -- 192.168.129.0/24 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
[root@bird shell]# /etc/init.d/iptables save
其實直接修改/etc/sysconfig/iptables 然後 /etc/init.d/iptables restart也可以
IPv4的核心管理功能: /proc/sys/net/ipv4/*
阻斷式服務 (DoS) ***法當中的一種方式,就是利用 TCP 封包的 SYN 三向交握原理所達成的,稱爲 SYN Flooding
可以啓用核心的 SYN Cookie模塊來預防SYN Flooding
SYN Cookie 可以在系統用來啓動隨機聯機的端口 (1024:65535) 即將用完時自動啓動。
但不適合負載已經很高的服務器內 會延遲 比如SMTP
當啓動 SYN Cookie 時,主機在發送 SYN/ACK 確認封包前,會要求 Client 端在短時間內回覆一個序號,這個序號包含許多原本 SYN 封包內的信息,包括 IP、port 等。若 Client 端可以回覆正確的序號,那麼主機就確定該封包爲可信的,因此會發送 SYN/ACK 封包,否則就不理會此一封包。
啓動SYN Cookie模塊
[root@bird ~]# echo "1" > /proc/sys/net/ipv4/tcp_syncookies
數臺主機同時不斷攜帶大數據ping你的主機使主機帶寬被吃光,或系統會當 稱爲 ping flooding
可以用防火牆來抵擋也可以用核心模塊來自動取消 ping 的響應
[root@bird ~]# echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts 僅有 ping broadcast 地址時才取消 ping 的迴應
[root@bird ~]# echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all 全部的 ping 都不迴應 不建議使用
/proc/sys/net/ipv4/conf/網絡接口/*
核心還可以針對不同的網絡接口進行不一樣的參數設定
可以使用 echo "1" > /proc/sys/net/ipv4/conf/???/rp_filter
建議直接修改文件 /etc/sysctl.conf +sysctl -p
rp_filter:稱爲逆向路徑過濾 (Reverse Path Filtering), 可以藉由分析網絡接口的路由信息配合封包的來源地址,來分析該封包是否爲合理。舉例來說,你有兩張網卡,eth0 爲 192.168.1.10/24 ,eth1 爲 public IP 。那麼當有一個封包自稱來自 eth1 ,但是其 IP 來源爲 192.168.1.200 , 那這個封包就不合理,應予以丟棄。這個設定值建議可以啓動的。
log_martians:這個設定數據可以用來啓動記錄不合法的 IP 來源, 舉例來說,包括來源爲 0.0.0.0、127.x.x.x、及 Class E 的 IP 來源,因爲這些來源的 IP 不應該應用於 Internet 啊。 記錄的數據默認放置到核心放置的登錄檔 /var/log/messages。
accept_source_route:或許某些路由器會啓動這個設定值, 不過目前的設備很少使用到這種來源路由,你可以取消這個設定值。
accept_redirects:當你在同一個實體網域內架設一部路由器, 但這個實體網域有兩個 IP 網域,例如 192.168.0.0/24, 192.168.1.0/24。此時你的 192.168.0.100 想要向 192.168.1.100 傳送訊息時,路由器可能會傳送一個 ICMP redirect 封包告知 192.168.0.100 直接傳送數據給 192.168.1.100 即可,而不需透過路由器。因爲 192.168.0.100 與 192.168.1.100確實是在同一個實體線路上 (兩者可以直接互通),所以路由器會告知來源 IP 使用最短路徑去傳遞數據。但那兩部主機在不同的 IP 段,卻是無法實際傳遞訊息的!這個設定也可能會產生一些輕微的安全風險,所以建議關閉他。
send_redirects:與上一個類似,只是此值爲發送一個 ICMP redirect 封包。 同樣建議關閉。