歡迎您光臨本站 註冊首頁

linux24-iptables

←手機掃碼閱讀     火星人 @ 2014-03-08 , reply:0

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


-->[Routing ]--->|FORWARD|------->
[Decision] \_____/ ^
| |
v ____
___ / \
/ \ |OUTPUT|
|INPUT| \____/
\___/ ^
| |
----> Local Process ----

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,規則的保存與還原


# /etc/init.d/iptables save --這樣是默認保存到/etc/sysconfig/iptables
# iptables-save > /etc/sysconfig/iptables--將當前規則保存到這個文件,文件可以自定義

# 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


# yum install httpd* sendmail* m4 bind* vsftpd* dhcpd* samba* -y

例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


iptables 對dhcp埠控制無效


例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 --在此文件里加上下面四句


LOCKD_TCPPORT=3000
LOCKD_UDPPORT=3000
MOUNTD_PORT=3001
STATD_PORT=3002

/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次圍觀

http://coctec.com/docs/linux/show-post-45761.html