1. 程式人生 > >Linux的防火墻

Linux的防火墻

22端口 它的 則無 1.0 disabled pack target 任務 內容

Linux的防火墻

1. selinux

Selinux是Redhat/CentOS系統特有的安全機制。不過因為這個東西限制太多,配置也特別繁瑣所以幾乎沒有人去真正應用它。所以裝完系統,我們一般都要把selinux關閉,以免引起不必要的麻煩。關閉selinux的方法為,使 “SELINUX=disabled”, 默認為 enforcing

[[email protected] ~]# vim /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
保存該配置文件後,重啟機器方可生效,臨時關閉selinux的命令為:

[[email protected] ~]# setenforce 0
我們可以使用 getenforce 命令獲得當前selinux的狀態:

[[email protected] ~]# getenforce
Disabled
阿銘的selinux早就關閉了,默認會輸出 “enforcing” , 當使用 setenforce 0 這個命令後,再 getenforce 會輸出 “permissive”

2. iptables

Iptables是linux上特有的防火墻機制,其功能非常強大,然而阿銘在日常的管理工作中僅僅用到了一兩個應用,這並不代表iptables不重要。作為一個網絡管理員,iptables是必要要熟練掌握的。但是作為系統管理員,我們也應該會最基本的iptables操作,認識iptables的基本規則。

CentOS上默認是設有iptables規則的,這個規則雖然很安全,但是對於我們來說沒有用,反而會造成某些影響,所以阿銘建議你先清除規則,然後把清除後的規則保存一下:

[[email protected] ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source
destination
400 176K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0
state RELATED,ESTABLISHED
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
1 52 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
state NEW tcp dpt:22
3 234 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0
reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source
destination
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0
reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 167 packets, 16963 bytes)
pkts bytes target prot opt in out source
destination
[[email protected] ~]# iptables -F; /etc/init.d/iptables save
iptables:將防火墻規則保存到 /etc/sysconfig/iptables: [確定]
-nvL 就是查看規則, -F 是把當前規則清除,但這個只是臨時的,重啟系統或者重啟 iptalbes 服務後還會加載已經保存的規則,所以需要使用 /etc/init.d/iptables save 保存一下規則,通過上邊的命令輸出我們也可以看到,防火墻規則保存在了/etc/sysconfig/iptables 你可以查看一下這個文件。

1)iptalbes的三個表

filter 這個表主要用於過濾包的,是系統預設的表,這個表也是阿銘用的最多的。內建三個鏈INPUT、OUTPUT以及FORWARD。INPUT作用於進入本機的包;OUTPUT作用於本機送出的包;FORWARD作用於那些跟本機無關的包。

nat 主要用處是網絡地址轉換,也有三個鏈。PREROUTING 鏈的作用是在包剛剛到達防火墻時改變它的目的地址,如果需要的話。OUTPUT鏈改變本地產生的包的目的地址。POSTROUTING鏈在包就要離開防火墻之前改變其源地址。該表阿銘用的不多,但有時候會用到。

mangle 這個表主要是用於給數據包打標記,然後根據標記去操作哪些包。這個表幾乎不怎麽用。除非你想成為一個高級網絡工程師,否則你就沒有必要花費很多心思在它上面。

2)iptables 基本語法

A. 查看規則以及清除規則

[[email protected] ~]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
-t 後面跟表名,-nvL 即查看該表的規則,其中-n表示不針對IP反解析主機名;-L表示列出的意思;而-v表示列出的信息更加詳細。如果不加-t ,則打印filter表的相關信息:

[[email protected] ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
這個和-t filter 打印的信息是一樣的。

關於清除規則的命令中,阿銘用的最多就是:

[[email protected] ~]# iptables -F
[[email protected] ~]# iptables -Z
不加-t默認是針對表filter來操作的,-F 表示把所有規則全部刪除;-Z表示把包以及流量計數器置零(這個阿銘認為很有用)。

B. 增加/刪除一條規則

# iptables -A INPUT -s 10.72.11.12 -p tcp --sport 1234 -d 10.72.137.159 --dport 80 -j DROP
這就是增加了一條規則,省略-t所以針對的是filter表。-A 表示增加一條規則,另外還有-I 表示插入一條規則,-D刪除一條規則;後面的INPUT即鏈名稱,還可以是OUTPUT或者FORWORD;-s 後跟源地址;-p 協議(tcp, udp, icmp); --sport/--dport 後跟源端口/目標端口;-d 後跟目的IP(主要針對內網或者外網);-j 後跟動作(DROP即把包丟掉,REJECT即包拒絕;ACCEPT即允許包)。這樣講可能很亂,那阿銘多舉幾個例子來幫你理解:

[[email protected] ~]# iptables -I INPUT -s 1.1.1.1 -j DROP
上例表示:插入一條規則,把來自1.1.1.1的所有數據包丟掉。

[[email protected] ~]# iptables -D INPUT -s 1.1.1.1 -j DROP
刪除剛剛插入的規則。註意要刪除一條規則時,必須和插入的規則一致,也就是說,兩條iptables命令,除了-I 和-D不一樣外,其他地方都一樣。

[[email protected] ~]# iptables -I INPUT -s 2.2.2.2 -p tcp --dport 80 -j DROP
上例表示把來自2.2.2.2 並且是tcp協議到本機的80端口的數據包丟掉。這裏要說的是,--dport/--sport 必須要和-p選項一起使用,否則會出錯。

[[email protected] ~]# iptables -I OUTPUT -p tcp --dport 22 -d 10.0.2.34 -j DROP
這條規則表示,把發送到10.0.2.34的22端口的數據包丟掉。

至於FORWORD鏈的應用阿銘幾乎沒有用到過,所以不再舉例。再總結一下各個選項的作用:

-A/-D :增加刪除一條規則;

-I :插入一條規則,其實跟-A的效果一樣;

-p :指定協議,可以是tcp,udp或者icmp;

--dport :跟-p一起使用,指定目標端口;

--sport :跟-p一起使用,指定源端口;

-s :指定源IP(可以是一個ip段);

-d :指定目的IP(可以是一個ip段);

-j :後跟動作,其中ACCEPT表示允許包,DROP表示丟掉包,REJECT表示拒絕包;

-i :指定網卡(不常用,但有時候能用到);

[[email protected] ~]# iptables -A INPUT -s 192.168.1.0/24 -i eth0 -j ACCEPT
[[email protected] ~]# iptables -nvL |grep ‘192.168.1.0/24‘
0 0 ACCEPT all -- eth0 * 192.168.1.0/24 0.0.0.0/0
上例中表示,把來自192.168.1.0/24這個網段的並且作用在eth0上的包放行。有時候你的服務器上iptables過多了,想刪除某一條規則時,又不容易掌握當時創建時的規則。其實有一種比較簡單的方法:

[[email protected] ~]# iptables -nvL --line-numbers
Chain INPUT (policy ACCEPT 133 packets, 9740 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT all -- eth0 * 192.168.1.0/24 0.0.0.0/0
刪除某一條規則使用如下命令:

[[email protected] ~]# iptables -D INPUT 1
-D 後跟鏈名,然後是規則num,這個num就是查看iptables規則時第一列的值。再次查看剛才的規則,已經沒有了:

[[email protected] ~]# iptables -nvL --line-numbers
iptables還有一個選項經常用到,-P(大寫)選項,表示預設策略。用法如下:

[[email protected] ~]# iptables -P INPUT DROP
-P後面跟鏈名,策略內容或者為DROP或者為ACCEPT,默認是ACCEPT。註意:如果你在連接遠程服務器,千萬不要隨便敲這個命令,因為一旦你敲完回車你就會斷掉。

這個策略一旦設定後,只能使用 iptables -P INPUT ACCEPT 才能恢復成原始狀態,而不能使用-F參數。下面阿銘針對一個小需求講述一下這個iptables規則如何設定。

需求:只針對filter表,預設策略INPUT鏈DROP,其他兩個鏈ACCEPT,然後針對192.168.137.0/24開通22端口,對所有網段開放80端口,對所有網段開放21端口。這個需求不算復雜,但是因為有多條規則,所以最好寫成腳本的形式。腳本內容如下:

[[email protected] ~]# cat /usr/local/sbin/iptables.sh
#! /bin/bash

ipt="/sbin/iptables"
$ipt -F
$ipt -P INPUT DROP
$ipt -P OUTPUT ACCEPT
$ipt -P FORWARD ACCEPT
$ipt -A INPUT -s 192.168.137.0/24 -p tcp --dport 22 -j ACCEPT
$ipt -A INPUT -p tcp --dport 80 -j ACCEPT
$ipt -A INPUT -p tcp --dport 21 -j ACCEPT
完成腳本的編寫後,直接運行 /bin/sh /usr/local/sbin/iptables.sh 即可。如果想開機啟動時初始化防火墻規則,則需要在 /etc/rc.d/rc.local 中添加一行 “/bin/sh /usr/local/sbin/iptables.sh”

[[email protected] ~]# sh /usr/local/sbin/iptables.sh
[[email protected] ~]# iptables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
20 1580 ACCEPT tcp -- * * 192.168.137.0/24 0.0.0.0/0 tcp dpt:22
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:21
運行腳本後,查看規則就是這樣的,可以看到阿銘的第一條規則中已經有20個包(第一列)被放行過了。

關於icmp的包有一個比較常見的應用:

[[email protected] ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP
--icmp-type 這個選項是要跟-p icmp 一起使用的,後面指定類型編號。這個8指的是能在本機ping通其他機器,而其他機器不能ping通本機。這個有必要記一下。

C. nat表的應用

其實,linux的iptables功能是十分強大的,阿銘曾經的一個老師這樣形容linux的網絡功能:只有想不到沒有做不到!也就是說只要你能夠想到的關於網絡的應用,linux都能幫你實現。在日常生活中相信你接觸過路由器吧,它的功能就是分享上網。本來一根網線過來(其實只有一個公網IP),通過路由器後,路由器分配了一個網段(私網IP),這樣連接路由器的多臺pc都能連接intnet而遠端的設備認為你的IP就是那個連接路由器的公網IP。這個路由器的功能其實就是由linux的iptables實現的,而iptables又是通過nat表作用而實現的這個功能。

至於具體的原理以及過程,阿銘不闡述,請查看相關資料。在這裏舉一個例子來說明iptables如何實現的這個功能。假設你的機器上有兩塊網卡eth0和eth1,其中eth0的IP為10.0.2.68 ,eth1的IP為192.168.1.1 。eth0連接了intnet 但eth1沒有連接,現在有另一臺機器(192.168.1.2)和eth1是互通的,那麽如何設置也能夠讓連接eth1的這臺機器能夠連接intnet(即能和10.0.2.68互通)?

[[email protected] ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
[[email protected] ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
就是這樣簡單的兩條命令就能實現上面的需求。第一個命令涉及到了內核參數相關的配置文件,它的目的是為了打開路由轉發功能,否則無法實現我們的應用。第二個命令則是iptables對nat表做了一個IP轉發的操作,-o 選項後跟設備名,表示出口的網卡,MASQUERADE表示偽裝的意思。 關於nat表,阿銘不想講太多內容,你只要學會這個路由轉發即可。其他的東西交給網絡工程師去學習吧,畢竟你將來可是要做linux系統工程師的。

D. 保存以及備份iptalbes規則

剛才在上面的內容中阿銘也提到了,咱們設定的防火墻規則只是保存在內存中,並沒有保存到某一個文件中,也就說當系統重啟後以前設定的規則就沒有了,所以設定好規則後要先保存一下。

[[email protected] ~]# service iptables save
iptables:將防火墻規則保存到 /etc/sysconfig/iptables: [確定]
它會提示防火墻規則保存在了/etc/sysconfig/iptables文件內,這個文件就是iptables的配置文件了。所以日後,如果你遇到備份防火墻規則的任務,其實就是要拷貝一份這個文件的副本。

有時,我們會需要把防火墻所有規則都清除,使用 iptables -F 命令雖然可以,但是最好的辦法是把防火墻服務停止:

[[email protected] ~]# service iptables stop
iptables:清除防火墻規則: [確定]
iptables:將鏈設置為政策 ACCEPT:nat filter [確定]
iptables:正在卸載模塊: [確定]
這樣防火墻就失效了,但是一旦重新設定規則後(哪怕只有一條),防火墻服務會自動開啟。下面阿銘介紹給你一個用來備份防火墻規則的命令:

[[email protected] ~]# sh /usr/local/sbin/iptables.sh
[[email protected] ~]# iptables-save > myipt.rule
[[email protected] ~]# cat myipt.rule
# Generated by iptables-save v1.4.7 on Sat Jun 1 18:14:03 2013
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [50:4528]
-A INPUT -s 192.168.137.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
COMMIT
# Completed on Sat Jun 1 18:14:03 2013
先執行一下剛才我們寫的iptables腳本,使用 iptables-save 命令重定向到一個文件裏。要想恢復這些規則使用下面的命令即可:

[[email protected] ~]# iptables-restore < myipt.rule

Linux的防火墻