http://www.netfilter.org/
1,包過濾防火牆
在網路層對數據包進行選擇,主要是對數據包的所使用的協議,埠,源地址和目標地址等參數來進行過濾
2,代理網關 squid varnish nginx
把內網和外網是完全隔離的,內網和外網不能進行直接的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 POSTROUTING OUTPUT
mangle :用來對數據包標誌
PREROUTING INPUT OUTPUT FORWARD POSTROUTING
raw:對原始數據包的處理
PREROUTING OUTPUT
Incoming / \ Outgoing
iptables
-A 增加一條規則,默認就是在後面增加
-D 刪除
-L 列出規則
-n 以數值顯示
-I 在最前面插入規則
-v 顯示統計數據,與-L一起用,看到的信息更多
-F 清空規則
-z 清空計數器
-x 清空自定義鏈
-t 後接表名
-P policy,默認策略
-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 在傳輸層是基於tcp的,是雙向的,可以對其input或ouput都可以控制
# iptables -A INPUT -p icmp -j REJECT --可以不加-t filter,默認就是對此表進行操作
# iptables -t filter -A INPUT -p icmp -j REJECT
--有返回信息
# iptables -t filter -A OUTPUT -p icmp -j REJECT
--無返回信息
# iptables -t filter -A INPUT -p icmp -j DROP
--無返回信息
# iptables -t filter -A OUTPUT -p icmp -j DROP
--無返回信息
只允許35ping本地,其它都拒絕
# iptables -t filter -A INPUT -p icmp -j REJECT
# iptables -t filter -A INPUT -s 10.1.1.35 -p icmp -j ACCEPT
--錯誤寫法
# iptables -t filter -A INPUT -s 10.1.1.35 -p icmp -j ACCEPT
# iptables -t filter -A INPUT -p icmp -j REJECT
--正確寫法
--如果要把一條規則加到前面,使用-I參數
# iptables -t filter -A INPUT -p icmp -j REJECT
# iptables -t filter -I INPUT -s 10.1.1.35 -p icmp -j ACCEPT
--正確寫法
----------------------------------------
規則就是一個訪問控制列表(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 -F
--直接清空filter表的所有規則
例3,規則的保存與還原
# iptables -F
# iptables -X
# iptables -Z --使用這三條來清空filter表,如果別的表也要清空的話,就加-t 表名都清一次
# iptables-restore < /etc/sysconfig/iptables --把保存的規則還原回去
--/etc/sysconfig/iptables文件為默認保存文件,重啟iptables服務會默認把此文件里的規則還原.當然也可以手工保存到另一個文件,就需要iptables-restore手工還原了.
例4,默認策略的修改
# iptables -P INPUT DROP --INPUT鍵默認策略改為DROP,改回來把DROP換成ACCEPT就行了
# iptables -P OUTPUT DROP --OUTPUT鍵默認策略改為DROP
例5,實現允許ssh過來,ssh出去,別的都拒絕 (要求,INPUT和OUTPUT雙鏈默認策略都為DROP)
# 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
例6,在例五的基礎上允許ping自己的IP,本地迴環127.0.0.1和10.1.1.35
下面兩條定義能ping自己和127本地迴環
# iptables -A INPUT -i lo -p icmp -j ACCEPT
# iptables -A OUTPUT -o lo -p icmp -j ACCEPT
下面兩條定義此伺服器和35這台機器可以互ping
# iptables -A INPUT -p icmp -s 10.1.1.35 -j ACCEPT
# iptables -A OUTPUT -p icmp -d 10.1.1.35 -j ACCEPT
--把默認策略先改為允許,然後把基本都安裝起來,再把默認策略改回為drop
例7,
在上面的基礎上再加上只允許10.1.1.0這個網段訪問你的httpd服務,和你只能訪問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
以客戶端身份能訪問10網段內的web服務
# iptables -A OUTPUT -p tcp --dport 80 -d 10.1.1.0/24 -j ACCEPT
# iptables -A INPUT -p tcp --sport 80 -s 10.1.1.0/24 -j ACCEPT
例8
在上面的基礎上再加上允許別人訪問本台伺服器的DNS
只需要做udp的53埠就可以了,不用寫tcp 53(tcp 53主要是用於主從DNS伺服器同步的)
# iptables -A INPUT -p udp --dport 53 -j ACCEPT
# iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
客戶端身份能訪問別人的DNS服務
# iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
# iptables -A INPUT -p udp --sport 53 -j ACCEPT
-------------------------------
一些特殊的寫法
連接埠
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
例9
再在上面的基礎上加上能夠發送郵件和能夠收到郵件的功能
iptables -A INPUT -p tcp -m multiport --dport 25,110,143 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --sport 25,110,143 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --sport 25,110,143 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --dport 25,110,143 -j ACCEPT
例10 dhcp
Empire CMS,phome.net |
例11
samba
137 138 139 445
[root@iptables ~]# iptables -A INPUT -p tcp -m multiport --dport 137,138,139,445 -j ACCEPT
[root@iptables ~]# iptables -A OUTPUT -p tcp -m multiport --sport 137,138,139,445 -j ACCEPT
例12
用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
--練習:上面的ftp是服務端寫的規則,客戶端應該怎麼寫去主動或被動訪問別人的ftp伺服器?
例13
nfs
--nfs用到rpc調用,埠不固定,需要把埠給固定起來
vim /etc/sysconfig/nfs --在此文件里加上下面四句
/etc/init.d/nfs restart
/etc/init.d/portmap restart
netstat -ntl |grep 300 去查看,看到rpc.的守護進程的埠為自己綁定的埠
iptables -A INPUT -p tcp --dport 3000:3002 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 3000:3002 -j ACCEPT
iptables -A INPUT -p udp --dport 3000:3002 -j ACCEPT
iptables -A OUTPUT -p udp --sport 3000:3002 -j ACCEPT
還要加上2049(nfs)和111(portmap)的埠的規則
iptables -A INPUT -p tcp --dport 2049 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 2049 -j ACCEPT
iptables -A INPUT -p udp --dport 2049 -j ACCEPT
iptables -A OUTPUT -p udp --sport 2049 -j ACCEPT
iptables -A INPUT -p tcp --dport 111 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 111 -j ACCEPT
iptables -A INPUT -p udp --dport 111 -j ACCEPT
iptables -A OUTPUT -p udp --sport 111 -j ACCEPT
--現在就可以用另一台機showmount -e 查看並進行掛載了
--練習:把上面的3000,3001,3002,2049,111合起來只寫4條iptables來做
例14
yum
視遠程yum配置的類型而定
==================================
準備兩台虛擬機和真實機一起三台機做實驗
內網 iptables網關 外網
172.16.57.128 ----> 172.16.57.1 vmnet1
網關指向
打開路由
2.2.2.10 eth1 <----- 2.2.2.189
網關指向
把gateway加上路由功能
echo "1" > /proc/sys/net/ipv4/ip_forward --臨時生效
Empire CMS,phome.net |
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p --改完后使用此命令,使之修改永久生效
路由功能加了后,網關都指向了gateway這台物理機,那麼 兩個網段的這兩台機就能互相ping通
--禁止內網128這台和外網129互ping
# iptables -A FORWARD -p icmp -s 172.16.57.128 -d 2.2.2.189 -j REJECT
--禁止內外網互ping
# iptables -A FORWARD -i vmnet1 -p icmp -j REJECT
或
# iptables -A FORWARD -o eth1 -p icmp -j REJECT
--禁止內網128這台上外網的web
# iptables -A FORWARD -p tcp --dport 80 -s 172.16.57.128 -j REJECT
例2,
SNAT 源地址轉換
內網多個IP轉換成外網IP去連接公網
現在內網128可以ping通外網129
還有129的/var/log/httpd/access_log 記錄128訪問過來的信息,IP為128內網IP
在外網129上把指向2.2.2.10的網關給del掉
那麼內網128不能訪問外網129了
在中間的網關機寫上下面的一句
# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 2.2.2.10
內網128就可以訪問外網129了
並且外網129的/var/log/httpd/access_log 記錄的訪問記錄是2.2.2.10的訪問
# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
-- MASQUERADE 是偽裝的意思,默認就是自動轉換成eth0的外網IP,可以用於外網IP不固定的情況(比如PPP拔號時)
例3,
DNAT 目的地址轉換
也就是外網是客戶端,要訪問我們內網的伺服器,客戶端只是訪問外網IP,內網裡不同的伺服器不同的IP,可以使用DNAT把不同的請求轉換到不同的內網伺服器
# iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth1 -j DNAT --to-destination 172.16.57.128
--這是表示只要是從eth1(外網)進來的80的訪問,我就把它定向到內網172.16.57.128這台web伺服器
==========================================================
1.熟悉上面的例子,最好是把伺服器角色和客戶端角色都寫一遍
2.下圖是一個前端架構圖,是否要用到iptables?
客戶端
|
|
|
防火牆
|
|
|
|-------------|
| |
web服務調度器 郵件服務調度器
| |
| |
|-----------| |-----------|
web1 web2 web3 mail1 mail2 mail3
本文出自 「linuxart」 博客,請務必保留此出處http://linuxart.blog.51cto.com/686203/843985
[火星人 ] linux24-iptables已經有548次圍觀