天天看點

Linux的防火牆iptables配置示例

注:内容來自網絡

一、關閉防火牆

1、重新開機後永久性生效:

開啟:chkconfig iptables on

關閉:chkconfig iptables off

2、即時生效,重新開機後失效:

開啟:service iptables start

關閉:service iptables stop

在開啟了防火牆時,做如下設定,開啟相關端口,修改 /etc/sysconfig/iptables 檔案,添加以下内容:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT #允許80端口通過防火牆

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT #允許3306端口通過防火牆

備注:很多網友把這兩條規則添加到防火牆配置的最後一行,導緻防火牆啟動失敗,

正确的應該是添加到預設的22端口這條規則的下面

二、關閉SELinux

vim /etc/selinux/config # 改為 SELINUX=disabled

# 儲存退出,重新開機伺服器

--------------------------------------------------------------------------------------------------------------------------------------------------

以root權限運作下面的指令:

# iptables -L -n -v

參數說明:

-L:列出規則。

-v:顯示詳細資訊。此選項會顯示接口名稱、規則選項和TOS掩碼,以及封包和位元組計數。

-n:以數字形式顯示IP位址和端口,不使用DNS解析。

如果希望輸出的結果中顯示行号,可以運作:

# iptables -L -n -v --line-nmubers

這樣,就可以按照行号在防火牆中添加、删除規則。

要顯示輸入或輸對外連結規則,可以運作:

# iptables -L INPUT -n -v

# iptables -L OUTPUT -n -v --line-numbers

2.停止、開啟和重新開機防火牆

如果你使用的是RHEL/Fedora/CentOS系統,可以運作:

# service iptables stop

# service iptables start

# service iptables restart

我們也可以使用iptables指令停止防火牆并删除所有規則:

# iptables -F

# iptables -X

# iptables -t nat -F

# iptables -t nat -X

# iptables -t mangle -F

# iptables -t mangle -X

# iptables -P INPUT ACCEPT

# iptables -P OUTPUT ACCEPT

# iptables -P FORWARD ACCEPT

參數說明:

-F:删除所有的規則

-X:删除鍊

-t table_name:比對表(稱為nat或mangle)

-P:設定預設政策(如DROP、REJECT或ACCEPT)

3.删除防火牆規則

以帶行号的形式顯示已有的防火牆規則,請運作:

# iptables -L INPUT -n --line-numbers

# iptables -L OUTPUT -n --line-numbers

# iptables -L OUTPUT -n --line-numbers | less

# iptables -L OUTPUT -n --line-numbers | grep 202.54.1.1

下面我們使用行号删除規則:

# iptables -D INPUT 4

将IP位址202.54.1.1從規則中删除:

# iptables -D INPUT -s 202.54.1.1 -j DROP

參數說明:

-D:從選擇的鍊中删除一條或多條規則

4.插入防火牆規則

首先運作下面的指令:

# iptables -L INPUT -n --line-numbers

得到運作結果:

Chain INPUT (policy DROP)

num target prot opt source destination

1 DROP all -- 202.54.1.1 0.0.0.0/0

2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0

在行1和行2之間插入規則:

# iptables -I INPUT 2 -s 202.54.1.2 -j DROP

檢視更新後的規則,會發現插入成功,下面是示例:

Chain INPUT (policy DROP)

Num target prot opt source destination

1 DROP all -- 202.54.1.1 0.0.0.0/0

2 DROP all -- 202.54.1.2 0.0.0.0/0

3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0

5.儲存防火牆規則

在RHEL/Fedora/CentOS Linux下,可以使用下面的指令儲存防火牆規則:

# service iptables save

在其它Linux發行版(如Ubuntu)上,可以使用iptables-save指令儲存防火牆規則:

# iptables-save > /root/my.active.firewall.rules

# cat /root/my.active.firewall.rules

6.重新加載防火牆規則

我們可以使用iptables-restore指令重新加載使用iptables-save指令儲存的防火牆規則:

# iptables-restore < /root/my.active.firewall.rules

我們還可以利用這種特性來快速部署防火牆規則。

7.設定預設防火牆政策

我們首先來配置一個防火牆政策,它預設丢棄所有的網絡資料包:

# iptables -P INPUT DROP

# iptables -P OUTPUT DROP

# iptables -P FORWARD DROP

# iptables -L -v -n

#連接配接失敗,因為防火牆丢棄所有的網絡資料包

# ping cyberciti.biz

# wget http://www.kernel.org/pub/linux/kernel/v3.0/testing/linux-3.2-rc5.tar.bz2

在此基礎上,我們隻關閉入站連接配接:

# iptables -P INPUT DROP

# iptables -P FORWARD DROP

# iptables -P OUTPUT ACCEPT

# iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT

# iptables -L -v -n

#ping和wget可以正常工作

# ping cyberciti.biz

# wget http://www.kernel.org/pub/linux/kernel/v3.0/testing/linux-3.2-rc5.tar.bz2

8.在公網網絡接口上停用私有網絡位址

我們可以從公網網絡接口上删除私有IPv4網段,以防止IP欺騙。運作下面的指令,沒有源路由位址的資料包會被丢棄:

# iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP

# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

下面是私有網絡IPv4位址範圍,請确認在公網接口予以屏蔽:

10.0.0.0/8 -j (A)

172.16.0.0/12 (B)

192.168.0.0/16 (C)

224.0.0.0/4 (多點傳播 D)

240.0.0.0/5 (E)

127.0.0.0/8 (回環)

9.屏蔽IP位址通路

如果我們想屏蔽一個IP位址,比如1.2.3.4,可以運作:

# iptables -A INPUT -s 1.2.3.4 -j DROP

# iptables -A INPUT -s 192.168.0.0/24 -j DROP

10.屏蔽入棧端口請求

如果我們想80端口上屏蔽所有的服務請求,可以運作:

# iptables -A INPUT -p tcp --dport 80 -j DROP

# iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP

隻想屏蔽IP位址1.2.3.4對80端口的請求,可以運作:

# iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP

# iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP

11.屏蔽出棧IP位址

現在我們來示範如何屏蔽對主機名和IP位址的出棧通路。

首先,我們來擷取一個域名的IP位址:

# host -t a cyberciti.biz

輸出示例:

cyberciti.biz has address 75.126.153.206

要屏蔽通路域名cyberciti.biz的網絡資料包,可以運作:

# iptables -A OUTPUT -d 75.126.153.206 -j DROP

下面是使用子網路遮罩的示例:

# iptables -A OUTPUT -d 192.168.1.0/24 -j DROP

# iptables -A OUTPUT -o eth1 -d 192.168.1.0/24 -j DROP

下面我們以屏蔽facebook.com為例,進行說明。首先,我們需要facebook的所有IP位址:

# host -t a www.facebook.com

示例輸出:

www.facebook.com has address 69.171.228.40

找出IP位址69.171.228.40的CIDR:

# whois 69.171.228.40 | grep CIDR

示例輸出:

CIDR:69.171.224.0/19

現在我們來阻止對facebook.com的通路:

# iptables -A OUTPUT -p tcp -d 69.171.224.0/19 -j DROP

我們也可以直接屏蔽域名:

# iptables -A OUTPUT -p tcp -d www.facebook.com -j DROP

# iptables -A OUTPUT -p tcp -d facebook.com -j DROP

12.記錄并丢棄資料包

在公網網絡接口上記錄并丢棄IP位址欺騙資料包:

# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "

# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

預設情況下日志記錄在/var/log/messages檔案中:

# tail -f /var/log/messages

# grep --color \'IP SPOOF\' /var/log/messages

我們還可以用-m參數對日志記錄進行限制,以防止日志檔案過度膨脹。

# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: "

# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

13.根據MAC位址允許或阻止資料包的傳入

我們可以根據MAC位址允許或阻止資料包的傳入:

# iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP

14.屏蔽ICMP ping請求

我們可以通過允許下面的指令屏蔽ping請求:

# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

# iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP

也可以按照特定的網段和主機限制ping請求:

# iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT

以下指令隻接受受限制的ping請求:

#假定預設INPUT政策為丢棄資料包

# iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

# iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT

# iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT

#所有的伺服器都對ping請求作出應答

# iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

15.開啟端口序列

下面的指令可以允許7000到7010範圍内的TCP端口通路:

# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT

16.允許一系列IP位址通路

下面的指令可以允許IP位址範圍

#運作IP位址範圍192.168.1.100 到192.168.1.200 通路80端口

# iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT

#NAT示例

# iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.1.20-192.168.1.25

17.建立連接配接并重新開機防火牆

當重新開機iptables服務時,它會斷開所有已建立的連接配接。這是因為在重新開機防火牆時,會解除安裝IPTABLES_MODULES_UNLOAD子產品。

要解決這個問題,可以編輯/etc/sysconfig/iptables-config

IPTABLES_MODULES_UNLOAD = no

18.使用Crit日志級别

# iptables -A INPUT -s 1.2.3.4 -p tcp --destination-port 80 -j LOG --log-level crit

19.屏蔽或開啟常見端口

屏蔽或開啟常用的TCP、UDP端口:

#可以使用DROP替換ACCEPT,實作端口屏蔽。

#打開22端口(SSH)

# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

# iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT

#打開TCP/UDP631端口(列印服務)

# iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp --dport 631 -j ACCEPT

# iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 631 -j ACCEPT

# 打開123端口,允許區域網路使用者進行NTP時間同步

# iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT

#打開25端口(SMTP)

# iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT

# 打開DNS端口

# iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT

# iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT

#打開http/https端口

# iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT

# iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT

#打開TCP110端口(POP3)

# iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT

#打開TCP143端口

# iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT

#為區域網路使用者開啟Samba通路

# iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT

# iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT

# iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT

# iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT

#為區域網路使用者開啟代理伺服器通路

# iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 3128 -j ACCEPT

#為區域網路使用者開啟MySQL通路

# iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

20.限制用戶端IP的并發連接配接數

我們可以使用connlimit子產品限制用戶端IP的并發連接配接數。下面的指令允許每個用戶端隻能并發3個ssh連接配接:

# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT

設定HTTP并發連接配接為20個:

# iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP

參數說明:

--connlimit-above 3:連接配接數超過3個自動比對

--connlimit-mask 24:子網路遮罩比對

更好的使用iptables

首先,我們要學會檢視man手冊:

$ man iptables

我們還可以這樣檢視幫助:

# iptables -h

我們還可以檢視特定指令的幫助:

# iptables -j DROP -h

測試防火牆

測試端口是否開放:

# netstat -tulpn

測試TCP 80端口是否開放:

# netstat -tulpn | grep :80

如果80端口未開放,請確定啟動Apache伺服器:

# service httpd start

并確定打開iptables防火牆80端口:

# iptables -L INPUT -v -n | grep 80

如果80端口沒有開放,可以運作下面的指令:

# iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT

# service iptables save

下面使用telnet指令測試是否可以連接配接到80端口:

$ telnet www.cyberciti.biz 80

下面是示例輸出:

Trying 75.126.153.206...

Connected to www.cyberciti.biz.

Escape character is \'^]\'.

^]

telnet> quit

Connection closed.

最後,我們也推薦使用嗅探工具(如tcpdump、ngrep)對防火牆設定進行測試。

以上隻是一些基本的防火牆配置政策,如果你想構造更複雜的防火牆政策,需要對TCP/IP和Linux核心配置檔案sysctl.conf進行更深入的學習。(張志平/編譯)

原文連結:Linux: 20 Iptables Examples For New SysAdmins

Linux的防火牆iptables配置示例