iptables 入門



iptables 中的指令,均需區分大小寫。

ipchains 和 iptables 在語法上的主要的差異,注意如下:
1. 在 ipchains 中,諸如 input 鏈,是使用小寫的 chains 名,在 iptables 中,要改用大寫 INPUT。
2. 在 iptables 中,要指定規則是欲作用在那一個規則表上(使用 -t 來指定,如 -t nat),若不指定,則預設是作用在 filter 這個表。
3. 在 ipchains 中, -i 是指介面(interface),但在 iptables 中,-i 則是指進入的方向,且多了 -o,代表出去的方向。
4. 在 iptables 中,來源 port 要使用關鍵字 --sport 或 --source-port
5. 在 iptables 中,目的 port 要使用關鍵字 --dport 或 --destination-port
6. 在 iptables 中,"丟棄" 的處置動作,不再使用 DENY 這個 target,改用 DROP。
7. 在 ipchains 的記錄檔功能 -l,已改爲目標 -j LOG,並可指定記錄檔的標題。
8. 在 ipchains 中的-y,在 iptables 中可用 --syn 或 --tcp-flag SYN,ACK,FIN SYN
9. 在 iptables 中,imcp messages 型態,要加上關鍵字 --icmp-type,如:

iptables -A OUTPUT -o eth0 -p icmp -s $FW_IP --icmp-type 8 -d any/0 -j ACCEPT




iptables 使用時的例子
在設定 iptables 的封包過濾規則時,有幾個例子,若先熟悉它們,往後就可自行套用,依此類推,很快地,您就可以進入這個天地之中。

##############################################

##--------##
準備工作
##--------##

首先查看一下機器上的有關於iptables的設定情況
作法如下:

iptables -L -n
iptablse -t nat -L -n




定義以下例子中引用的變數IP
$FW_IP="163.26.197.8"



打開核心 forward 功能,作法如下:

###-----------------------------------------------------###
# 打開 forward 功能
###-----------------------------------------------------###

echo "1" > /proc/sys/net/ipv4/ip_forward
或在/etc/sysconfig/network 中添加
FORWARD_IPV4=yes
打開轉發功能


清除所有的規則,作法如下::

一開始要先清除所有的規則,重新開始,以免舊有的規則影響新的設定。作法如下:

###-----------------------------------------------------###
# 清除先前的設定
###-----------------------------------------------------###

# 清除預設表 filter 中,所有規則鏈中的規則
iptables -F

# 清除預設表 filter 中,使用者自訂鏈中的規則
iptables -X

# 清除mangle表中,所有規則鏈中的規則
iptables -F -t mangle

# 清除mangle表中,使用者自訂鏈中的規則
iptables -t mangle -X

# 清除nat表中,所有規則鏈中的規則
iptables -F -t nat

# 清除nat表中,使用者自訂鏈中的規則
iptables -t nat -X

###################################################


選定預設的策略
接着,要選定各個不同的規則鏈,預設的策略爲何。作法如下:

預設全部丟棄:

###-----------------------------------------------------###
# 設定 filter table 的預設策略
###-----------------------------------------------------###
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP




或者預設全部接受:

###-----------------------------------------------------###
# 設定 filter table 的預設策略
###-----------------------------------------------------###
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT




**各個規則鏈的預設策略可獨立自主的設定,不必受其它鏈的影響。**

以下練習,若目標爲 DROP(丟棄),則 policy 請設爲 ACCEPT(接受);若目標爲 ACCEPT,則 policy 請設爲 DROP,如此方可看出效果。

開放某一個介面
作法如下:

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

注:IPFW 或 Netfilter 的封包流向,local process 不會經過 FORWARD Chain,
因此 lo 只在 INPUT 及 OUTPUT 二個 chain 作用。

iptables -A INPUT -i eth1 -j ACCEPT
iptables -A OUTPUT -o eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -j ACCEPT
iptables -A FORWARD -o eth1 -j ACCEPT




IP 僞裝(SNAT應用)
使內網的封包經過僞裝之後,使用對外的 eth0 網卡當作**號,對外連線。作法如下:

###-----------------------------------------------------###
# 啓動內部對外轉址
###-----------------------------------------------------###

iptables -t nat -A POSTROUTING -o eth0 -s 172.16.0.0/16 -j SNAT --to-source $FW_IP

上述指令意指:把 172.16.0.0/16 這個網段,僞裝成 $FW_IP 出去。




虛擬主機(DNAT應用)
利用轉址、轉 port 的方式,使外網的封包,可以到達內網中的服務器主機,俗稱虛擬主機。這種方式可保護服務器主機大部份的 port 不被外

界存取,只開放公開服務的通道(如 Web Server port 80),因此安全性較高。

作法如下:

###-----------------------------------------------------###
# 啓動外部對內部轉址
###-----------------------------------------------------###
# 凡對 $FW_IP:80 連線者, 則轉址至 172.16.255.2:80
iptables -t nat -A PREROUTING -i eth0 -p tcp -d $FW_IP --dport 80 -j DNAT --to-destination 172.16.255.2:80




開放內部主機可以 telnet 至外部的主機
開放內網,可以 telnet 至外部主機。

作法如下:(預設 policy 爲 DROP)

###-----------------------------------------------------###
# open 外部主機 telnet port 23
###-----------------------------------------------------###

iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 23 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 23 -d $FW_IP --dport 1024:65535 -j ACCEPT




開放郵包轉遞通道
開放任意的郵件主機送信包給你的 Mail Server,而你的 Mail Server 也可以送信包過去。

作法如下:(預設 policy 爲 DROP)

###-----------------------------------------------------###
# open SMTP port 25
###-----------------------------------------------------###

# 以下是:別人可以送信給你
iptables -A INPUT -i eth0 -p tcp -s any/0 --sport 1024:65535 -d $FW_IP --dport 25 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp ! --syn -s $FW_IP --sport 25 -d any/0 --dport 1024:65535 -j ACCEPT

# 以下是:你可以送信給別人
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 25 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 25 -d $FW_IP --dport 1024:65525 -j ACCEPT




開放對外離線下載信件的通道
開放內網可以對外網的 POP3 server 取信件。

作法如下:(預設 policy 爲 DROP)

###-----------------------------------------------------###
# open 對外部主機的 POP3 port 110
###-----------------------------------------------------###

iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 110 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 110 -d $FW_IP --dport 1024:65535 -j ACCEPT




開放觀看網頁的通道
開放內網可以觀看外網的網站。

作法如下:(預設 policy 爲 DROP)

###-----------------------------------------------------###
# open 對外部主機的 HTTP port 80
###-----------------------------------------------------###

iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 80 -d $FW_IP --dport 1024:65535 -j ACCEPT




開放查詢外網的 DNS 主機
開放內網,可以查詢外網任何一臺 DNS 主機。

作法如下:(預設 policy 爲 DROP)

###-----------------------------------------------------###
# open DNS port 53
###-----------------------------------------------------###

# 第一次會用 udp 封包來查詢
iptables -A OUTPUT -o eth0 -p udp -s $FW_IP --sport 1024:65535 -d any/0 --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p udp -s any/0 --sport 53 -d $FW_IP --dport 1024:65535 -j ACCEPT

# 若有錯誤,會改用 tcp 封包來查詢
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 53 -d $FW_IP --dport 1024:65535 -j ACCEPT

# 開放這臺主機上的 DNS 和外部的 DNS 主機互動查詢:使用 udp
iptables -A OUTPUT -o eth0 -p udp -s $FW_IP --sport 53 -d any/0 --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p udp -s any/0 --sport 53 -d $FW_IP --dport 53 -j ACCEPT
# 開放這臺主機上的 DNS 和外部的 DNS 主機互動查詢:使用 tcp
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 53 -d any/0 --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! -y -s any/0 --sport 53 -d $FW_IP --dport 53 -j ACCEPT





開放內部主機可以 ssh 至外部的主機
開放內網,可以 ssh 至外部主機。

作法如下:(預設 policy 爲 DROP)

###-----------------------------------------------------###
# open 外部主機 ssh port 22
###-----------------------------------------------------###

iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 22 -d $FW_IP --dport 1024:65535 -j ACCEPT

# 以下是 ssh protocol 比較不同的地方
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1020:1023 -d any/0 --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 22 -d $FW_IP --dport 1020:1023 -j ACCEPT




開放內部主機可以 ftp 至外部的主機
開放內網,可以 ftp 至外部主機。

作法如下:(預設 policy 爲 DROP)

###-----------------------------------------------------###
# open 對外部主機 ftp port 21
###-----------------------------------------------------###

# 以下是打開命令 channel 21
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 21 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 21 -d $FW_IP --dport 1024:65535 -j ACCEPT

# 以下是打開資料 channel 20
iptables -A INPUT -i eth0 -p tcp -s any/0 --sport 20 -d $FW_IP --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp ! --syn -s $FW_IP --sport 1024:65535 -d any/0 --dport 20 -j ACCEPT

# 以下是打開 passive mode FTP 資料通道
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 1024:65535 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 1024:65535 -d $FW_IP --dport 1024:65535 -j ACCEPT




開放 ping
可以對外 ping 任何一臺主機。

作法如下:(預設 policy 爲 DROP)

iptables -A OUTPUT -o eth0 -p icmp -s $FW_IP --icmp-type 8 -d any/0 -j ACCEPT
iptables -A INPUT -i eth0 -p icm -s any/0 --icmp-type 0 -d $FW_IP -j ACCEPT

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章