iptables 封包過瀘規則

需求

Kernel 2.4.x

參考文件

  • pinfo iptables
  • netfilter
  • Linux 伺服器安全防護 (O'REILLY, ISBN: 986-7794-18-4)
  • Linux iptables Pocket reference (O'REILLY, ISBN: 986-7794-39-7)
  • Linux Firewalls (New Riders, ISBN: 0735710996)

Linux 在做封包過瀘時,是由 kernel 的 netfilter 在實際做封包的過瀘,並非由 iptables 來做,而 iptables 最主要的功能,是用來設定 netfilter 的規則,iptables 可以用來設計防火牆或封包傳送的規則,也可以顯示目前核心 (kernel) 的 netfilter 過瀘狀態。

netfilter 攔截網路封包,分別有五個地方,這五個地方分別為 PREROUTING、POSTROUTING、INPUT、OUTPUT及 FORWRD。這五個 chains 分別為網路封包旅程時會依其狀態而經過。

以下為這五個 chains 的攔截點圖:

上圖可以很清楚看到這五個 chains 的位置,而封包在經過網路介面時,會判別該封包是會往那裡去,然而也是我們在做 iptables 設置時要搞清楚的地方。

  • PREROUTING
    封包進入網路卡介面的時候
  • POSTROUTING
    封包即將離開網路介面的時候
  • FORWARD
    封包在轉送的時候,如(從 A 到 B 網段)
  • INPUT
    到達本機的封包
  • OUTPUT
    離開本機的封包

iptables 三種過瀘規則

  • filter
    這是預設的規則,如果都不指定類別 (table),那麼就會使用 filter 來當做預設的規則,filter 用來過瀘封包的來源 (埠)、目的 (埠) 和其它的類別,filter 可以使用處理 INPUT, OUTPUT, FORWARD 等 chains.
  • nat
    nat 可以修改封包的來原和目的,最大的用途是做 NAT 封包偽裝, nat 可以處理 PREROUTING, POSTROUTING, OUTPUT 等 chains.
  • mangle
    mangle 可以用來修改封包內特定的欄位,比如 TTL 值,mangle 可以處理 PREROUTING, POSTROUTING, FORWARD, INPUT, OUTPUT 等 chains.

iptables 通用指令

iptables -P {Policy} -t {Table} {Command} -j {ACCEPT|DROP|REJECT|LOG}

範列:一台什麼服務都沒有,單純是 Client 的機器 (Desktop)

思考:

提供服務:無
提供 forwarding:無
自己是否可任意上網:是

應用:不同意 INPUT、不同意 FORWARD、同意任何 OUTPUT

#清除所有規則
iptables -F
#把計數器規零
iptables -Z
#清除自訂 chain
iptables -X

##指定預設 policy
#封包可以 OUTPUT
iptables -P OUTPUT ACCEPT
#封包不可以 INPUT
iptables -P INPUT DROP
#封包不可以 FORWARD
iptables -P FORWARD DROP

#允許本機 lo 介面可以使用
iptables -A INPUT -i lo -j ACCEPT

##指定特定規則
#已連線的封包可以連入
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

範列:一台單純只提供 HTTP 服務的主機 (HTTP Server)

思考:

提供服務:是 (HTTP:80)
提供 forwarding:否
主機是否可任意連線:是

應用:同意特定的 INPUT、不同意 FORWARD、同意任何 OUTPUT

#清除所有規則
iptables -F
#把計數器規零
iptables -Z
#清除自訂 chain
iptables -X

##指定預設 policy
#封包可以 OUTPUT
iptables -P OUTPUT ACCEPT
#封包不可以 INPUT
iptables -P INPUT DROP
#封包不可以 FORWARD
iptables -P FORWARD DROP

#允許本機 lo 介面可以使用
iptables -A INPUT -i lo -j ACCEPT

##指定特定規則
#已連線的封包可以連入
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
#允許別台電腦可以使用本機 HTTP (80) 服務
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

範列:一台只提供 NAT 服務的主機,內部網段為 192.168.1.0/24 (eth1)、出去的網段為 11.22.33.44 (eth0)

思考:

提供服務:否
提供 forwarding:是
主機可任意連線:是

應用:不同意 INPUT、同意 FORWARD、同意任何 OUTPUT

#開啟核心 forwarding
echo "1" > /proc/sys/net/ipv4/ip_forward

#載入模組
modprobe ip_nat_ftp 2> /dev/null
modprobe ip_nat_irc 2> /dev/null
modprobe ip_conntrack 2> /dev/null
modprobe ip_conntrack_ftp 2> /dev/null
modprobe ip_conntrack_irc 2> /dev/null

#清除所有規則
iptables -F
#把計數器規零
iptables -Z
#清除自訂 chain
iptables -X
#清除所有 nat 規則
iptables -F -t nat
iptables -Z -t nat
iptables -X -t nat

##指定預設 policy
#封包可以 OUTPUT
iptables -P OUTPUT ACCEPT
#封包不可以 INPUT
iptables -P INPUT DROP
#封包不可以 FORWARD
iptables -P FORWARD ACCEPT

#允許本機 lo 介面可以使用
iptables -A INPUT -i lo -j ACCEPT

##指定特定規則
#已連線的封包可以連入
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

#執行封包偽裝
iptables -A POSTROUTING -t nat -o ech0 -s 192.168.1.0/24 -j MASQUERADE

範列:記錄企圖使用 ssh (22) 進入的封包

思考:

記錄 HTTP 封包資訊:是 ssh (22)
提供服務:是 (HTTP: 80)
提供 forwarding:否
主機可主動對外連線:是

應用:不同意 INPUT、不同意 FORWARD、同意 OUTPUT

#清除所有規則
iptables -F
#把計數器規零
iptables -Z
#清除自訂 chain
iptables -X

##指定預設 policy
#封包可以 OUTPUT
iptables -P OUTPUT ACCEPT
#封包不可以 INPUT
iptables -P INPUT DROP
#封包不可以 FORWARD
iptables -P FORWARD DROP

#允許本機 lo 介面可以使用
iptables -A INPUT -i lo -j ACCEPT

##指定特定規則
#已連線的封包可以連入
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

#記錄 ssh (22) 封包
iptables -A INPUT -t tcp --dport 22 -j LOG --log-prefix "SSH LOG: "

#允許別台電腦可以使用本機 HTTP (80) 服務
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

範列:HTTP Server 其實是位於防火牆內的一台機器, 使用 port mapping 每次連到 11.22.33.44 的 80 port 時就轉到內部 192.168.1.5 的 80

思考:

提供服務:否
提供 forwarding:是 (Port mapping 到內部)
主機可主動對外連線:是

應用:不同意 INPUT、同意 FORWARD、同意 OUTPUT、NAT 應用

參考:http://www.study-area.org/tips/NAT-HOWTO/NAT-HOWTO-chn-10.html

/sbin/iptables -t nat -A PREROUTING -d 11.22.33.44 -p tcp --dport 80 -j DNAT --to 192.168.1.5
/sbin/iptables -t nat -A POSTROUTING -d 192.168.1.5 -s 192.168.1.0/24 -p tcp --dport 80 -j SNAT --to 192.168.1.1

Last modified: 04/13/2005


首頁