全部博文(685)
分类: LINUX
2014-09-05 10:50:45
首先我们要学会使用netfilter,熟悉其实现的一些功能,才能有目的的去阅读源码。这里我们介绍一下iptables 的使用。
Iptables:ipv4 防火墙及NAT功能的配置工具。
命令行格式:
iptables [-t table] {-A|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
1、显示netfilter 中配置的规则
iptable -L
iptable -t nat -L
iptable -t nat -L -v
iptable -t nat -L -vv
-v 显示详细信息,-vv显示的更详细一些 。不指定表就显示默认表filter 的信息
--line-numbers 显示时带上行号
例:
2、追加规则
-A, --append chain rule-specification
把一条或多条规则添加到所选chain的尾部,如果源/目的地址是多个时,为每种地址组合单独添加一条规则。
例:iptables -A INPUT -d 1.1.1.1,1.1.1.2 -s 2.2.2.2,2.2.2.3 -j DROP
添加后规则如下:
3、删除规则
-D, --delete chain rule-specification
-D, --delete chain rulenum
例:iptables -D INPUT 1
-I, --insert chain [rulenum] rule-specification
插入规则,如果没有指定行号,就默认加入到chain头部
例:iptables -I INPUT -s 9.9.9.9 -j ACCEPT
例:iptables -I INPUT 3 -s 5.5.5.5 -j ACCEPT
5、替换规则
-R, --replace chain rulenum rule-specification
例:iptables -R INPUT 2 -s 3.3.3.3 -d 5.5.5.5 -j REJECT
6、清空所有规则
-F, --flush [chain]
例:iptables -t mangle -F INPUT //删除mangle表中INPUT chain中所有规则
例:iptables -t mangle -F //删除mangle表中所有规则
7、清空规则的统计计数
-Z, --zero [chain [rulenum]]
例:iptables -Z INPUT 1
8、修改chain的默认target
-P, --policy chain target
该命令只能修改系统自带的chain的默认target,不能修改用户自定义的chain。
如果报文被该chain截获,如果该chain中没有规则匹配该报文,就是要默认target来处理该报文。
例:iptables -P INPUT DROP
9、用户自定义chain
-N, --new-chain chain
例:iptables -N pang
10、删除用户自定义chain
-X, --delete-chain [chain]
11、重命名用户自定义chain
-E, --rename-chain old-chain new-chain
1、[!] -p, --protocol protocol
传输层协议类型,可以正向/反向匹配
2、[!] -s, --source address[/mask][,...]
源IP地址
3、[!] -d, --destination address[/mask][,...]
目的IP地址
4、[!] -i, --in-interface name
报文接收设备
5、[!] -o, --out-interface name
报文发送设备
6、[!] -f, --fragment
只配置分片报文的第二及后续片报文
例:iptables -A INPUT -s 1.1.1.1 -d 2.2.2.2 -p udp ! -i eth0 -f -j DROP
7、-c, --set-counters packets bytes
设置初始的报文统计值
例:iptables -A INPUT -p udp -c 12 900 -j ACCEPT
8、-j, --jump target
给规则设置target,target可以是系统定义的和一些扩展的,还可以指定用户自定义的chain。
指定用户自定义的chain就会跳到chain里去处理报文,如果chain里没有定义匹配报文的规则,会从用户自定义的chain里返回原来的chain中继续执行。
9、-g, --goto chain
跳到用户自定义的chain中执行,如果没匹配规则就退出执行,不再返回原来的chain中继续执行。
例:
iptables -N pang
ptables -A INPUT -p icmp -g pang
iptables -A INPUT -p icmp -j DROP
配置如上,这时从外部ping本机是可以ping的。
接着执行如下命令
iptables -R INPUT 1 -p icmp -j pang
这时是无法ping本机的。
Netfilter 系统默认定义了四个target:ACCEPT, DROP, QUEUE or RETURN
ACCEPT:表示允许报文通过
DROP:表示不允许报文通过,并且丢弃该报文
QUEUE:把报文放入netlink定义的队列里,通过netlink来把报文送给用户空间相应程序处理,QUEUE只能放入0号队列中,还有一种扩展的NFQUEUE,可以指定把报文放入那个队列中。
RETURN:停止在当前chain中的执行并返回上一个chain中继续执行,如果该执行不存在上一个chain,就使用当前chain的默认target来处理报文
使用扩展Match 有些需要使用参数 -m,该参数会让iptables动态的加载相关动态库来进行相应的规则设置,并且如果该match在内核是以模块形式编译的,会让内核加载相应的模块。
1、comment
允许给每条规则加一个最大长度256的字符串,用字符串来命名该规则。该match其实只是根据netfilter提供的框架来实现的一个给规则命名的功能,并不对报文进行匹配。具体实现详见后续章节。
--comment comment
例:iptables -A INPUT -p icmp -m comment --comment "my first rule" -j DROP
对icmp协议进一步进行匹配
[!] --icmp-type {type[/code]|typename}
例:iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
3、udp
[!] --source-port,--sport port[:port]
[!] --destination-port,--dport port[:port]
对udp报文的进一步匹配,当规则里使用 -p udp 时可以使用上面的参数来制定端口号。
例:iptables -A INPUT -p udp --sport 60:80 --dport 10 -j DROP
4、tcp
tcp协议比较复杂,匹配的元素较多,这里不详细讲解了。
主要使用源/目的端口号
[!] --source-port,--sport port[:port]
[!] --destination--port,--dport port[:port]
5、ttl
根据ip头部的ttl字段进行匹配
--ttl-eq ttl //相等的ttl
--ttl-gt ttl 大于的ttl
--ttl-lt ttl 小于的ttl
例:iptables -A INPUT -p icmp -m ttl --ttl-eq 50 -j DROP
这时从外部windows主机使用 ping host -i 50 就无法ping 通本机了。
6、iprange
Ip地址范围
[!] --src-range from[-to]
[!] --dst-range from[-to]
例、iptables -A INPUT -p udp -m iprange --src-rang 192.168.3.100 -j DROP
不设置to就指匹配一个ip地址。
例、iptables -A INPUT -p udp -m iprange --src-rang 192.168.3.100-192.168.3.200 -j DROP
这时源ip 在 192.168.3.100 到192.168.3.200 之间的报文就会被丢弃了。
7、Length
根据报文长度来匹配报文,该长度是按IP层的净荷来算的(不算IP头的长度)。
[!] --length length[:length]
例、iptables -A INPUT -p udp -m length --length 50-60 -j DROP
这时打入长度为50 到60 的报文就被丢弃了。
8、mac
[!] --mac-source address
源MAC匹配,MAC地址格式必须是XX:XX:XX:XX:XX:XX,可以在 INPUT FORWARD,PRERONGING 这三个chain中使用
例、iptables -A INPUT -m mac --mac-source 00:01:00:02:00:03 -j LOG --log-level error
从外部打入源MAC是00:01:00:02:00:03的报文,就会有log在串口打印出来了。
9、Multiport
端口范围匹配
[!] --source-ports,--sports port[,port|,port:port]... //源端口
[!] --destination-ports,--dports port[,port|,port:port]... //目的端口
[!] --ports port[,port|,port:port]...//源端口和目的端口都会匹配
该匹配规则只能用在 udp 和tcp报文,必须指定 -p udp 或 -p tcp
使用逗号最多可指定15个端口范围。
例、iptables -A INPUT -p udp -m multiport --sport 50:70 -j DROP
打入端口是60 的udp的报文,该报文就会被丢弃。
这里介绍了一些常用的扩展Match,还有一些更高级的match这里就先不介绍了。
1、REJECT
拒绝连接,和DROP不同之处是REJECT把报文丢弃后会给发送方返回一个连接失败的回应。具体的回应报文类型可以指定。
--reject-with type
type值可以是:
icmp-port-unreachable,(默认值)
icmp-net-unreachable,
icmp-host-unreachable,
icmp-proto-unreachable,
icmp-net-prohibited,
icmp-host-prohibited or
icmp-admin-prohibited
例、iptables -A INPUT -p icmp -j REJECT --reject-with icmp-host-unreachable
2、NOTRACK
对特定的报文关闭连接跟踪,该TARGET 只能用在raw表里
例、iptables -t raw -R PREROUTING 1 -p icmp -j NOTRACK
关闭所有对icmp报文的连接跟踪,这时执行
cat /proc/net/nf_conntrack | grep icmp 将看不到任何icmp报文的连接跟踪信息。
删除该规则后,ping 本机,就会看有icmp报文的连接跟踪了。
3、LOG
用于记录报文信息,可以通过dmesg 来查看
--log-level level //log级别
--log-prefix prefix //log前加一个前缀
--log-tcp-sequence // log 中的报文信息中包含tcp sequence ,默认不包含
--log-tcp-options //同上
--log-ip-options //同上
--log-uid //log信息中打印产生该报文进程的uid 号
例、iptables -A INPUT -p icmp -j LOG --log-level error --log-prefix "abc"
4、NFQUEUE
通过netlink来把报文直接送到用户空间进行处理,该TARGET和 QUEUE的区别就是可以指定netflter中实现的netlink 队列号。用户空间的处理程序需要用户自己实现。
--queue-num value //队列号
--queue-balance value:value //指定队列号的范围,netfilter会均匀的分给多个队列
扩展的TARGET有一些是要结合高级路由和流量控制来使用,这里就不介绍了,后续用到再介绍
NAT 的设置详见下一篇
(未完待续)