iptables
iptables是linux操作系统中一个重要的概念,但是同时它又比较复杂,所以弄清楚它得花一番功夫,我们先来看看iptables的流程:
- iptables的结构:
表 : filter 过滤表 nats Network Address Translator,即做ip转换
链 :
INPUT: 位于 filter 表,匹配目的 IP 是本机的数据包
FORWARD: 位于 filter 表,匹配穿过本机的数据包,
PREROUTING: 位于 nat 表,用于修改目的地址(DNAT)
POSTROUTING:位于 nat 表,用于修改源地址 (SNAT)
iiptables流程:
1. 数据包到达网络接口,比如 eth0。 2. 进入 nat 表的 PREROUTING 链,可以在此做DNAT,但不要做过滤。 3. 决定路由,看是交给本地主机还是转发给其它主机。如果是转发给其他主机:
4. 进入 filter 表的 FORWARD 链,在这里我们可以对所有转发的数据包进行过滤。 需要注意的是:经过这里的数据包是转发的,方向是双向的。 5. 进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT ,不要在这里进行过滤。 6. 进入出去的网络接口。完毕。如果是交给本地主机:
4. 进入 filter 表的 INPUT 链,在这里我们可以对流入的所有数据包进行过滤,无论它来自哪个网络接口。 5. 交给本地主机的应用程序进行处理,处理完毕后进行路由决定,看该往那里发出。 6. 进入 nat 表的 OUTPUT 链,可以对防火墙自己发出的数据做 NAT 。 7. 再次进行路由决定。 8. 进入 filter 表的 OUTPUT 链,可以对本地出去的数据包进行过滤。 9. 进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT ,不要在这里进行过滤。 10. 进入出去的网络接口,完毕。iptables语法:
iptables [-t 要操作的表] <操作命令> [要操作的链] [规则号码] [匹配条件] [-j 匹配到以后的动作]操作命令:
-A <链名> APPEND,追加一条规则(放到最后)
-I <链名> [规则号码] INSERT,插入一条规则,规则号码就是插入该链的第几条规则
-D <链名> <规则号码 | 具体规则内容> DELETE,删除一条规则
-P <链名> <动作> POLICY,设置某个链的默认规则
-R <链名> <规则号码> <具体规则内容> REPLACE,替换一条规则
-F [链名] FLUSH,清空规则
-L [链名] LIST,列出规则
用例:
iptables -t filter -A INPUT -j DROP在 filter 表的 INPUT 链里追加一条规则(作为最后一条规则),匹配所有访问本机 IP 的数据包,匹配到的丢弃。
iptables -I INPUT 3 -j DROP在 filter 表的 INPUT 链里插入一条规则(插入成第 3 条)
iptables -D INPUT -s 192.168.0.1 -j DROP(按内容匹配)删除 filter 表 INPUT 链中内容为“-s 192.168.0.1 -j DROP”的规则(不管其位置在哪里)
iptables -R INPUT 3 -j ACCEPT将原来编号为 3 的规则内容替换为“-j ACCEPT”
iptables -P INPUT DROP设置 filter 表 INPUT 链的默认规则是 DROP
iptables -t nat -F PREROUTING清空 nat 表 PREROUTING 链中的所有规则
iptables -L粗略列出 filter 表所有链及所有规则
匹配条件
流入、流出接口(-i、-o) 来源、目的地址(-s、-d) 协议类型 (-p) 来源、目的端口(--sport、--dport)动作
ACCEPT 不拦截 DROP 丢弃 SNAT 做源地址转换 DNAT 做目的地址转换
在运用iptables的时候得多思考流程图,然后按照上面的规则一一匹配。
router
首先使用route -n观察一个本地主机的路由表:
目标 网关 子网掩码 标志 跃点 引用 使用 接口
0.0.0.0 192.168.0.1 0.0.0.0 UG 100 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
通过读上面的路由表我们可以知道:如果一个数据包目的地址是192.168.0.x(由192.168.0.0与255.255 .255.0得出),则由本机直接发出,这种情况是在局域网内通信。如果一个数据包ip是任意的,那么主机 就会把这个包转发给网关:192.168.0.1。
route
route add -net 192.168.0.0 netmask 255.255.255.0 gw 192.168.0.1 route del -net 192.168.0.0 netmask 255.255.255.0 gw 192.168.0.1
上述命令可以在路由表中添加和删除路由规则,但是在添加的时候一定要确保能够与目的网段能够 MAC互通。
我们一般在查看数据包的转发情况时都会使用到traceroute这个软件,它能让你很明晰地了解到你的包 的转发过程。由于route不会像iptables那么多规则,所以route还是相对比较简单的。