ptables簡介html
iptables是基於內核的防火牆,功能很是強大,iptables內置了filter,nat和mangle三張表。linux
filter負責過濾數據包,包括的規則鏈有,input,output和forward;web
nat則涉及到網絡地址轉換,包括的規則鏈有,prerouting,postrouting和output;數據庫
mangle表則主要應用在修改數據包內容上,用來作流量整形的,默認的規則鏈有:INPUT,OUTPUT,NAT,POSTROUTING,PREROUTING;ubuntu
input匹配目的IP是本機的數據包,forward匹配流經本機的數據包,prerouting用來修改目的地址用來作DNAT,postrouting用來修改源地址用來作SNAT。安全
iptables主要參數bash
-A 向規則鏈中添加一條規則,默認被添加到末尾服務器
-T指定要操做的表,默認是filter網絡
-D從規則鏈中刪除規則,能夠指定序號或者匹配的規則來刪除併發
-R進行規則替換
-I插入一條規則,默認被插入到首部
-F清空所選的鏈,重啓後恢復
-N新建用戶自定義的規則鏈
-X刪除用戶自定義的規則鏈
-p用來指定協議能夠是tcp,udp,icmp等也能夠是數字的協議號,
-s指定源地址
-d指定目的地址
-i進入接口
-o流出接口
-j採起的動做,accept,drop,snat,dnat,masquerade
--sport源端口
--dport目的端口,端口必須和協議一塊兒來配合使用
注意:全部鏈名必須大寫,代表必須小寫,動做必須大寫,匹配必須小寫
iptable配置實例
iptable基本操做
iptables -L 列出iptables規則
iptables -F 清除iptables內置規則
iptables -X 清除iptables自定義規則
設定默認規則
在iptables規則中沒有匹配到規則則使用默認規則進行處理
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
配置SSH規則
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT 若是你把OUTPUT 設置成DROP,就須要加上這個規則,不然SSH仍是不能登陸,由於SSH服務職能進不能出。
只容許192.168.0.3的機器進行SSH鏈接
iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT
若是要容許,或限制一段IP地址可用 192.168.0.0/24 表示192.168.0.1-255端的全部IP.
容許loopback迴環通訊
IPTABLES -A INPUT -i lo -p all -j ACCEPT
IPTABLES -A OUTPUT -o lo -p all -j ACCEPT
目的地址轉換,映射內部地址
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dprot 81 -j DNAT --to 192.168.0.2:80
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dprot 81 -j DNAT --to 192.168.0.1-192.168.0.10
源地址轉換,隱藏內部地址
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10
地址假裝,動態ip的NAT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
masquerade和snat的主要區別在於,snat是把源地址轉換爲固定的IP地址或者是地址池,而masquerade在adsl等方式撥號上網時候很是有用,由於是撥號上網因此網卡的外網IP常常變化,這樣在進行地址轉換的時候就要在每次都要修改轉換策略裏面的ip,使用masquerade就很好的解決了這個問題,他會本身去探測外網卡得到的ip地址而後自動進行地址轉換,這樣就算外網得到的ip常常變化也不用人工干預了。
開啓轉發功能
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT 只容許已建鏈接及相關連接對內轉發
ptables -A FORWARD -i eth1 -o eh0 -j ACCEPT 容許對外轉發
過濾某個MAC
iptables -A FORWARD -m mac --mac -source MAC地址 -j DROP
報文通過路由後,數據包中原有的MAC信息會被替換,因此在路由後的iptables中使用mac匹配沒有意義。
數據包整流
iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s -j ACCEPT
iptables -A FORWARD -d 192.168.0.1 -j DROP
多端口匹配
用以一次匹配多個端口
iptables -A INPUT -p tcp -m muliport --dport s 21,22,25,80,110 -j ACCEPT
丟棄非法鏈接
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP
iptables-A FORWARD -m state --state INVALID -j DROP
存儲於恢復iptables規則
iptables-save > somefile
iptables-restore < somefile
轉載請註明:
本文轉自:http://www.liusuping.com/ubuntu-linux/iptables-firewall-setting.html
[root@tp ~]# /etc/rc.d/init.d/iptables save
這樣就能夠寫到/etc/sysconfig/iptables文件裏了.寫入後記得把防火牆重起一下,才能起做用.
[root@tp ~]# service iptables restart
轉自:http://www.cnblogs.com/JemBai/archive/2009/03/19/1416364.html
下面以本身的Web服務器舉例說明之,系統的默認策略是INPUT爲DROP,OUTPUT、FORWARD鏈爲ACCEPT,DROP設置得比較寬鬆,由於咱們知道出去的數據包比較安全;爲了驗證腳本的通用性,我特的查看了服務器的內核及iptables版本,命令以下所示:
1
2
3
4
5
6
7
8
9
10
|
uname
-a
Linux ud50041 2.6.9-34.ELsmp
#1 SMP Fri Feb 24 16:54:53 EST 2006 i686 i686 i386 GNU/Linux
iptables -V
iptables v1.2.11
lsb_release -a
LSB Version: :core-3.0-ia32:core-3.0-noarch:graphics-3.0-ia32:graphics-3.0-noarch
Distributor ID: RedHatEnterpriseAS
Description: Red Hat Enterprise Linux AS release 4 (Nahant Update 3)
Release: 4
Codename: NahantUpdate3
|
你們能夠發現,此係統爲RHEL4_i386系統,系統內核版本爲2.6.9-34,iptables版本爲1.2.11;另外我在別的Centos5.5 x86_64機器上也成功部署了此腳本;因爲後續的recent安全模塊對系統內核有要求(這個做爲主機防禦腳本也常常用到),若是你們要採用iptables做爲主機防火牆時,建議用Centos5.6 x86_64或更高級版本,否則系統會有以下提示錯誤信息:
1
2
3
4
5
|
iptables: Unknown error 18446744073709551615
iptables:Invalid argument
在
tail
-f
/var/log/messages
時能發下面的的出錯提示
ip_tables: connlimit match: invalid size 32 != 16
ip_tables: connlimit match: invalid size 32 != 24
|
另外,在生產環境下調試iptables腳本前,強烈建議編寫crontab任務,每5分鐘關閉一次iptalbes腳本,防止將SSH客戶端鎖在外面,命令以下所示:
1
|
*
/5
* * * * root
/etc/init
.d
/iptables
stop
|
腳本代碼以下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#!/bin/bash
iptables -F
iptables -F -t nat
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
#load connection-tracking modules
modprobe iptable_nat
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -A INPUT -f -m limit --limit 100
/sec
--limit-burst 100 -j ACCEPT
iptables -A INPUT -p icmp --icmp-
type
echo
-request -m limit --limit 1
/s
--limit-burst 10 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 20
/sec
--limit-burst 200 -j ACCEPT
iptables -A INPUT -s 122.70.x.x -j ACCEPT
iptables -A INPUT -s 122.70.x.x -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 80,22 -j ACCEPT
|
這裏有一種特殊狀況,因爲此Web服務器是置於負載均衡器後面,因此與負載均衡器的鏈接仍是很頻繁的;因此咱們要容許數據源地址爲負載均衡器的數據包經過;另外,個人許多基於LNMP的小網站上面也部署了此腳本,即Web服務和MySQL數據庫同時安裝在一臺機器上,也沒有開放3306端口,這個靠Web調用PHP程序實現訪問。
成功運行此腳本後系統應該是不會報錯的,命令以下:
1
|
iptables -nv –L
|
此命令顯示結果以下(此爲另外一臺LNMP機器的腳本顯示結果):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
Chain INPUT (policy DROP 610 packets, 50967 bytes)
pkts bytes target prot opt
in
out
source
destination
0 0 ACCEPT all -f * * 0.0.0.0
/0
0.0.0.0
/0
limit: avg 100
/sec
burst 100
6100 314K ACCEPT tcp -- * * 0.0.0.0
/0
0.0.0.0
/0
tcp flags:0x16
/0x02
limit: avg 20
/sec
burst 200
1052 67637 ACCEPT all -- * * 122.70.x.x 0.0.0.0
/0
986 58112 ACCEPT all -- * * 122.70.x.x 0.0.0.0
/0
918 131K ACCEPT all -- lo * 0.0.0.0
/0
0.0.0.0
/0
97056 12M ACCEPT all -- * * 0.0.0.0
/0
0.0.0.0
/0
state RELATED,ESTABLISHED
4325 218K ACCEPT tcp -- * * 0.0.0.0
/0
0.0.0.0
/0
multiport dports 80,22
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt
in
out
source
destination
0 0 ACCEPT icmp -- * * 0.0.0.0
/0
0.0.0.0
/0
icmp
type
8 limit: avg 1
/sec
burst 10
Chain OUTPUT (policy ACCEPT 144K packets, 155M bytes)
pkts bytes target prot opt
in
out
source
destination
956 134K ACCEPT all -- * lo 0.0.0.0
/0
0.0.0.0
/0
|
下面我稍爲詳細的解釋下此腳本:
在主機的防禦上咱們配置了一些安全措施,以防止外部的ping和SYN洪水攻擊,而且考慮到外部的瘋狂端口掃描軟件可能會影響服務器的入口帶寬,因此在這裏也作了限制。命令以下所示:
1
|
iptables -A INPUT -p tcp --syn -m limit --limit 100
/s
--limit-burst 100 -j ACCEPT
|
上面的命令每秒鐘最多容許100個新鏈接,請注意這裏的新鏈接指的是state爲New的數據包,在後面咱們也配置了容許狀態爲ESTABLISHED和RELATED的數據經過;另外,100這個閥值則要根據服務器的實際狀況來調整,若是是併發量不大的服務器這個數值就要調小,若是是訪問量很是大且併發數不小的服務器,這個值則還須要調大。再看如下命令:
1
2
3
|
iptables -A INPUT -p icmp --icmp-
type
echo
-request -m limit --limit 1
/s
–limit-burst 10 -j ACCEPT
這是爲了防止
ping
洪水攻擊,限制每秒的
ping
包不超過10個。
iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 20
/sec
--limit-burst 200 -j ACCEPT
|
上面的命令防止各類端口掃描,將SYN及ACK SYN限制爲每秒鐘不超過200個,省得把數務器帶寬耗盡了。
iptables防火牆運行後,咱們能夠運行nmap工具進行掃描,命令以下:
1
|
nmap -P0 -sS 211.143.6.x
|
此命令的執行結果以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
Starting Nmap 4.11 ( http:
//www
.insecure.org
/nmap/
) at 2009-03-29 16:21 CST
Interesting ports on 211.143.6.X:
Not shown: 1668 closed ports
PORT STATE SERVICE
22
/tcp
open
ssh
25
/tcp
open
smtp
80
/tcp
open
http
110
/tcp
open
pop3
111
/tcp
open
rpcbind
143
/tcp
open
imap
443
/tcp
open
https
465
/tcp
open
smtps
587
/tcp
open
submission
993
/tcp
open
imaps
995
/tcp
open
pop3s
1014
/tcp
open
unknown
|
在這裏,咱們發現一個1014端被某個進程打開了,用lsof -i:1014查看發現又是rpc.statd打開的,這服務每次用的端口都不同啊!原本想置之不理的,可是若是rpc.statd不能正確處理SIGPID信號,遠程攻擊者可利用這個漏洞關閉進程,進行拒絕服務攻擊,因此仍是得想辦法解決掉,咱們發現rpc.statd是由服務nfslock開啓的,進一步查詢得知它是一個可選的進程,它容許NFS客戶端在服務器上對文件加鎖。這個進程對應於nfslock服務,因而咱們關掉了此服務,命令以下所示:
1
2
|
service nfslock stop
chkconfig nfslock off
|
若是沒有硬件防火牆保護的話,置於IDC機房而且有公網的Web服務器仍是頗有用iptables保護的必要,若是發現有人用工具惡意頻繁鏈接咱們的Web服務器,咱們能夠調用recent模塊來阻止它們,咱們的作法是:儘可能在每一臺有公網IP的機器上部署iptables防火牆。
本文出自 「撫琴煮酒」 博客,請務必保留此出處http://andrewyu.blog.51cto.com/1604432/716016
兩篇更詳細的教程:一個是翻譯的
https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html
https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html