1. 程式人生 > >七周四次課

七周四次課

iptables filter nat

10.15 iptables filter表案例

iptables小案例

vi /usr/local/sbin/iptables.sh //加入如下內容

#! /bin/bash
ipt="/usr/sbin/iptables"
$ipt -F
$ipt -P INPUT DROP
$ipt -P OUTPUT ACCEPT
$ipt -P FORWARD ACCEPT
$ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT   //加此行是為了讓通信更加順暢 
$ipt -A INPUT -s 192.168.0.0/24 -p tcp --dport 22 -j ACCEPT
$ipt -A INPUT -p tcp --dport 80 -j ACCEPT
$ipt -A INPUT -p tcp --dport 21 -j ACCEPT  

icmp示例

 iptables -I INPUT -p icmp --icmp-type 8 -j DROP

需求:只針對filter表,預設策略INPUT鏈DROP,其他兩個鏈ACCEPT,然後針對192.168.133.0/24開通22端口,對所有網段開放80端口,對所有網段開放21端口。這個需求不算復雜,但是因為有多條規則,所以最好寫成腳本的形式。腳本內容如上所示。

完成腳本的編寫後,直接運行 /bin/sh /usr/local/sbin/iptables.sh 即可。如果想開機啟動時初始化防火墻規則,則需要在 /etc/rc.d/rc.local 中添加一行 “/bin/sh /usr/local/sbin/iptables.sh”

[root@localhost ~]# sh /usr/local/sbin/iptables.sh
[root@localhost ~]# iptables -nvL

運行腳本後,查看規則就是這樣的,可以看到第一條規則中已經有20個包(第一列)被放行過了。

關於icmp的包有一個比較常見的應用:

[root@localhost ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP

--icmp-type 這個選項是要跟-p icmp 一起使用的,後面指定類型編號。這個8指的是能在本機ping通其他機器,而其他機器不能ping通本機。這個有必要記一下。

10.16/10.17/10.18 iptables nat表應用

nat表應用

環境如下:

A機器兩塊網卡eth0(192.168.0.173)、eth1(192.168.100.1),eth0可以上外網,eth1僅僅是內部網絡,B機器只有eth1(192.168.100.3),和A機器eth1可以通信互聯。
需求讓B機器可以連接外網,端口轉發,通過A:1122連接B:22
ifconfig eth1 192.168.100.3/24 臨時設置ip
route add default gw 192.168.100.1 設置網關
iptables實現:
註意:如果不能成功需要清空iptables規則,重新添加
命令:

iptables -F

A機:

ifconfig eth1 192.168.100.1/24 #臨時設置IP

echo "1">/proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth0 -j MASQUERADE 

B機:

ifconfig eth1 192.168.100.3/24 #臨時設置ip
route add default gw 192.168.100.1 #設置網關
端口轉發:

A:

echo "1">/proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -d 192.168.0.173 -p tcp --dport 1122 -j DNAT --to 192.168.100.3:22
iptables -t nat -A POSTROUTING -s 192.168.100.3 -j SNAT --to 192.168.0.173

擴展

iptables 針對一個網段

iptables -I INPUT -m iprange --src-range 61.4.176.0-61.4.191.255 -j DROP

iptables中DNAT、SNAT和MASQUERADE

DNAT(Destination Network Address Translation,目的地址轉換) 通常被叫做目的映謝。而SNAT(Source Network Address Translation,源地址轉換)通常被叫做源映謝。

這是我們在設置Linux網關或者防火墻時經常要用來的兩種方式。以前對這兩個都解釋得不太清楚,現在我在這裏解釋一下。首先,我們要了解一下IP包的結構,如下圖所示:

技術分享圖片
在任何一個IP數據包中,都會有Source IP Address與Destination IP Address這兩個字段,數據包所經過的路由器也是根據這兩個字段是判定數據包是由什麽地方發過來的,它要將數據包發到什麽地方去。而iptables的DNAT與SNAT就是根據這個原理,對Source IP Address與Destination IP Address進行修改。然後,我們再看看數據包在iptables中要經過的鏈(chain): 技術分享圖片
圖中正菱形的區域是對數據包進行判定轉發的地方。在這裏,系統會根據IP數據包中的destination ip address中的IP地址對數據包進行分發。如果destination ip adress是本機地址,數據將會被轉交給INPUT鏈。如果不是本機地址,則交給FORWARD鏈檢測。

這也就是說,我們要做的DNAT要在進入這個菱形轉發區域之前,也就是在PREROUTING鏈中做,比如我們要把訪問202.103.96.112的訪問轉發到192.168.0.112上:

iptables -t nat -A PREROUTING -d 202.103.96.112 -j DNAT --to-destination 192.168.0.112

這個轉換過程當中,其實就是將已經達到這臺Linux網關(防火墻)上的數據包上的destination ip address從202.103.96.112修改為192.168.0.112然後交給系統路由進行轉發。

而SNAT自然是要在數據包流出這臺機器之前的最後一個鏈也就是POSTROUTING鏈來進行操作

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 58.20.51.66

這個語句就是告訴系統把即將要流出本機的數據的source ip address修改成為58.20.51.66。這樣,數據包在達到目的機器以後,目的機器會將包返回到58.20.51.66也就是本機。如果不做這個操作,那麽你的數據包在傳遞的過程中,reply的包肯定會丟失。

假如當前系統用的是ADSL/3G/4G動態撥號方式,那麽每次撥號,出口IP都會改變,SNAT就會有局限性。

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

重點在那個『 MASQUERADE 』!這個設定值就是『IP偽裝成為封包出去(-o)的那塊裝置上的IP』!不管現在eth0的出口獲得了怎樣的動態ip,MASQUERADE會自動讀取eth0現在的ip地址然後做SNAT出去,這樣就實現了很好的動態SNAT地址轉換。

iptables限制syn速度

原理,每5s內tcp三次握手大於20次的屬於不正常訪問。


iptables -A INPUT -s ! 192.168.0.0/255.255.255.0 -d 192.168.0.101 -p tcp -m tcp --dport 80 -m state --state NEW -m recent --set --name httpuser --rsource
iptables -A INPUT -m recent --update --seconds 5 --hitcount 20 --name httpuser --rsource -j DROP

其中192.168.0.0/255.255.255.0 為不受限制的網段, 192.168.0.101 為本機IP。
該iptables策略,可有效預防syn攻擊,也可以有效防止機器人發垃圾帖。

七周四次課