iptables和linux内核中的netfilter集成使用,组成linux的防火墙系统,iptablse可以看作是此防火墙系统的应用CLI。因此,iptables的移植除了要修改自身的配置,也需要重新配置内核已支持netfilter.
从网上下载iptables源码,如http://www.netfilter.org/projects/iptables/downloads.html。
因AP121使用的内核版本为2.6.31,我下载的源码也是专为2.6.31升级的版本iptables-1.4.5。
解压,放置到ap121开发环境目录下apps/iptables/iptables-1.4.5.
如果直接使用命令来配置:
./configure --host=mips-linux --disable-ipv6 –disable-shared
则后续需要修改其生成的所有makefile中的与交叉编译工具连相关的内容,如CC、LD、AR、STRIP等等,比较麻烦。
这里利用开发环境中的移植设置好的默认变量,在主makefile Makefile.ap121-2.6.31中编写configure操作,先定义iptables makefile中特有的变量,然后定义configure操作:
# #For iptables configure # export kbuilddir = $(KERNELPATH) export kinclude_CFLAGS = -I$(KERNELPATH)/include export ksourcedir = $(KERNELPATH)
iptables_config: @echo Start to configure iptables ... cd $(TOPDIR)/apps/iptables/iptables-1.4.5 && \ ./configure --host=mips-linux --disable-ipv6 --disable-shared --prefix=$(INSTALL_ROOT)
|
此处指定了cpu类型为mips,禁用ipv6,禁用共享库,安装路径指定为交叉编译环境中统一定义的FS路径。
此时,如果交叉编译环境编译果,交叉编译工具链已经制作好,则执行如下命令可配置iptable并生成makefile:
#make iptables_config BOARD_TYPE=ap121-2.6.31
此时可以查看确认生成的makefile中使用的是否是交叉编译工具链。
仍然在在主makefile Makefile.ap121-2.6.31中编写iptables build操作:
iptables_build: @echo making iptables cd $(TOPDIR)/apps/iptables/iptables-1.4.5 && \ $(MAKE) clean KERNEL_DIR=$(KERNELPATH) && \ $(MAKE) KERNEL_DIR=$(KERNELPATH) NO_SHARED_LIBS=1 DO_IPV6=0 && \ $(MAKE) install |
编译时指定不使用共享库,不使用ipv6.
编译时可能会出现如下错误:
libxtables.so: undefined reference to `in6addr_any’’
此时需要打补丁文件,从官网bugzilla 上下载,bug号608:
http://bugzilla.netfilter.org/show_bug.cgi?id=608
然后把iptables_build加到主makefile的主build定义中,每次系统编译时自动编译iptables,如下:
ap121-2.6.31_build: common_mainline iptables_build dns_build wlan_driver_build $(BUILD_TYPE)_build |
可以把iptables_configure加在iptables_build中,即每次make都重新config。
iptables_build: iptables_config @echo making iptables cd $(TOPDIR)/apps/iptables/iptables-1.4.5 && \ $(MAKE) clean KERNEL_DIR=$(KERNELPATH) && \ $(MAKE) KERNEL_DIR=$(KERNELPATH) NO_SHARED_LIBS=1 DO_IPV6=0 && \ $(MAKE) install |
此时make iptables后就会在目标板文件系统目录下生成iptables等执行文件
iptables编译安装后不能正常工作,需要内核支持netfilter,打开内核配置界面:
#cd linux/kernels/mips-linux-2.6.31
#make menuconfig
load ap121内核配置文件,如下图:
按如下路径选择支持netfilter:
[*] Networking support --->
Networking options --->
[*] Network packet filtering framework (Netfilter) --->
进入netfilter配置菜单,如下:
其中两项必须配置,可以根据需要选择要加载的模块。因我们需要使用NAT功能,nat相关的全部选上。为了方便,选中的模块全部以build-in的方式加载
Core Netfilter Configuration --->
IP: Netfilter Configuration --->
我选择的项如下,其它未作选择:
Core Netfilter Configuration --->
<*> Netfilter NFQUEUE over NFNETLINK interface
<*> Netfilter LOG over NFNETLINK interface
<*> Netfilter connection tracking support
<*> Connection tracking netlink interface
-*- Netfilter Xtables support (required for ip_tables)
<*> "NFQUEUE" target Support
<*> "iprange" address range match support
<*> "mac" address match support
<*> "physdev" match support
IP: Netfilter Configuration --->
<*> IPv4 connection tracking support (required for NAT)
[*] proc/sysctl compatibility with old connection tracking
<*> IP Userspace queueing via NETLINK (OBSOLETE)
<*> IP tables support (required for filtering/masq/NAT)
<*> Packet filtering
<*> REJECT target support
<*> Full NAT
<*> MASQUERADE target support
<*> REDIRECT target support
<*> Packet mangling
<*> raw table support (required for NOTRACK/TRACE)
<*> ARP tables support
配置完成后保存,退出,重新编译系统。
运行iptables时,可能会出现如下信息:
modprobe: could not parse modules.dep
这不会影响iptables的功能。详细的信息请查阅代码或请见官网bugzilla:
http://bugzilla.netfilter.org/show_bug.cgi?id=619
Iptables的基础知识请查询相关文档。
Iptables通常包括三个表格(Fliter、NAT、Mangle)
filter∶是预设的table 。通常下面有三个链(chain)
INPUT∶ 进入本机的数据包
OUTPUT∶本机所要送出的数据;
FORWARD∶本机端口间转发的数据包
NAT:主要用来做源与目的IP或者端口的转换。
PREROUTING∶在进行路由判断之前所要进行的规则(DNAT/REDIRECT)。
POSTROUTING∶在进行路由判断之后所要进行的规(SNAT/MASQUERADE)。
OUTPUT∶发送出去的封包规则
mangle∶这个表格主要是与特殊的封包的路由旗标有关,较少使用mangle 这个表格。
iptables常见命令及参数如下:
iptables [-t tables] [-L] [-nv]
-t ∶后面接table ,例如nat 或filter ,若省略此项目,则使用预设的filter
-L ∶列出目前的table 的规则
-n ∶不进行IP 与HOSTNAME 的反查,显示讯息的速度会快很多!
-v ∶列出更多的资讯,包括通过该规则的封包总位元数、相关的网路介面等
iptables [-t tables] [-FXZ]参数∶
-F ∶清除所有的已订定的规则;
-X ∶杀掉所有使用者"自订" 的chain (应该说的是tables )
-Z ∶将所有的chain 的计数与流量统计都归零
iptables -P [INPUT,OUTPUT,FORWARD][ACCEPT,DROP](默认操作filter表格)
iptables -t -nat -P[PREROUTING,POSTROUTING,OUTPUT][ACCEPT,DROP]参数∶
-P ∶定义默认策略( Policy )。注意,这个P 为大写啊!
ACCEPT ∶该封包可接受
DROP ∶该封包直接丢弃,不会让client 端知道为何被丢弃。
iptables [-AI 链] [-io 网路介面] [-p 协议] [-s 来源IP/掩码] [-d 目标IP/掩码] -j [ACCEPT|DROP]
-AI 链∶针对某的链进行规则的"插入" 或"增加"
-A ∶新增加一条规则,该规则增加在原本规则的最后面
-I ∶插入一条规则。如果没有指定此规则的顺序,预设是插入变成第一条规则。
-io :网路介面∶设定数据包进出的介面规范
-i ∶数据包所进入的那网路介面,例如eth0, lo 等介面。需与INPUT 配合;
-o ∶数据包所传出的那个网路介面,需与OUTPUT 链配合;
-p :协议∶设定此规则适用于哪种数据包格式主要的数据包格式有∶ tcp, udp, icmp 及all 。
-s :来源IP/掩码∶设定此规则之数据包的来源项目,可指定单纯的IP 或包括掩码。若规范为『不许』时,则加上! 即可,例如∶-s ! 192.168.100.0/24 表示不许192.168.100.0/24 之数据包来源;
-d :目标IP/掩码∶同-s ,只不过这里指的是目标的IP 或网域。
-j ∶后面接动作,主要的动作有接受(ACCEPT)、丢弃(DROP) 及记录(LOG)
iptables [-AI 链] [-io 网路介面] [-p tcp,udp] [-s 来源IP/网域] [--sport 端口范围]
> [-d 目标IP/网域] [--dport 端口范围] -j [ACCEPT|DROP]参数∶
--sport 端口范围∶限制来源的端口号码,端口号码可以是连续的,例如1024:65535
--dport 端口范围∶限制目标的端口号码。
iptables -A INPUT -m state --state 状态参数∶
-m ∶一些iptables 的模组,主要常见的有∶
state ∶状态模组
mac ∶网路卡硬体位址(hardware address)
--state ∶一些数据包的状态,主要有∶
INVALID ∶无效的数据包,例如资料破损的数据包状态
ESTABLISHED∶已经连线成功的连线状态;
NEW ∶想要新建立连线的数据包状态;
RELATED ∶这个最常用!表示这个数据包是与我们主机发送出去的数据包有关。
AP121平台在我们项目的应用中,分为两种模式:标准模式和repeater模式。
标准模式即无线路由器模式,其接口如下:
eth0:wan口一个,有线以太网
eth1:lan口一个,有线局域网
ath0:无线AP
br0:内建的bridge接口,上面绑定了eth1和ath0。
在这种模式下,eth1和ath0在一个局域网内,本机不同网段的数据转发发生在br0和eth0之间。操作如下:
#echo 1 > /proc/sys/net/ipv4/ip_forward //使能内核ip转发
#iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE //eth0出去的数据包伪装本机IP.
Iptables filter链表中默认输入输出都是accept的,使用默认值即可;如果默认是drop的,需要打开br0接收:
#iptables -A FORWARD -i br0 -j ACCEPT
使用如下命令可以查看设定的规则:
#iptables -nvL //查看filter链表已建立的规则
#iptables -t nat -nvL //查看nat链表已经建立的规则
另外,测试时,lan和wan要设定为不同网段,lan口和wan口上连接的测试机网要设定为相应端口的地址。
如果powershare工作在repeater模式:
在以上基础上增加一个station端口:ath1
其它端口状态和上面的相同。
增加如下操作:
#iptables -t nat -A POSTROUTING -o ath1 -j MASQUERADE
则ath1端口也作为一个外网端口。
如果有几个interface绑定在brigde上,iptables指定的接口要是brigde。
系统必须打开ip forward,否则系统内部不同网段包不被转发
查看系统forward参数是否为1,
#cat /proc/sys/net/ipv4/ip_forward
如果不是,需要设定为1
#echo 1 > /proc/sys/net/ipv4/ip_forward
网关必须设定,局域网lan上连接的测试网关一定要设置为br0地址,wan口上连接的测试机网关一定要设置为eth0地址,否则ping不通
外网端口和局域网端口IP不能设定在相同网段内。
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o ath1 -j MASQUERADE