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


首页