iptables筆記

iptables筆記
Iptables是管理Netfilter的唯一工具,Netfilter直接嵌入在Linux內核。他可以爲個人工作站創建一個防火牆,也可以爲一個子網創建防火牆,以保護其他的系統平臺(市場上有很大一部分硬件防火牆也是使用iptables系統的)。
Netfilter在內核中過濾,沒有守護進程,在OSI模型的第2、3、4層插入策略。過濾的速度非常快,因爲他只讀取數據包頭,不會給信息流量增加負擔,也無需進行驗證。
Netfilter提供了一系列的表(tables),每個表由若干個鏈(chains)組成,而每條鏈可以由一條或若干條規則(rules)組成。
實際上netfilter 是表的容器,表是鏈的容器,而鏈又是規則的容器。

Netfilter表和Netfilter鏈:

表說明:
Filter:這個表主要執行數據包過濾。
Nat:主要進行網絡地址轉換。
Managle:用於修改一些特殊的規則。
鏈說明:
PREROUTING:路由之前,剛到達的數據包。(nat)
INPUT:通過路由,目的地爲本機的數據包。(filter)
FORWARD:需要通過本地系統進行轉發的數據包。(filter)
OUTPUT:由本機產生,向外轉發,處於POSTROUTING之前的數據包。(nat和filter)
POSTROUTIONG:通過路由後,即將離開系統的數據包。(nat)
Netfilter的數據包流程:

Iptables 基本語法:
iptables 內置了filter、nat 和mangle 三張表,我們可以使用-t 參數來設置對哪張表生效,也可以省略-t 參數,則默認對filter 表進行操作。

圖中:這句的意思就是:來自(源地址)192.168.0.1的INPUT鏈的數據包直接丟棄。
Iptables進程服務命令:
service iptables save 保存iptables設置,對iptables規則編輯後一定要保存。
service iptables restart 保存設置以後不重啓則設置不生效,要設置生效請重啓。
service iptables status 檢查iptables的設置。類似於iptable –L命令。
Iptables基本的鏈操作命令:
-L 列出某個鏈或者表中的規則: service iptables status 把這個命令和-L比較下
iptables –L:顯示filter表中的規則等同於iptables –t filter -L

iptables –t nat –L :顯示nat表的中的設置:
-F 刪除某個鏈或者表中的規則:
iptables –F (iptables –t filter –F) 刪除filter表中的所有規則;
iptables –t nat –F 刪除nat表中的所有規則;
iptables –t nat –F POSTROUTING 刪除nat表中POSTROUTING鏈的所有規則;
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
-A添加一條規則(在當前的規則後添加,也就是排在所有規則後):
iptables -A INPUT –s 192.168.0.1 –j DROP
和實例圖中的功能相同,丟棄來自192.168.0.1的數據包,這裏省略了-t filter。
添加該語句後,保存設置並重新啓動iptalbes 服務,並通過-L的命令查看,就會發現剛添加的這條規則排列在所有規則後。
-----------iptables的匹配規則是按順序排列的。
-I在指定位置插入一條規則:
(如果有迴環規則(iptables –A INPUT –I lo –j ACCEPT,則迴環永遠是第一條)
iptables –I <CHAIN> 作爲第一條規則插入。
iptables <CHAIN> X 作爲第X條規則插入,X這裏代表規則順序號。
iptables –A INPUT –p tcp –s 192.168.0.1/24 --dport 22 –j ACCEPT 大家把這條寫法記住,以後經常會用到。
允許192.168.0.1 通過22端口訪問該主機,把它作爲第一條規則插入iptables規則列表。
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
-----------iptables的匹配規則是按順序排列的。
-P <CHAIN TARGET> 分配連接策略。
iptables –P INPUT DROP 禁止任何輸入的數據包。這句慎用。
iptables –P OUTPUT ACCEPT 允許所有輸出的數據包。
-D刪除某一條規則:
Iptables –D <CHAIN> X 刪除某個鏈的第幾條規則
iptables –D INPUT 3 刪除INPUT鏈上的第3條規則。
iptables –P INPUT DROP 這個不能使用刪除語句刪除,只能到本機輸入iptables –P INPUT ACCEPT
Iptables中的匹配:
iptables –A INPUT –p tcp –s 192.168.0.1 --dport 22 –j ACCEPT
這個命令我們在上面已經看過了,我們來看下其他的一些匹配參數。
-p protocol 匹配網絡協議,例子中匹配tcp協議。
-s IP地址或者網段 匹配源IP地址或者網段
例子中匹配一個IP的,如果要匹配一個網段則如下
-s 192.168.0.0/24
如果是除這個網段之外的所有則爲:! -s 192.168.0.1/24
如果是除這個IP之外的所有則爲:! -s 192.168.0.1
--dport X 匹配目的端口號,X代表具體端口號。
--sport X 匹配源端口號,X代表具體端口號。
Iptables中的目的:
我們已經在前面看到過-j 後面跟的就是目的。
ACCEPT:允許數據包通過。
DROP:直接丟棄數據包。
REJECT:丟棄數據包,同時發送響應報文通知對方。
設置Iptables預設規則(本地機防火牆):
1、清除iptables設置:iptables –F
2、設置迴環允許規則,沒有這個規則好多服務不能啓動:
iptables –A INPUT –i lo –j ACCETP 允許本地迴環接口
iptables –A INPUT –p tcp --dport 20:21 –j ACCEPT 開放FTP的20、21端口。還記得我們將FTP的時候,如果開啓防火牆。注意!!
iptables –A INPUT –P tcp --dport 80 –j ACCEPT開放http的80端口。
iptables –I INPUT –p tcp –dport 22 –j ACCEPT開放SSH服務的22端口。
4、iptables -A INPUT –j REJECT 禁止進入數據包----慎用該句。
5、iptables -P FORWARD DROP 禁止轉發數據包
6、iptables -P OUTPUT ACCEPT允許外發數據包

設置Iptables FORWORD規則:
一般情況FORWORD鏈式DROP的,但是當用來做NAT的時候我們就需要設置他了。
首先要開啓轉發功能:編輯/etc/sysctl.conf文件

sysctl -p 來使修改生效

<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
NAT服務
(一).什麼是私有地址
私有地址(Private address)屬於非註冊地址,是專門爲組織機構內部使用而劃定的。使用私有IP地址是無法直接連接到Internet的,但是能夠用在公司內部的 Intranet的IP地址上 。
(二).什麼是NAT
NAT是將一個地址域(如專用Intranet)映射到另一個地址域(如Internet)的標準方法。它是一個根據RFC 1631開發的IETF標準,允許一個IP地址域以一個公有IP地址出現在Internet上。NAT可以將內部網絡中的所有節點的地址轉換成一個IP地 址,反之亦然。它也可以應用到防火牆技術裏,把個別IP地址隱藏起來不被外部發現,使外部無法直接訪問內部網絡設備。
NAT的工作原理
1.靜態網絡地址轉換
① 在NAT服務器上建立靜態NAT映射表。
② 當內部主機(IP地址爲192.168.16.10)需要建立一條到Internet的會話連接時,首先將請求發送到NAT服務器上。NAT服務器接收到請求後,會根據接收到的請求數據包檢查NAT映射表。
③ 如果已經爲該地址配置了靜態地址轉換,NAT服務器就使用相對應的公有IP地址,並轉發數據包,否則NAT服務器不對地址進行轉換,直接將數據包丟棄。 NAT服務器使用202.96.128.2來替換內部私有IP(192.168.16.10)
④ Internet上的主機接收到數據包後進行應答(這時主機接收到202.96.128.2的請求)。
⑤ 當NAT服務器接收到來自Internet上的主機的數據包後,檢查NAT映射表。如果NAT映射表存在匹配的映射項,則使用內部私有IP替換數據包的目IP地址,並將數據包轉發給內部主機。如果不存在匹配映射項則將數據包丟棄。
動態網絡地址轉換
① 當內部主機(IP地址爲192.168.16.10)需要建立一條到Internet的會話連接時,首先將請求發送到NAT服務器上。NAT服務器接收到 請求後,根據接收到的請求數據包檢查NAT映射表。
② 如果還沒有爲該內部主機建立地址轉換映射項,NAT服務器就會決定對該地址進行轉換(建立 192.168.16.10:2320←→202.96.128.2:2320的映射項,並記錄會話狀態)。如果已經存在該映射項,則NAT服務器使用該 記錄進行地址轉換,並記錄會話狀態。然後NAT服務器利用轉換後的地址發送數據包到Internet主機上。
③ Internet主機接收到信息後,進行應答,並將應答信息回傳給NAT服務器。
④ 當NAT服務器接收到應答信息後,檢查NAT映射表。如果NAT映射表存在匹配的映射項,則使用內部公有IP替換數據包的目的IP地址,並將數據包轉發給 內部主機。如果不存在匹配映射項則將數據包丟棄。
網絡地址端口轉換
① 當內部主機(IP地址爲192.168.16.10,使用端口1235)需要與Internet上的某主機(IP地址爲202.18.4.6,端口爲 2350)建立連接時,首先將請求發送到NAPT服務器上。NAPT服務器接收到請求後,會根據接收到的請求數據包檢查NAPT映射表。
②如果還沒有爲該內部主機建立地址轉換映射項,NAPT服務器就會爲這個傳輸創建一個Session,並且給這個Session分配一個端口3200,然 後改變這個數據包的源端口爲3200。所以原來的192.168.16.10:1235→202.18.4.6:2350數據包經過轉換後變爲了 202.96.128.2:3200→202.18.4.6:2350。
③ Internet主機接收到信息後進行應答,並將應答信息回傳給NAPT服務器。
④ 當NAPT服務器接收到應答信息後,檢查NAPT映射表。如果NAPT映射表存在匹配的映射項,則使用內部公有IP替換數據包的目的IP地址,並將數據包 轉發給內部主機。如果不存在匹配映射項則將數據包丟棄。
NAT網絡地址轉換:將一個IP轉換成另一個 IP(輸入和輸出)
網絡地址轉換類型:
目的地 NAT(DNAT):DNAT修改包的目的地位址的時機,必須在包即將被送到本機行程之前,或是要被轉送其它電腦之前;所以,使用DNAT爲目標的規則,必須設置於nat表格的PREROUTING鏈結。
源 NAT(SNAT,MASQUERADE):SNAT必須在封包即將離開核心的前一刻,即時修改其來源位址(或通訊端口),所以SNAT規則的設置地點必須是在nat表格的POSTROUTING鏈結。

NAT實例:

<!--[if !supportLists]-->1.<!--[endif]-->打開IP轉發
現在我們的IP包已經可以出到廣域網了,但是廣域網上的路由器會丟棄我們內網的IP地址, 所以我們要做nat
好了,開始說到iptables了,要做nat就需要用到iptables的nat表
我們是從裏面到外面的包,所以要修改源IP,就叫做源NAT
我們要出去,就是postrouting

首先需要打開ip_forward

現在我們來配置這條命令
iptables -t nat -A POSTROUTING -o eth1 -s 192.168.8.0/24 -j MASQUERADE
或者直接定義到兩個接口
/sbin/iptables -t nat -A POSTROUTING -o "外網卡" -s "內網卡" -j MASQUERADE
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
我們來講解這條命令
iptables 是命令本身
-t 是執行表,iptables有兩個表,一個是filter:過濾的表
一個是nat,就是NAT表,Network Address Translator
然後-A,-A的意思就是添加一條鏈
這裏添加的鏈是POSTROUTING鏈,就是源NAT
-o 是出去的網卡設備,我們使用的是eth1網卡
-s 是源地址,我們設置內網的192.168.8.0/24網段
-j是動作,MASQUERADE 動態源地址轉換(動態IP的情況下使用)

如果我們使用的靜態外網地址,就可以這樣寫
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to 1.1.1.1 把出去的地址都轉換成1.1.1.1

好了,現在內網用戶可以通過linux網關上網了

端口重定向
把要進入eth1(eth1連接外網)80端口的數據包,重新定向到192.168.1.3的8080端口。配置squid的時候用到。
iptables -t nat -A PREROUTING -i ethl -p tcp - -dport 80 -j DNAT - - to -destination 192.168.1.3:8080
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
端口映射
那麼內網的WEB服務器如何將數據傳出去呢?這個時候要通過SNAT來實現了。我們用端口映射來實現。
/sbin/iptables -t nat -A PREROUTING -p tcp -d 210.42.201.180 --dport 80 -j DNAT --to 192.168.1.181:80
/sbin/iptables -t nat -A POSTROUTING -d 192.168.1.181 -p tcp --dport 80 -j SNAT --to 192.168.1.1
或:
iptables –t nat –A PREROUTING –p tcp –i eth1 –dport 80 –j DNAT –to 192.168.1.181:80
iptables –t nat –A POSTROUTING –o eth1 –s 192.168.1.0/24 –j MASQUERADE
注:210.42.201.180爲公網IP地址。192.168.1.1是內網的網關。192.168.1.181是內網的web服務器

服務器iptabtles腳本設置:
vi /etc/rc.d/firewall

#!/bin/bash

#清除規則
iptables -F

#允許127.0.0.1內部轉發
iptables -A INPUT -i lo -j ACCEPT

#開放常用的端口
iptables -A INPUT -p TCP --dport 80 -j ACCEPT
iptables -A INPUT -p TCP --sport 80 -j ACCEPT
iptables -A INPUT -p TCP --dport 25 -j ACCEPT
iptables -A INPUT -p TCP --sport 25 -j ACCEPT
iptables -A INPUT -p TCP --dport 110 -j ACCEPT
iptables -A INPUT -p TCP --sport 110 -j ACCEPT
iptables -A INPUT -p TCP --dport 143 -j ACCEPT
iptables -A INPUT -p TCP --sport 143 -j ACCEPT

#SSH
iptables -A INPUT -p TCP --dport 59687 -j ACCEPT
iptables -A INPUT -p TCP --dport 9900 -j ACCEPT
iptables -A INPUT -p UDP --sport 53 -j ACCEPT
iptables -A INPUT -p TCP --sport 53 -j ACCEPT
#antispam
iptables -A INPUT -p TCP --sport 6220 -j ACCEPT
iptables -A INPUT -p TCP --sport 6610 -j ACCEPT
iptables -A INPUT -p TCP --sport 6611 -j ACCEPT

#SSL
iptables -A INPUT -p TCP --dport 995 -j ACCEPT
iptables -A INPUT -p TCP --dport 993 -j ACCEPT
iptables -A INPUT -p TCP --dport 465 -j ACCEPT
iptables -A INPUT -p TCP --dport 443 -j ACCEPT

#NTP date
iptables -A INPUT -p UDP --sport 123 -j ACCEPT

#snmp
iptables -A INPUT -i eth0 -p udp -s 125.76.229.215 --dport 161 -j ACCEPT
iptables -A INPUT -i eth0 -p udp -s 60.195.249.83 --dport 161 -j ACCEPT

iptables -P FORWARD DROP
iptables -A INPUT -j REJECT
iptables -P OUTPUT ACCEPT

#防止同步包洪水(Sync Flood)
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
#防止各種端口掃描
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
#Ping洪水***(Ping of Death)
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
#屏蔽 SYN_RECV 的連接
iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 1/sec -j ACCEPT

寫完後將 sh /etc/rc.d/firewall命令寫入/etc/rc.local目錄下即可實現開機自動運行腳本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章