--
iptables
--
1,包過濾防火牆
在網路層對資料包進行選擇,主要是對資料包的所使用的協議,連接埠,源地址和目標地址等參數來進行過濾
2,代理網關
把內網和外網是完全隔離的,內網和外網不能進行直接的TCP通訊,必須通過代理網關的處理
3,狀態檢測
TCP有三向交握的階段,常用的WEB,檔案下載,發送和內送郵件等等都是TCP
狀態檢測防火牆除了包過濾防火牆所考查的參數之外,還要關心資料包串連的狀態
netfilter / iptables --iptables 的全名2.4版本後都整合有這個組件
--查看一下iptables的模組
ls /lib/modules/2.6.18-164.el5/kernel/net/netfilter/
ls /lib/modules/2.6.18-164.el5/kernel/net/ipv4/netfilter/
* stateless packet filtering (IPv4 and IPv6)
* stateful packet filtering (IPv4 and IPv6)
* all kinds of network address and port translation, e.g. NAT/NAPT (IPv4 only)
* flexible and extensible infrastructure
* multiple layers of API's for 3rd party extensions
* large number of plugins/modules kept in 'patch-o-matic' repository
iptables 基本概念
四張表: 表裡有鏈 (chain )
filter: 用來進行包過濾: INPUT OUTPUT FORWARD
nat: 用來網路位址轉譯: network address translation ,允許一個內網地址塊,通過NAT轉換成公網IP,實現對公網的訪問,解決IP地址不足
PREROUTING POSTROUTINGOUTPUT
mangle :用來對資料包標誌
PREROUTING INPUT OUTPUT FORWARD POSTROUTING
raw:對未經處理資料包的處理
PREROUTINGOUTPUT
iptables
-A 增加一條規則,預設就是在後面增加
-D 刪除
-L 列出規則
-n 以數值顯示
-I 在最前面插入規則
-v 顯示統計資料
-F 清空規則
-z 清空計數器
-x 清空自訂鍵
-t 後接表名
-P 後接鏈名
-p 後接協議名
--dport
--sport
-d
-s
-i 接網卡介面, 進入的網卡介面
-o 接網卡介面, 出去的網卡介面
-j 後接動作
動作的分類:
ACCEPT 接收資料包
DROP 丟棄資料包
REJECT 拒絕資料包,和DROP的區別就是REJECT會返回錯誤資訊,DROP不會
MASQUEREAD IP地址偽裝,使用NAT轉換成外網IP,可以PPP拔號(外網IP不固定情況)
SNAT 源地址轉換,它與MASQUEREAD的區別是SNAT是接一個固定IP
DNAT目標地址轉換
LOG 記錄日誌
例1,列規則
iptables -L --預設看的就是filter表
iptables -L -t filter
iptables -L -t nat
iptables -L -t mangle
iptables -L -t raw
例2,對ping的控制
禁用icmp協議
# iptables -t filter -A INPUT -p icmp -j DROP
--使用drop 沒有返回資訊
# iptables -t filter -A INPUT -p icmp -j REJECT
--使用reject 有返回資訊的
我要在禁用icmp協議的基礎上允許10.1.1.35(比如說是真實環境裡的管理機)能夠ping
# iptables -t filter -A INPUT -s 10.1.1.35 -p icmp -j ACCEPT
--使用這一句針對35來允許,-s 接源地址
但要注意,上面的規則寫後,還是不能ping通,因為規則就是一個存取控制清單(ACL),讀取的順序是從上往下一條一條匹配,匹配一條就不繼續往下匹配,最後匹配預設策略
所以正確寫法應該是把剛才允許10.1.1.35的寫到最前面
刪除的方法:
方法一:
# iptables -t filter -D INPUT -s 10.1.1.35 -p icmp -j ACCEPT
--加的時候怎麼寫,刪除時就要怎麼寫 A 參數換成 D就可以
方法二;
# iptables -L -n --line
# iptables -D INPUT 2
--在規則比較多或者不好寫規則的情況下,可以先用--line或者--line-number列出行號,再用行號刪除
刪除後,再把這條規則加到拒絕的規則之前
# iptables -t filter -I INPUT -s 10.1.1.35 -p icmp -j ACCEPT
-- I參數代表插入到最前面
現在就實現了 10.1.1.35可以ping通,別的都不能ping通
例3,規則的儲存與還原
# iptables-save > /etc/sysconfig/iptables--將當前規則儲存到這個檔案,檔案可以自訂
# iptables -F
# iptables -X
# iptables -Z--使用這三條來清空filter表,如果別的表也要清空的話,就加-t 表名都清一次
# iptables-restore < /etc/sysconfig/iptables --把儲存的規則還原回去
例4,預設策略的修改
# iptables -P INPUT DROP--INPUT鍵預設策略改為DROP,改回來把DROP換成ACCEPT就行了
# iptables -P OUTPUT DROP--OUTPUT鍵預設策略改為DROP
例5,實現允許ssh過來,ssh出去,別的都拒絕
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
下面兩條定義允許ssh進來
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
下面兩條定義允許ssh出去
# iptables -A INPUT -p tcp --sport 22 -j ACCEPT
# iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT
例六,
在例五的基礎上允許ping自己,本地迴環127.0.0.1和10.1.1.35(管理機)
下面兩條定義能ping自己和127本地迴環
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A OUTPUT -o lo -j ACCEPT
下面兩條定義能ping通35這台機器
# iptables -A INPUT -p icmp -s 10.1.1.35 -j ACCEPT
# iptables -A OUTPUT -p icmp -d 10.1.1.35 -j ACCEPT
例七,
在上面的基礎上再加上允許 10.1.1.0這個網段訪問httpd服務
# iptables -A INPUT -s 10.1.1.0/24 -p tcp --dport 80 -j ACCEPT
# iptables -A OUTPUT -d 10.1.1.0/24 -p tcp --sport 80 -j ACCEPT
例8
在上面的基礎上再加上允許別人訪問本台伺服器的DNS
# iptables -A INPUT -p udp --dport 53 -j ACCEPT
# iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 53 -j ACCEPT
再加上允許訪問別人的DNS伺服器,(如果有一個域是配置的轉寄別人,那麼也是相當於DNS訪問別人)
# iptables -A INPUT -p udp --sport 53 -j ACCEPT
# iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
# iptables -A INPUT -p tcp --sport 53 -j ACCEPT
# iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
# iptables -A INPUT -p tcp --dport 25 -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 25 -j ACCEPT
例9
再在上面的基礎上加上能夠發送郵件和能夠收到郵件的功能
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 25 -j ACCEPT
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 110 -j ACCEPT
iptables -A INPUT -p tcp --dport 143 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 143 -j ACCEPT
iptables -A INPUT -p tcp --sport 25 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --sport 110 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp --sport 143 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 143 -j ACCEPT
ftp
主動和被動模式
21傳輸命令
20傳輸資料
主動 伺服器主動以20連接埠去串連用戶端一個大於1024的連接埠
被動 用戶端以大於1024的連接埠串連伺服器的20
用iptables實現ftp的主動模式能夠訪問
下面兩句實現的是命令連接埠的串連
# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
--不加這兩句,用戶端訪問時都不能登入,加了後可以登入,但用ls列出ftp的共用資訊的話就發現不行,這是因為20的資料連接埠還沒有做規則
# iptables -A INPUT -p tcp --dport 20 -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
--主動模式是20連接埠去主動串連,所以上面兩條,實現了主動模式的串連,注意:如果使用linux的ftp命令來做實驗的話,注意登入後使用passive命令關掉被動模式再實驗
被動模式
vim /etc/vsftpd/vsftpd.conf
在最後加上
pasv_enable=YES
pasv_min_port=3000
pasv_max_port=3100--最小連接埠範圍和最大連接埠範圍可以自訂
/etc/init.d/vsftpd restart --重啟服務
下面兩句就是針對上面的被動配置來設定的允許規則
# iptables -A INPUT -p tcp --dport 3000:3100 -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 3000:3100 -j ACCEPT
最後儲存下來
# iptables-save > /etc/sysconfig/iptables
----------------------------------------------------------------
一些特殊的寫法
串連連接埠
iptables -A INPUT -p tcp --dport 1:1000 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 22,80,110 -j ACCEPT
硬體地址
iptables -A INPUT -m mac --mac-source 00:23:CD:95:DA:0B -p all --dport 80 -j ACCEPT
----------------------------------------------------------------
準備兩台虛擬機器和真實機一起三台機做實驗
VM1GATEWAYVM2
eth0 vmnet1 eth0eth0
172.16.234.129--> 172.16.234.1 路由 10.1.1.35--> 10.1.1.209
網關指向172.16.234.1網關指向10.1.1.35
把gateway加上路由功能
echo "1" > /proc/sys/net/ipv4/ip_forward --臨時生效
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p --改完後使用此命令,使之修改永久生效
路由功能加了後,網關都指向了gateway這台物理機,那麼 兩個網段的這兩台機就能互相ping通
例1:
在FORWARD鏈上對內網的VM1進行一些限制
# iptables -A FORWARD -p icmp -j REJECT
# iptables -A FORWARD -d station209.cluster.com -p tcp --dport 80 -j REJECT
# iptables -A FORWARD -s 172.16.234.129 -p tcp --dport 80 -j REJECT
例2,
SNAT 源地址轉換
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.1.1.35
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
例3,
DNAT 目的地址轉換
# iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 172.16.234.129