0°

Iptables

数据包经过防火墙的路径

图1比较完整地展示了一个数据包是如何经过防火墙的,考虑到节省空间,该图实际上包了三种情况:

来自外部,以防火墙(本机)为目的地的包,在图1中自上至下走左边一条路径.由防火墙(本机)产生的包,在图1中从”本地进程”开始,自上至下走左边一条路径来自外部,目的地是其它主机的包,在图1中自上至下走右边一条路径.

图1

如果我们从上图中略去比较少用的mangle表的图示,就有图2所显示的更为清晰的路径图.

图2

禁止端口的实例

禁止ssh端口
只允许在192.168.62.1上使用ssh远程登录,从其它计算机上禁止使用ssh

$ iptables -A INPUT -s 192.168.62.1 -p tcp -d port 22 -j ACCEPT
$ iptables -A INPUT -p tcp -d port22 -j DROP

禁止代理端口

$ iptables -A INPUT -p tcp -d port 3128 -j REJECT

禁止icmp端口
除192.168.62.1外,禁止其它人ping我的主机

$ iptables -A INPUT -i eth0 -s 192.168.62.1/32 -p icmp -m icmp -icmp-type echo -r equest -j ACCEPT
$ iptables -A INPUT -i eth0 -p icmp -icmp-type echo -r equest–j DROP

$ iptables -AINPUT-ieth0-s192.168.62.1/32-picmp-micmp--icmp-type8-jACCEPT
$ iptables -AINPUT-ieth0-picmp-micmp--icmp-type8-jDROP

注:可以用iptables –protocol icmp –help查看ICMP类型

禁止QQ端口

$ iptables -DFORWARD -p udp -d port 8000 -j REJECT

强制访问指定的站点


1.在内核里打开ip转发功能

$ echo 1 > /proc/sys/net/ipv4/ip_forward

2.在NAT服务器上添加以下规则:
在PREROUTING链中添加目的地址转换规则:

$ iptables -t nat -I PREROUTING -i eth0 -p tcp -d port 53 -j DNAT -to-destination 202.96.134.130
$ iptables -t nat -I PREROUTING -i eth0 -p udp -d port 53 -j DNAT -to-destination 202.96.134.130

3.在POSTROUTING链中添加源地址转换规则:

$ iptables -t nat -I POSTROUTING -o eth1 -s 192.168.52.0/24 -p tcp -d port 53 -j SNAT -to-source 202.96.134.10:40000-50000
$ iptables -t nat -I POSTROUTING -o eth1 -s 192.168.52.0/24 -p udp -d port 53 -j SNAT -to-source 202.96.134.10:40000-50000

4.测试
在内部网任一台计算机上,将DNS设置为任意的外网IP,就可以使用DNS测试工具如nslookup来解析DNS服务器202.96.134.130上的名称.

发布内部网络服务器

要使因特网上的计算机访问到内部网的FTP服务器、WEB服务器,在做为防火墙的计算机上应添加以下规则:
1.在内核里打开ip转发功能

$ echo 1 > /proc/sys/net/ipv4/ip_forward

2.发布内部网web服务器

$ iptables -t nat -I PREROUTING -p tcp -i eth1 -s 202.96.134.0/24 -d port 80 -j DNAT -to-destination 192.168.52.15:80
$ iptables -t nat -I POSTROUTING -p tcp -i eth0 -s 192.168.52.15 -s port 80 -j SNAT -to-source 202.96.134.10:20000-30000

3.发布内部网ftp服务器

$ iptables -t nat -I PREROUTING -p tcp -i eth1 -s 202.96.134.0/24 -d port 21 -j DNAT -to-destination 192.168.52.14:21
$ iptables -t nat -I POSTROUTING -p tcp -i eth0 -s 192.168.52.14 -s port 21 -j SNAT -to-source 202.96.134.10:40000-50000

4.注意:内部网的计算机网关要设置为防火墙的ip(192.168.52.1)

5.测试:用一台IP地址为202.96.134.0段的计算机虚拟因特网访问,当在其浏览器中访问http://202.96.134.10时,实际应看到的是192.168.52.15的的web服务;当访问ftp://202.96.134.10时,实际应看到的是192.168.52.14上的的ftp服务.

端口映射

见透明代理设置

$ iptables -t nat -A PREROUTING -i eth0 -p tcp -s 192.168.62.0/24 -d port 80 -j REDIRECT -to-ports 3128

典型NAT上网

一般做为NAT的计算机同时也是局域网的网关,假定该机有两块网卡eth0和eth1,eth0连接外网,IP为202.96.134.134;eth1连接局域网,IP为192.168.62.10

1.在内核里打开ip转发功能

$ echo 1 > /proc/sys/net/ipv4/ip_forward

2.使局域网用户能访问internet所要做的nat

$ iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT -to-destination 202.96.134.134

如果上网的IP是动态IP,则使用以下规则:

$ iptables -t nat -A POSTROUTING -o eth0 -s 192.168.62.0/24 -j MASQUERADE

如果是通过ADSL上网,且公网IP是动态IP,则使用以下规则:

$ iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.62.0/24 -j MASQUERADE

3.使internet用户可以访问局域网内web主机所要做的nat

$ iptables -t nat -A PREROUTING -p tcp -d 202.96.134.134 -d port 80 -j DNAT -to-destination 192.168.62.10

注:局域网内的客户端需将默认网关、DNS设为防火墙的IP

IP规则的保存与恢复

iptables-save把规则保存到文件中,再由目录rc.d下的脚本(/etc/rc.d/init.d/iptables)自动装载
使用命令iptables -save来保存规则.一般用

iptables -save > /etc/sysconfig/iptables

生成保存规则的文件/etc/sysconfig/iptables
也可以用

service iptables save

它能把规则自动保存在/etc/sysconfig/iptables中.
当计算机启动时,rc.d下的脚本将用命令iptables-restore调用这个文件,从而就自动恢复了规则.

iptables指令语法

iptables [-t table] command [match] [-j target/jump]

[-t table]指定规则表
-t参数用来,内建的规则表有三个,分别是:nat、mangle和filter,当未指定规则表时,则一律视为是filter.个规则表的功能如下:

nat:此规则表拥有PREROUTING和POSTROUTING两个规则链,主要功能为进行一对一、一对多、多对多等网址转换工作(SNAT、DNAT),这个规则表除了作网址转换外,请不要做其它用途.

mangle:此规则表拥有PREROUTING、FORWARD和POSTROUTING三个规则链.除了进行网址转换工作会改写封包外,在某些特殊应用可能也必须去改写封包(TTL、TOS)或者是设定MARK(将封包作记号,以进行后续的过滤),这时就必须将这些工作定义在mangle规则表中,由于使用率不高,我们不打算在这里讨论mangle的用法.

filter:这个规则表是默认规则表,拥有INPUT、FORWARD和OUTPUT三个规则链,这个规则表顾名思义是用来进行封包过滤的处理动作(例如:DROP、LOG、ACCEPT或REJECT),我们会将基本规则都建立在此规则表中.

command常用命令列表:

命令 -A,--append
范例
iptables-AINPUT...
说明新增规则到某个规则链中,该规则将会成为规则链中的最后一条规则.

命令 -D,--delete
范例
iptables-DINPUT--dport80-jDROP
iptables-DINPUT1
说明从某个规则链中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除.

命令 -R,--replace
范例
iptables-RINPUT1-s192.168.0.1-jDROP
说明取代现行规则,规则被取代后并不会改变顺序.

命令 -I,--insert
范例
iptables-IINPUT1--dport80-jACCEPT
说明插入一条规则,原本该位置上的规则将会往后移动一个顺位.

命令 -L,--list
范例1
iptables-LINPUT
说明列出某规则链中的所有规则.
范例2
iptables-tnat-L
说明列出nat表所有链中的所有规则.

命令 -F,--flush
范例
iptables-FINPUT
说明删除filter表中INPUT链的所有规则.

命令 -Z,--zero
范例
iptables-ZINPUT
说明将封包计数器归零.封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具.

命令 -N,--new-chain
范例
iptables-Nallowed
说明定义新的规则链.

命令 -X,--delete-chain
范例
iptables-Xallowed
说明删除某个规则链.

命令 -P,--policy
范例
iptables-PINPUTDROP
说明定义过滤政策.也就是未符合过滤条件之封包,默认的处理方式.

命令 -E,--rename-chain
范例
iptables-Ealloweddisallowed
说明修改某自定义规则链的名称.

[match]常用封包匹配参数:


参数 -p,--protocol
范例
iptables -A INPUT -p tcp
说明匹配通讯协议类型是否相符,可以使用!运算符进行反向匹配,例如:
-p !tcp
意思是指除tcp以外的其它类型,如udp、icmp...等.
如果要匹配所有类型,则可以使用all关键词,例如:
-p all

参数 -s,--src,--source
范例
iptables -A INPUT -s 192.168.1.1
说明用来匹配封包的来源IP,可以匹配单机或网络,匹配网络时请用数字来表示子网掩码,例如:
-s 192.168.0.0/24
匹配IP时可以使用!运算符进行反向匹配,例如:
-s !192.168.0.0/24

参数 -d,--dst,--destination
范例
iptables -A INPUT -d 192.168.1.1
说明用来匹配封包的目的地IP,设定方式同上.

参数 -i,--in-interface
范例
iptables -A INPUT -i eth0
说明用来匹配封包是从哪块网卡进入,可以使用通配字符+来做大范围匹配,例如:
-i eth+
表示所有的ethernet网卡
也可以使用!运算符进行反向匹配,例如:
-i !eth0

参数 -o,--out-interface
范例
iptables -A FORWARD -o eth0
说明用来匹配封包要从哪块网卡送出,设定方式同上.

参数 --sport,--source-port
范例
iptables -A INPUT -p tcp -s port 22
说明用来匹配封包的源端口,可以匹配单一端口,或是一个范围,例如:
-s port 22:80
表示从22到80端口之间都算是符合条件,如果要匹配不连续的多个端口,则必须使用--multiport参数,详见后文.匹配端口号时,可以使用!运算符进行反向匹配.

参数 --dport,--destination-port
范例
iptables-AINPUT-ptcp--dport22
说明用来匹配封包的目的地端口号,设定方式同上

参数 --tcp-flags
范例
iptables -p tcp -tcp-flags SYN,FIN,ACKSYN
说明匹配TCP封包的状态标志,参数分为两个部分,第一个部分列举出想匹配的标志,第二部分则列举前述标志中哪些有被设置,未被列举的标志必须是空的.TCP状态标志包括:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)、PSH(强迫推送)等均可使用于参数中,除此之外还可以使用关键词ALL和NONE进行匹配.匹配标志时,可以使用!运算符行反向匹配.

参数 --syn
范例
iptables -p tcp --syn
说明用来表示TCP通信协议中,SYN位被打开,而ACK与FIN位关闭的分组,即TCP的初始连接,与iptables -p tcp --tcp-flags SYN,FIN,ACKSYN的作用完全相同,如果使用!运算符,可用来匹配非要求连接封包.

参数 -m multiport --source-port
范例
iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
说明用来匹配不连续的多个源端口,一次最多可以匹配15个端口,可以使用!运算符进行反向匹配.

参数 -m multiport --destination-port
范例
iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
说明用来匹配不连续的多个目的地端口号,设定方式同上

参数 -m multiport --port
范例
iptables -A INPUT -p tcp -m multiport --port 22,53,80,110
说明这个参数比较特殊,用来匹配源端口和目的端口号相同的封包,设定方式同上.注意:在本范例中,如果来源端口号为80目的地端口号为110,这种封包并不算符合条件.

参数 --icmp-type
范例
iptables -A INPUT -p icmp --icmp-type8
说明用来匹配ICMP的类型编号,可以使用代码或数字编号来进行匹配.请打iptables-picmp--help来查看有哪些代码可用.

参数 -m limit --limit
范例
iptables -A INPUT -m limit --limit3/hour
说明用来匹配某段时间内封包的平均流量,上面的例子是用来匹配:每小时平均流量是否超过一次3个封包.除了每小时平均次外,也可以每秒钟.
「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
网络管理
常用命令
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论