iptables

iptables四個表五條鏈mysql

 

    其實關於iptables的使用網上的資料和教程也比較多,主要是要理解其中的路由前和路由後每一個表和鏈所處的位置和做用,明白了也就簡單了,如下是我轉載的以爲寫的比較詳細的一篇博客,有時間我將寫一篇關於這些表和鏈的實質性的配置例子。linux

 

1、netfilter和iptables說明:web

    一、   netfilter/iptables IP 信息包過濾系統是一種功能強大的工具,可用於添加、編輯和除去規則,這些規則是在作信息包過濾決定時,防火牆所遵循和組成的規則。這些規則存儲在專用的信息包過濾表中,而這些表集成在 Linux 內核中。在信息包過濾表中,規則被分組放在咱們所謂的鏈(chain)中。sql

   雖然 netfilter/iptables IP 信息包過濾系統被稱爲單個實體,但它實際上由兩個組件 netfilter 和 iptables 組成。bash

     (1). netfilter 組件也稱爲內核空間(kernelspace),是內核的一部分,由一些信息包過濾表組成,這些表包含內核用來控制信息包過濾處理的規則集。服務器

     (2). iptables 組件是一種工具,也稱爲用戶空間(userspace),它使插入、修改和除去信息包過濾表中的規則變得容易。cookie

      iptables包含4個表,5個鏈。其中表是按照對數據包的操做區分的,鏈是按照不一樣的Hook點來區分的,表和鏈其實是netfilter的兩個維度。網絡

  二、 4個表:filter,nat,mangle,raw,默認表是filter(沒有指定表的時候就是filter表)。表的處理優先級:raw>mangle>nat>filter。tcp

          filter:通常的過濾功能工具

          nat:用於nat功能(端口映射,地址映射等)

          mangle:用於對特定數據包的修改

          raw:有限級最高,設置raw時通常是爲了避免再讓iptables作數據包的連接跟蹤處理,提升性能

     RAW 表只使用在PREROUTING鏈和OUTPUT鏈上,由於優先級最高,從而能夠對收到的數據包在鏈接跟蹤前進行處理。一但用戶使用了RAW表,在某個鏈 上,RAW表處理完後,將跳過NAT表和 ip_conntrack處理,即再也不作地址轉換和數據包的連接跟蹤處理了.

         RAW表能夠應用在那些不須要作nat的狀況下,以提升性能。如大量訪問的web服務器,可讓80端口再也不讓iptables作數據包的連接跟蹤處理,以提升用戶的訪問速度。

 三、 5個鏈:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。

           PREROUTING:數據包進入路由表以前

           INPUT:經過路由表後目的地爲本機

           FORWARD:經過路由表後,目的地不爲本機

           OUTPUT:由本機產生,向外轉發

           POSTROUTIONG:發送到網卡接口以前。以下圖:

         

           

spacer.gif

 

    iptables中表和鏈的對應關係以下:

     spacer.gif

 

 

2、iptables的數據包的流程是怎樣的?

一個數據包到達時,是怎麼依次穿過各個鏈和表的(圖)。 

 

 

基本步驟以下: 
1. 數據包到達網絡接口,好比 eth0。 
2. 進入 raw 表的 PREROUTING 鏈,這個鏈的做用是趕在鏈接跟蹤以前處理數據包。 
3. 若是進行了鏈接跟蹤,在此處理。 
4. 進入 mangle 表的 PREROUTING 鏈,在此能夠修改數據包,好比 TOS 等。 
5. 進入 nat 表的 PREROUTING 鏈,能夠在此作DNAT,但不要作過濾。 
6. 決定路由,看是交給本地主機仍是轉發給其它主機。 

到了這裏咱們就得分兩種不一樣的狀況進行討論了,一種狀況就是數據包要轉發給其它主機,這時候它會依次通過: 
7. 進入 mangle 表的 FORWARD 鏈,這裏也比較特殊,這是在第一次路由決定以後,在進行最後的路由決定以前,咱們仍然能夠對數據包進行某些修改。 
8. 進入 filter 表的 FORWARD 鏈,在這裏咱們能夠對全部轉發的數據包進行過濾。須要注意的是:通過這裏的數據包是轉發的,方向是雙向的。 
9. 進入 mangle 表的 POSTROUTING 鏈,到這裏已經作完了全部的路由決定,但數據包仍然在本地主機,咱們還能夠進行某些修改。 
10. 進入 nat 表的 POSTROUTING 鏈,在這裏通常都是用來作 SNAT ,不要在這裏進行過濾。 
11. 進入出去的網絡接口。完畢。 

另外一種狀況是,數據包就是發給本地主機的,那麼它會依次穿過: 
7. 進入 mangle 表的 INPUT 鏈,這裏是在路由以後,交由本地主機以前,咱們也能夠進行一些相應的修改。 
8. 進入 filter 表的 INPUT 鏈,在這裏咱們能夠對流入的全部數據包進行過濾,不管它來自哪一個網絡接口。 
9. 交給本地主機的應用程序進行處理。 
10. 處理完畢後進行路由決定,看該往那裏發出。 
11. 進入 raw 表的 OUTPUT 鏈,這裏是在鏈接跟蹤處理本地的數據包以前。 
12. 鏈接跟蹤對本地的數據包進行處理。 
13. 進入 mangle 表的 OUTPUT 鏈,在這裏咱們能夠修改數據包,但不要作過濾。 
14. 進入 nat 表的 OUTPUT 鏈,能夠對防火牆本身發出的數據作 NAT 。 
15. 再次進行路由決定。 
16. 進入 filter 表的 OUTPUT 鏈,能夠對本地出去的數據包進行過濾。 
17. 進入 mangle 表的 POSTROUTING 鏈,同上一種狀況的第9步。注意,這裏不光對通過防火牆的數據包進行處理,還對防火牆本身產生的數據包進行處理。 
18. 進入 nat 表的 POSTROUTING 鏈,同上一種狀況的第10步。 
19. 進入出去的網絡接口。完畢。


  3、iptables raw表的使用

增長raw表,在其餘表處理以前,-j NOTRACK跳過其它表處理
狀態除了之前的四個還增長了一個UNTRACKED

例如:
可使用 「NOTRACK」 target 容許規則指定80端口的包不進入連接跟蹤/NAT子系統

iptables -t raw -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j NOTRACK
iptables -t raw -A PREROUTING -s 1.2.3.4 -p tcp --sport 80 -j NOTRACK
iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT

  4、解決ip_conntrack: table full, dropping packet的問題


在啓用了iptables web服務器上,流量高的時候常常會出現下面的錯誤:

ip_conntrack: table full, dropping packet

這個問題的緣由是因爲web服務器收到了大量的鏈接,在啓用了iptables的狀況下,iptables會把全部的鏈接都作連接跟蹤處理,這樣iptables就會有一個連接跟蹤表,當這個表滿的時候,就會出現上面的錯誤。

iptables的連接跟蹤表最大容量爲/proc/sys/net/ipv4/ip_conntrack_max,連接碰到各類狀態的超時後就會從表中刪除。

因此解決方法通常有兩個:

(1) 加大 ip_conntrack_max 值

vi /etc/sysctl.conf

net.ipv4.ip_conntrack_max = 393216
net.ipv4.netfilter.ip_conntrack_max = 393216

(2): 下降 ip_conntrack timeout時間

vi /etc/sysctl.conf

net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120


上面兩種方法打個比喻就是燒水水開的時候,換一個大鍋。通常狀況下均可以解決問題,可是在極端狀況下,仍是不夠用,怎麼辦?

這樣就得反其道而行,用釜底抽薪的辦法。iptables的raw表是不作數據包的連接跟蹤處理的,咱們就把那些鏈接量很是大的連接加入到iptables raw表。

如一臺web服務器能夠這樣:

iptables -t raw -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j NOTRACK
iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT

5、實例說明:

一、單個規則實例

iptables -F?

# -F 是清除的意思,做用就是把 FILTRE TABLE 的全部鏈的規則都清空

iptables -A INPUT -s 172.20.20.1/32 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#在 FILTER 表的 INPUT 鏈匹配源地址是172.20.20.1的主機,狀態分別是NEW,ESTABLISHED,RELATED 的都放行。

iptables -A INPUT -s 172.20.20.1/32 -m state --state NEW,ESTABLISHED -p tcp -m multiport --dport 123,110 -j ACCEPT

# -p 指定協議,-m 指定模塊,multiport模塊的做用就是能夠連續匹配多各不相鄰的端口號。完整的意思就是源地址是172.20.20.1的主機,狀態分別是NEW, ESTABLISHED,RELATED的,TCP協議,目的端口分別爲123 和 110 的數據包均可以經過。

iptables -A INPUT -s 172.20.22.0/24 -m state --state NEW,ESTABLISHED -p tcp -m multiport --dport 123,110 -j ACCEPT

iptables -A INPUT -s 0/0 -m state --state NEW -p tcp -m multiport --dport 123,110 -j DROP

#這句意思爲源地址是0/0的 NEW狀態的的TCP數據包都禁止訪問個人123和110端口。

iptables -A INPUT -s ! 172.20.89.0/24 -m state --state NEW -p tcp -m multiport --dport 1230,110 -j DROP

# "!"號的意思 取反。就是除了172.20.89.0這個IP段的地址都DROP。

iptables -R INPUT 1 -s 192.168.6.99 -p tcp --dport 22 -j ACCEPT

替換INPUT鏈中的第一條規則

iptables -t filter -L INPUT -vn

以數字形式詳細顯示filter表INPUT鏈的規則

#-------------------------------NAT IP--------------------------------------

#如下操做是在 NAT TABLE 裏面完成的。請你們注意。

iptables -t nat -F

iptables -t nat -A PREROUTING -d 192.168.102.55 -p tcp --dport 90 -j DNAT --to 172.20.11.1:800

#-A PREROUTING 指定在路由前作的。完整的意思是在 NAT TABLE 的路由前處理,目的地爲192.168.102.55 的 目的端口爲90的咱們作DNAT處理,給他轉向到172.20.11.1:800那裏去。

iptables -t nat -A POSTROUTING -d 172.20.11.1 -j SNAT --to 192.168.102.55

#-A POSTROUTING 路由後。意思爲在 NAT TABLE 的路由後處理,凡是目的地爲 172.20.11.1 的,咱們都給他作SNAT轉換,把源地址改寫成 192.168.102.55 。

iptables -A INPUT -d 192.168.20.0/255.255.255.0 -i eth1 -j DROP

iptables -A INPUT -s 192.168.20.0/255.255.255.0 -i eth1 -j DROP

iptables -A OUTPUT -d 192.168.20.0/255.255.255.0 -o eth1 -j DROP

iptables -A OUTPUT -s 192.168.20.0/255.255.255.0 -o eth1 -j DROP

# 上例中,eth1是一個與外部Internet相連,而192.168.20.0則是內部網的網絡號,上述規則用來防止IP欺騙,由於出入eth1的包的ip應該是公共IP

iptables -A INPUT -s 255.255.255.255 -i eth0 -j DROP

iptables -A INPUT -s 224.0.0.0/224.0.0.0 -i eth0 -j DROP

iptables -A INPUT -d 0.0.0.0 -i eth0 -j DROP

# 防止廣播包從IP代理服務器進入局域網:

iptables -A INPUT -p tcp -m tcp --sport 5000 -j DROP

iptables -A INPUT -p udp -m udp --sport 5000 -j DROP

iptables -A OUTPUT -p tcp -m tcp --dport 5000 -j DROP

iptables -A OUTPUT -p udp -m udp --dport 5000 -j DROP

# 屏蔽端口 5000

iptables -A INPUT -s 211.148.130.129 -i eth1 -p tcp -m tcp --dport 3306 -j DROP

iptables -A INPUT -s 192.168.20.0/255.255.255.0 -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT

iptables -A INPUT -s 211.148.130.128/255.255.255.240 -i eth1 -p tcp -m tcp --dport 3306 -j ACCEPT

iptables -A INPUT -p tcp -m tcp --dport 3306 -j DROP

# 防止 Internet 網的用戶訪問 MySQL 服務器(就是 3306 端口)

iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset

#REJECT, 相似於DROP,但向發送該包的主機回覆由--reject-with指定的信息,從而能夠很好地隱藏防火牆的存在

二、www的iptables實例

#!/bin/bash

export PATH=/sbin:/usr/sbin:/bin:/usr/bin

#加載相關模塊

modprobe iptable_nat

modprobe ip_nat_ftp

modprobe ip_nat_irc

modprobe ip_conntrack

modprobe ip_conntrack_ftp

modprobe ip_conntrack_irc

modprobe ipt_limit

echo 1 >;/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

echo 0 >;/proc/sys/net/ipv4/conf/all/accept_source_route

echo 0 >;/proc/sys/net/ipv4/conf/all/accept_redirects

echo 1 >;/proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

echo 1 >;/proc/sys/net/ipv4/conf/all/log_martians

echo 1 >;/proc/sys/net/ipv4/tcp_syncookies

iptables -F

iptables -X

iptables -Z

## 容許本地迴路?Loopback - Allow unlimited traffic

iptables -A INPUT -i lo -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT

## 防止SYN洪水?SYN-Flooding Protection

iptables -N syn-flood

iptables -A INPUT -i ppp0 -p tcp --syn -j syn-flood

iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN

iptables -A syn-flood -j DROP

## 確保新鏈接是設置了SYN標記的包?Make sure that new TCP connections are SYN packets

iptables -A INPUT -i eth0 -p tcp ! --syn -m state --state NEW -j DROP

## 容許HTTP的規則

iptables -A INPUT -i ppp0 -p tcp -s 0/0 --sport 80 -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -i ppp0 -p tcp -s 0/0 --sport 443 -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -i ppp0 -p tcp -d 0/0 --dport 80 -j ACCEPT

iptables -A INPUT -i ppp0 -p tcp -d 0/0 --dport 443 -j ACCEPT

## 容許DNS的規則

iptables -A INPUT -i ppp0 -p udp -s 0/0 --sport 53 -m state --state ESTABLISHED -j ACCEPT

iptables -A INPUT -i ppp0 -p udp -d 0/0 --dport 53 -j ACCEPT

## IP包流量限制?IP packets limit

iptables -A INPUT -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

iptables -A INPUT -i eth0 -p icmp -j DROP

## 容許SSH

iptables -A INPUT -p tcp -s ip1/32 --dport 22 -j ACCEPT

iptables -A INPUT -p tcp -s ip2/32 --dport 22 -j ACCEPT

## 其它狀況不容許?Anything else not allowed

iptables -A INPUT -i eth0 -j DROP

三、一個包過濾防火牆實例

環境:redhat9 加載了string time等模塊

eth0 接外網──ppp0

eth1 接內網──192.168.0.0/24

#!/bin/sh

#

modprobe ipt_MASQUERADE

modprobe ip_conntrack_ftp

modprobe ip_nat_ftp

iptables -F

iptables -t nat -F

iptables -X

iptables -t nat -X

########################### INPUT鍵 ###################################

iptables -P INPUT DROP

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -p tcp -m multiport --dports 110,80,25 -j ACCEPT

iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 139 -j ACCEPT

#容許內網samba,smtp,pop3,鏈接

iptables -A INPUT -i eth1 -p udp -m multiport --dports 53 -j ACCEPT

#容許dns鏈接

iptables -A INPUT -p tcp --dport 1723 -j ACCEPT

iptables -A INPUT -p gre -j ACCEPT

#容許外網***鏈接

iptables -A INPUT -s 192.186.0.0/24 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -i ppp0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP

#爲了防止DoS太多鏈接進來,那麼能夠容許最多15個初始鏈接,超過的丟棄

iptables -A INPUT -s 192.186.0.0/24 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP

#爲了防止DoS太多鏈接進來,那麼能夠容許最多15個初始鏈接,超過的丟棄

iptables -A INPUT -p icmp -m limit --limit 3/s -j LOG --log-level INFO --log-prefix "ICMP packet IN: "

iptables -A INPUT -p icmp -j DROP

#禁止icmp通訊-ping 不通

iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/24 -j MASQUERADE

#內網轉發

iptables -N syn-flood

iptables -A INPUT -p tcp --syn -j syn-flood

iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN

iptables -A syn-flood -j REJECT

#防止SYN攻擊 輕量

iptables -P FORWARD DROP

iptables -A FORWARD -p tcp -s 192.168.0.0/24 -m multiport --dports 80,110,21,25,1723 -j ACCEPT

iptables -A FORWARD -p udp -s 192.168.0.0/24 --dport 53 -j ACCEPT

iptables -A FORWARD -p gre -s 192.168.0.0/24 -j ACCEPT

iptables -A FORWARD -p icmp -s 192.168.0.0/24 -j ACCEPT

#容許 ***客戶走***網絡鏈接外網

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -I FORWARD -p udp --dport 53 -m string --string "tencent" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP

#星期一到星期六的8:00-12:30禁止qq通訊

iptables -I FORWARD -p udp --dport 53 -m string --string "TENCENT" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP

#星期一到星期六的8:00-12:30禁止qq通訊

iptables -I FORWARD -p udp --dport 53 -m string --string "tencent" -m time --timestart 13:30 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP

iptables -I FORWARD -p udp --dport 53 -m string --string "TENCENT" -m time --timestart 13:30 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP

#星期一到星期六的13:30-20:30禁止QQ通訊

iptables -I FORWARD -s 192.168.0.0/24 -m string --string "qq.com" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP

#星期一到星期六的8:00-12:30禁止qq網頁

iptables -I FORWARD -s 192.168.0.0/24 -m string --string "qq.com" -m time --timestart 13:00 --timestop 20:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP

#星期一到星期六的13:30-20:30禁止QQ網頁

iptables -I FORWARD -s 192.168.0.0/24 -m string --string "ay2000.NET" -j DROP

iptables -I FORWARD -d 192.168.0.0/24 -m string --string "寬頻影院" -j DROP

iptables -I FORWARD -s 192.168.0.0/24 -m string --string "×××" -j DROP

iptables -I FORWARD -p tcp --sport 80 -m string --string "廣告" -j DROP

#禁止ay2000.Net,寬頻影院,×××,廣告網頁鏈接 !但中文 不是很理想

iptables -A FORWARD -m ipp2p --edk --kazaa --bit -j DROP

iptables -A FORWARD -p tcp -m ipp2p --ares -j DROP

iptables -A FORWARD -p udp -m ipp2p --kazaa -j DROP

#禁止BT鏈接

iptables -A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 --connlimit-mask 24 -j DROP

#只容許每組ip同時15個80端口轉發

#######################################################################

sysctl -w net.ipv4.ip_forward=1 &>/dev/null

#打開轉發

#######################################################################

sysctl -w net.ipv4.tcp_syncookies=1 &>/dev/null

#打開 syncookie (輕量級預防 DOS 攻擊)

sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=3800 &>/dev/null

#設置默認 TCP 鏈接癡呆時長爲 3800 秒(此選項能夠大大下降鏈接數)

sysctl -w net.ipv4.ip_conntrack_max=300000 &>/dev/null

#設置支持最大鏈接樹爲 30W(這個根據你的內存和 iptables 版原本,每一個 connection 須要 300 多個字節)

#######################################################################

iptables -I INPUT -s 192.168.0.50 -j ACCEPT

iptables -I FORWARD -s 192.168.0.50 -j ACCEPT

#192.168.0.50是個人機子,所有放行!

相關文章
相關標籤/搜索