iptables防火牆工做原理html
簡介:iptables防火牆工做在網絡層,針對TCP/IP數據包實施過濾和限制,iptables防火牆基於內核編碼實現,具備很是穩定的性能和高效率;linux
iptables屬於「用戶態」的防火牆管理體系。web
規則表 shell
filter表:filter表用來對數據包進行過濾,根據具體的規則要就決定如何處理一個數據包。對應內核模塊:iptable_fileter。共包含三個鏈。vim
nat表:nat(Network Address Translation,網絡地址轉換)表主要用於修改數據包 ip地址,端口號等信息。對應的內核模塊爲iptable_nat,共包含三個鏈。後端
mangle表:mangle表用來修改數據包的TOS(Type Of Service,服務類型),TTL(Time To Live,生存週期)值,或者爲數據包設置Mark標記,以實現流量整形,策略路由等高級應用。對應的內核模塊爲 iptable_mangle,共包含五個鏈。安全
raw表:raw表示自1.2.9之後版本的iptables新增的表,主要來決定是否對數據包進行狀態跟蹤。對應的內核模塊爲iptable_raw,共包含兩個鏈。服務器
規則鏈 網絡
INPUT鏈:當收到訪問防火牆本機地址的數據包(入站)時,應用此鏈中的規則。併發
OUTPUT鏈:當防火牆本機向外發送數據包(出站)時,應用此鏈中的規則。
FORWARD鏈:當接收到須要經過防火牆中轉發送給其餘地址的數據包(轉發)是,應用測鏈中的規則。
PREROUTING鏈:在對數據包作路由選擇以前,應用測鏈中的規則。
POSTROUTING鏈:在對數據包作路由選擇以後,應用此鏈中的規則。
簡要說明:其中INPUT,OUTPUT鏈主要用在「主機防火牆」中。即主要針對服務器本機驚醒保護的防火牆;而FORWARD,PREROUTING,POSTROUTING鏈多用在「網絡型防火牆」中,例如使用Linux防火牆做爲網關 服務器在公司與Inetnet之間進行安全控制。
數據包過濾工做流程
規則表應用優先級:raw→mangle→nat→filter
各條規則的應用順序:鏈內部的過濾遵循「匹配即中止」的原則,若是對比完整個鏈也沒有找到和數據包匹配的規則,則會按照鏈的默認策略進行處理。
入站數據流向:數據包到達防火牆後首先被PREROUTING鏈處理(是否修改數據包地址等),而後進行路由選擇(判斷數據包發往何處),若是數據包的目標地址是防火牆本機(如:Internet用戶訪問網關的Web服務端口),那麼內核將其傳遞給INPUT鏈進行處理(決定是否容許經過等)。
轉發數據流向:來自外界的數據包到達防火牆後首先被PREROUTTING鏈處理,而後再進行路由選擇;若是數據包的目標地址是其餘的外部地址(如局域網用戶經過網關訪問QQ服務器),則內核將其傳遞給FORWARD鏈進行處理(容許轉發,攔截,丟棄),最後交給POSTROUTING鏈(是否修改數據包的地址等)進行處理。
出站數據流向:防火牆本機向外部地址發送的數據包(如在防火牆主機中測試公網DNS服務時),首先被OUTPUT鏈處理,而後進行路由選擇,再交給POSTROUTING鏈(是否修改數據包的地址等)進行處理。
命令實戰
語法:
iptables [ - t 表名 ] 管理選項 [鏈名] [匹配條件] [-j 控制類型]
未指定表名時將默認使用filter表。
控制類型:
ACCEPT:容許數據包經過。
DROP:直接丟棄數據包,不給出任何迴應信息。
REJECT:拒絕數據包經過,會給數據發送端一個響應信息。
拒絕發給本機使用ICMP協議的數據包:iptable -t filter -I INPUT -p icmp -j REJECT
[root@tp ~]# /etc/rc.d/init.d/iptables save
這樣就能夠寫到/etc/sysconfig/iptables文件裏了.寫入後記得把防火牆重起一下,才能起做用.
[root@tp ~]# service iptables restart
別忘了保存,不行就寫一部保存一次.你能夠一邊保存,一邊作實驗,看看是否達到你的要求,
iptables經常使用命令
iptables -nv -L 查看iptables列表
iptables -F 清空iptables規則
iptables-save > /etc/sysconfig/iptables 保存iptables規則到文件
service iptables restart 重啓iptables
如下是我服務器的iptables配置
# Generated by iptables-save v1.4.7 on Tue Jul 5 12:06:29 2016 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [4:4940] -A INPUT -i lo -j ACCEPT #容許本地迴環 -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #容許服務器訪問外網,例如curl,wget -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT #容許全部IP訪問網站 -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT #容許ping請求 -A INPUT -s 61.149.47.34/32 -p tcp -m tcp --dport 3306 -j ACCEPT #容許公司IP訪問MySQL -A INPUT -s 61.149.47.34/32 -p tcp -m tcp --dport 6379 -j ACCEPT #容許公司IP訪問Redis -A INPUT -p tcp -m multiport --dports 8081,10050,65008 -j ACCEPT #容許全部IP訪問8081,10050,65008端口,ps:65008是個人ssh端口 -A INPUT -j REJECT --reject-with icmp-port-unreachable #拒絕全部的IP訪問全部的端口 COMMIT # Completed on Tue Jul 5 12:06:29 2016
防止攻擊
防範DDOS攻擊腳本 #防止DOS太多鏈接進來,能夠容許外網網卡每一個IP最多15個初始鏈接,超過的丟棄 iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT 防範CC攻擊 (1)控制單個IP的最大併發鏈接數 iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT #容許單個IP的最大鏈接數爲 30 (2)控制單個IP的某段時間的鏈接數 iptables -A INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j REJECT iptables -A INPUT -p icmp -j DROP
如下轉載
防火牆之地址轉換SNAT DNAT
1、SNAT源地址轉換。
一、原理:在路由器後(PSOTROUTING)將內網的ip地址修改成外網網卡的ip地址。
二、應用場景:共享內部主機上網。
三、設置SNAT:網關主機進行設置。
(1)設置ip地址等基本信息。
(2)開啓路由功能:
sed -i '/ip-forward/s/0/1/g'
sysctl -p
(3)編寫規則:
iptables -t nat -I POSTROUTING -o 外網網卡 -s 內網網段 -j SNAT --to-source 外網ip地址 #適用於外網ip地址固定場景
iptables -t nat -I POSTROUTING -o 外網網卡 -s 內網網段 -j MASQUERADE #適用於共享動態ip地址上網(如adsl撥號,dhcp獲取外網ip)
(4)作好安全控制:使用FORWARD時機進行控制,嚴格設置INPUT規則。
2、DNAT目的地址轉換:
一、原理:在路由前(PREROUTING)未來自外網訪問網關公網ip及對應端口的目的ip及端口修改成內部服務器的ip及端口,實現發佈內部服務器。
二、應用場景:發佈內部主機服務。
三、設置DNAT:網關主機上設置。
(1)設置ip、開啓路由、設置SNAT
(2)編寫防火牆規則:
iptables -t nat -I PREROUTING -i 外網網卡 -d 外網ip tcp --dport 發佈的端口 -j DNAT --to-destination 內網服務ip:端口
NAT network address translation
僅從報文請求來看,能夠分爲:
SNAT 源地址轉換
DNAT 目標地址轉換
PNAT 端口轉換
NAT server:能根據須要實現SNAT DNAT PNAT
並不是是用戶空間的進程完成轉換功能,靠的是內核中的地址轉換規則
私有IP客戶端訪問互聯網的方法
SNAT 、PROXY
SNAT:主要用於實現內網客戶端訪問外部主機時使用(局域網上網用)
定義在POSTROUTING鏈上
iptables -t nat -A postrouting -s 內部網絡地址或主機地址 -j SNAT --to-source NAT服務器上的某外部地址
另一個target
MASQUERADE地址假裝(適用於PPPOE撥號上網,假設eth1是出口)
iptables -t nat -A postrouting -s 內部網絡或主機地址 -o eth1 -j MASQUERADE
DNAT:主要用於內部服務器被外網訪問(發佈服務)
定義在PREROUTING
iptables -t nat -A PREROUTING -d NAT服務器的某外部地址 -p 某協議 --dport 某端口 -j DNAT --to-destination 內網服務器地址[:port]
注意:NAT服務器須要打開數據轉發
echo 1 > /proc/sys/net/ipv4/ip_forward
或者修改/etc/sysctl.conf net.ipv4.ip_forward = 1
實驗操做
SNAT、DNAT
實驗一:
SNAT
規劃主機A 做爲SNAT server
eth0 ip地址172.20.1.10(外部地址),eth1 192.168.1.1(內部地址)
主機B當作局域網內主機
eth0 ip地址192.168.1.2 默認路由要指向192.168.1.1
SNAT server:
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.20.1.10
#上面和咱們實例操做相同
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
主機B ping外部的其它主機(172.20.1.20模擬互聯網上的主機)
DNAT
[root@nat ~]# iptables -t filter -F
[root@nat ~]# iptables -t nat -F
[root@nat ~]# iptables -t nat -A PREROUTING -d 10.1.249.125 -p tcp --dport 80 -j DNAT --to-destination 192.168.2.4
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 10.1.249.125 tcp dpt:80 to:192.168.2.4
[root@nat ~]# netstat -tln | grep "\<80\>" 此時本機上並無開放80端口
[root@wai ~]# curl http://10.1.249.125
hello --> 此時咱們訪問爲 nat 主機上的80端口 由上面可知,此服務器上並無開放80,而是將請求送往 後端服務器
實體案例
咱們有一臺機器A能夠上外網,配置eth0=192.168.1.1,eth1=222.13.56.192
有6臺機器只有內網IP ,分別是192.168.1.102~192.168.1.108,想讓這6臺機器經過機器A上網
在機器A 防火牆上配置以下便可
/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.101 -j SNAT --to-source 222.13.56.192
/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.102 -j SNAT --to-source 222.13.56.192
/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.103 -j SNAT --to-source 222.13.56.192
/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.104 -j SNAT --to-source 222.13.56.192
/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.105 -j SNAT --to-source 222.13.56.192
/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.108 -j SNAT --to-source 222.13.56.192
在 6臺機器上路由顯示
route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 em1
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 em1
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 em1
iptables中DNAT轉發的配置方法
1.一對一流量徹底DNAT
首先說一下網絡環境,普通主機一臺作防火牆用,網卡兩塊
eth0 192.168.0.1 內網
eth1 202.202.202.1 外網
內網中一臺主機 192.168.0.101
如今要把外網訪問202.202.202.1的全部流量映射到192.168.0.101上
命令以下:
#將防火牆改成轉發模式
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -A PREROUTING -d 202.202.202.1 -j DNAT --to-destination 192.168.0.101
iptables -t nat -A POSTROUTING -d 192.168.0.101 -j SNAT --to 192.168.0.1
2.多對多流量徹底DNAT
說是多對多,實際上這裏的配置是指定了多個一對一
環境:
eth0 192.168.0.1 內網
eth1 202.202.202.1 、202.202.202.2 外網
內網中2臺主機 192.168.0.10一、192.168.0.102
如今要把外網訪問202.202.202.1的全部流量映射到192.168.0.101上,同時把把外網訪問202.202.202.2的全部流量映射到192.168.0.102上
這裏順便提一下如何爲網卡配置多個IP
ifconfig eth1:1 202.202.202.2 netmask 255.255.255.0 up
#將防火牆改成轉發模式
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -A PREROUTING -d 202.202.202.1 -j DNAT --to-destination 192.168.0.101
iptables -t nat -A POSTROUTING -d 192.168.0.101 -j SNAT --to 192.168.0.1
iptables -t nat -A PREROUTING -d 202.202.202.2 -j DNAT --to-destination 192.168.0.102
iptables -t nat -A POSTROUTING -d 192.168.0.102 -j SNAT --to 192.168.0.1
3.一對多根據協議DNAT
這個最經常使用,通常是內網或DMZ區內有多個應用服務器,能夠將不一樣的應用流量映射到不一樣的服務器上
環境:
eth0 192.168.0.1 內網
eth1 202.202.202.1 外網
內網中2臺主機 192.168.0.101(Web服務器)、192.168.0.102(郵件服務器)
如今要把外網訪問202.202.202.1的Web流量映射到192.168.0.101上,同時把把外網訪問202.202.202.1的郵件訪問流量映射到192.168.0.102上
命令以下:
#將防火牆改成轉發模式
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
#Web訪問設置
iptables -t nat -A PREROUTING -d 202.202.202.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.101:80
iptables -t nat -A POSTROUTING -d 192.168.0.101 -p tcp --dport 80 -j SNAT --to 192.168.0.1
#郵件訪問設置
iptables -t nat -A PREROUTING -d 202.202.202.1 -p tcp --dport 25 -j DNAT --to-destination 192.168.0.102:25
iptables -t nat -A POSTROUTING -d 192.168.0.102 -p tcp --dport 25 -j SNAT --to 192.168.0.1
iptables -t nat -A PREROUTING -d 202.202.202.1 -p tcp --dport 110 -j DNAT --to-destination 192.168.0.102:110
iptables -t nat -A POSTROUTING -d 192.168.0.102 -p tcp --dport 110 -j SNAT --to 192.168.0.1
SNAT:源地址轉換,代理內部客戶端訪問外部網絡
目標地址不變,從新改寫源地址,並在本機創建NAT表項,當數據返回時,根據NAT表將目的地址數據改寫爲數據發送出去時候的源地址,併發送給主機,目前基本都是解決內網用戶用同一個公網IP地址上網的狀況。
DNAT:目標地址轉換,將內部服務器發佈至外部網絡
和SNAT相反,源地址不變,從新修改目標地址,在本機創建NAT表項,當數據返回時,根據NAT表將源地址修改成數據發送過來時的目標地址,併發給遠程主機在DNAT的基礎上,能夠根據請求數據包的端口作PNAT(端口轉換,也稱爲端口映射),能夠根據請求數據包不一樣的端口改寫不一樣的目標地址,從而發送給不一樣的主機這在用一個公網地址作不一樣服務時用的比較多,並且相對來講,用NAT的方式能夠隱藏後端服務器的真實地址,比較安全。
SNAT的數據流向過程
首先進入PREROUTING,發現不是本網段的地址,然後開始查找路由表(查找路由的過程在PREROUTING和FORWARD之間),因而通過FORWARD鏈進行轉發,在經過POSTROUTING時進行NAT轉換。在這個流程中,NAT轉換的步驟在POSTROUTING鏈上實現,之因此再也不PREROUTING上作NAT是由於數據包在進來以前,還不知道是本網段地址仍是外網地址。
DNAT的數據流向過程
在DNAT中,NAT要在PREROUTING鏈上作。在數據進入主機後,路由選擇過程是在PREROUTING和FORWARD之間的,因此應該先作地址轉換以後再進行路由選擇,然後通過FORWARD鏈,最後從POSTROUTING鏈出去。
PC1地址:172.16.251.185 網關指向:172.16.251.186
route add default gw 172.16.251.186
route
NAT服務器地址:172.16.251.185
PC2地址:
2、SNAT的實現:
一、在咱們作NAT以前,首先要把NAT服務器的路由功能打開,否則數據包過不了FORWARD鏈
sysctl -w net.ipv4.ip_forward=1
######也可使用文件永久生效,下面值改成1便可
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
######執行以下命令讓其生效
sysctl -p
二、在NAT服務器添加iptables規則如:
iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 192.168.254.61
#在POSTROUTING鏈上面,未來自源地址爲172.16.0.0/16網段的數據包的源地址都轉換爲192.168.254.61
查看iptables規則:
iptables -t nat -L -n -v
三、下面咱們在PC1上作測試,PC1如今就能夠Ping通PC2主機了,以下圖:
四、PC1 ping PC2,在PC1主機上抓包來測試:
tcpdump -i eth0 -v | grep 192
3、DNAT的實現:
一、在NAT服務器添加iptables規則如:
iptables -t nat -A PREROUTING -d 192.168.254.61 -j DNAT --to-destination 172.16.251.185
#在PREROUTING鏈上面,將請求地址NAT服務器 eth1 192.168.1.254的數據包所有轉發到PC1 172.16.251.185主機上
查看iptables規則:
iptables -t nat -L -n -v
測試:PC1上面作了WEB服務,咱們在PC2上看是否能請求到WEB頁面:
請求防火牆eth1地址,192.168.254.61
二、在NAT服務器添加iptables規則如:
iptables -t nat -A PREROUTING -d 192.168.254.61 -p tcp --dport 80 -j DNAT --to-destination 172.16.251.185:8080
#此條規則是將全部請求NAT服務器eth1 192.168.254.61地址的80號端口都轉發到172.16.251.185主機上8080端口,固然前提必須在PC1上面監聽8080端口
查看iptables規則:
基於動態IP地址來作NAT代理內部客戶端來上網
若是IP地址是動態獲取的ADSL寬帶來作NAT代理上網實現方式
iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o eth1 -j MASQUEREADE
註釋:這裏最好使用"-o"選項來指定出口,MASQUEREADE會自動調用該接口的地址做爲源地址出去。
2. 先說收DNAT
DNAT目標地址轉換在PREROUTING鏈上作;能夠將虛擬機的服務映射到宿主機的ip上,達到訪問宿主的 ip就等於訪問虛擬機的效果;
iptables -t nat -A PREROUTING -d 192.168.1.51 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.122.2:80
-d 物理機的ip --dport 端口 DNAT 被映射的內網主機ip:端口
應用場景:
這樣主要是爲了 能讓內網的主機可以對外提供服務:數據包的第一站 PREROUTING ,匹配到規則就執行規則進行DNAT轉發,通過FORWARD ,到達POSTROUTING出站。沒有匹配到就進入INPUT,進行匹配
3.再說SNAT
SNAT源地址轉換在POSTROUTING鏈上作; 能夠爲局域網提供上網服務
iptables -t nat -A PORTROUTING -o br0 -j MASQUERADE
應用場景:
主機上的NAT 虛擬機須要訪問物理網路,虛擬機直接經過先 通過FORWARD,而後經過POSTROUTING 將源地址轉換
4. 再說說不須要通過轉換的數據包,如圖示綠色的部分,直接到達INPUT-->OUTPUT-->POSTROUTING出來了,好比說我要ssh遠程這個主機,走的就是這個流向;
A. 若是想讓相對的局域網內服務器對外提供web服務,須要作DNAT規則:
iptables -t nat -A PREROUTING -d 公網IP -p tcp –m tcp --dport 公網端口 -j DNAT --to-destination 內網IP:80
我將外網IP 的80,8080 端口都映射到了內網IP的80端口:
通過PREROUTING 鏈後還須要通過FORWARD 鏈,須要在FORWARD這開放提供web服務的80 端口:
iptables -A FORWARD -p tcp -m tcp --dport 80 -j ACCEPT
理論上還須要開放一下--sport 80 , 可是若是已經有下面這個規則了,就不須要了:
這個規則是容許已有鏈接直接經過;但有大量數據包通過時,能夠提升速度!
iptables - I FORWARD –p tcp -m state -- state RELADE,RSTABLISHED - j
ACCEPT
看看實際的效果:
B. 固然FORWARD鏈處,能夠對轉發進行數據包的過濾,好比我想經過公網服務器的ip,遠程ssh鏈接局域
網內的服務器,就可使用DNAT進行轉換內網主機的22端口,可是爲了安全,我想限制能夠遠程的IP地
址:我只想讓我一我的能夠 遠程,個人ip是192.168.1.154,內網網段是192.168.122.0/24
DNAT:
iptables -t nat -A PREROUTING -d 192.168.1.51 -p tcp -m tcp --dport 8081 --to-destination 192.168.122.2:22
FORWARD:
iptables -A FORWARD -s 192.168.1.154 -d 192.168.122.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
個人ip地址
在192.168.1.154上 ssh遠程一下看看
再到其餘的主機上ssh試試看,這個主機ip是192.168.1.20
看的出來FORWARD 上的那個規則生效了。
C. 當內網的主機或本地的虛擬機須要經過本機上網時,須要作SNAT規則:個人環境是虛擬機要經過宿主
機上網,虛擬機以宿主機爲網關,虛擬機的網段是192.168.122.0/24,宿主機的網段是
192.168.1.0/24,相對來講宿主機網段就是外網,虛擬機就是內網。
-j MASQUERADE 是當外網ip不固定時,這個配置 I 能夠自動獲取外網ip。
iptables -t nat -A POSTROUTING -o br0 -s 內網段/24 -j MASQUERADE
-s配置不是必須的,在真實局域網環境中,也許會有多個局域網段,這時就能夠經過-s 配置,指定那個網段能夠上網