iptables

来源:互联网 发布:啊哈!算法pdf 编辑:程序博客网 时间:2024/04/26 08:19
S

Reference:

http://blog.csdn.net/wallace_star/article/details/5625726

http://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html 本文主要基于这个文档

http://www.frozentux.net/documents/iptables-tutorial/  原版

http://en.wikipedia.org/wiki/Iptables

http://ebtables.sourceforge.net/br_fw_ia/br_fw_ia.html

http://users.telenet.be/mydotcom/howto/lanconnect/router/linux.htm  如何配置linux作为router


家族组成:

iptables  应用于 IPV4

ip6tables 应用于 IPV6

arptables 应用于 ARP

ebtables 应用于 ethernet


在内核中x_tables模块是这个四个自模块的共用部分。


nat 表

nat表的主要用处是网络地址转换,即Network Address Translation,缩写为NAT。
做过NAT操作的数据包的地址就被改变了,当然这种改变是根据我们的规则进行的。
属于一个流的包只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,
那么余下的包都会自动地被做相同的操作。也就是说,余下的包不会再通过这个表,
一个一个的被NAT,而是自动地完成。这就是我们为什么不应该在这个表中做任何过
滤的主要原因,对这一点,后面会有更加详细的讨论。

PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地址,如果需要的话。

OUTPUT链改变本地产生的包的目的地址。

POSTROUTING链在包就要离开防火墙之前改变其源地址。


mangle

这个表主要用来mangle数据包。我们可以改变不同的包及包头的内容,
比如 TTL,TOS或MARK。注意MARK并没有真正地改动数据包,它只是在
内核空间为包设了一个标记。防火墙内的其他的规则或程序(如tc)
可以使用这种标记对包进行过滤或高级路由。这个表有五个内建的链:
PREROUTING,POSTROUTING, OUTPUT,INPUT和 FORWARD。


PREROUTING在包进入防火墙之后、路由判断之前改变包,
POSTROUTING是在所有路由判断之后。
OUTPUT在确定包的目的之前更改数据包。
INPUT在包被路由到本地之后,但在用户空间的程序看到它之前改变包。
FORWARD在最初的路由判断之后、最后一次更改包的目的之前mangle包。

注意,mangle表不能做任何NAT,它只是改变数据包的 TTL,TOS或MARK,
而不是其源目地址。NAT是在nat表中操作的。


filter表

filter表是专门过滤包的,内建三个链,可以毫无问题地对包进行
DROP、LOG、ACCEPT和REJECT等操作。

FORWARD 链过滤所有不是本地产生的并且目的地不是本地(所谓本地就是防火墙了)的包,

INPUT恰恰针对那些目的地是本地的包。
OUTPUT 是用来过滤所有本地生成的包的。


Destination -- Local HostStepTableChainComment1  on the wire2  comes in on the interface3manglePREROUTINGThis chain is normally used for mangling
packets, i.e, changing TOS, TTL 4nat PREROUTINGThis chain is used for DNAT mainly5  Routing decision6mangle INPUTAt this point, the mangle INPUT chain is hit7filterINPUTThis is where we do filtering for all incoming
traffic destined for our local host8  local application


                                                                              Source -- Local Host

StepTableChainComment1  Local Application2  Routing decision, What source address to use
what outgoing interface to use3mangleOUTPUT 4natOUTPUTThis chain can be used to NAT outgoing packets
from the firewall itself5  Routing decision, since the previous mangle and
nat changes may have changed how the packet
should be routed.6filterOUTPUTFilter the packet7mangle POSTROUTING 8natPOSTROUTINGWhere we do SNAT9  Go out on some interface10  on the wire


Forward PacketStepTableChainComment1  On the wire2  Come in on the interface3manglePREROUTINGUsually mangling packet4natPREROUTINGThis is used for DNAT5  Routing decision6mangleFORWARD 7filterFORWARDSet your rule here8manglePOSTROUTING 9natPOSTROUTINGThis is used for SNAT10  Get out on the outgoing interface11  On the wire


规则的保存与恢复

iptables-save 和 iptables-restore 来保存和恢复规则

保存的格式如下


# Generated by iptables-save v1.4.10 on Mon Jun 18 21:21:58 2012
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [3875:235839]
:POSTROUTING ACCEPT [3875:235839]
COMMIT
# Completed on Mon Jun 18 21:21:58 2012
# Generated by iptables-save v1.4.10 on Mon Jun 18 21:21:58 2012
*mangle
:PREROUTING ACCEPT [18621:12648264]
:INPUT ACCEPT [18621:12648264]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [20596:4505018]
:POSTROUTING ACCEPT [20640:4513342]
COMMIT
# Completed on Mon Jun 18 21:21:58 2012
# Generated by iptables-save v1.4.10 on Mon Jun 18 21:21:58 2012
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [20596:4505018]
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i ipsec+ -p 254 -j ACCEPT
-A INPUT -p esp -j ACCEPT
-A INPUT -p ah -j ACCEPT
-A INPUT -p udp -m udp --dport 500 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 5308 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 5900 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 5901 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 12080 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 113 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 5656 -j ACCEPT
-A INPUT -p udp -m udp --dport 5004:5005 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 5004:5005 -j ACCEPT
-A INPUT -p udp -m udp --dport 20830 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20830 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 5060:5062 -j ACCEPT
-A INPUT -p udp -m udp --dport 5060:5062 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21100 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 2001 -j ACCEPT
-A INPUT -p gre -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 4 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 12 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 9 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8081 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 1533 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 30000:30005 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 67:68 -j DROP
-A INPUT -p udp -m udp --dport 67:68 -j DROP
-A INPUT -p tcp -m tcp --dport 137 -j DROP
-A INPUT -p udp -m udp --dport 137 -j DROP
-A INPUT -p tcp -m tcp --dport 138 -j DROP
-A INPUT -p udp -m udp --dport 138 -j DROP
-A INPUT -p tcp -m tcp --dport 139 -j DROP
-A INPUT -p udp -m udp --dport 139 -j DROP
-A INPUT -p tcp -m tcp --dport 1:20 -j DROP
-A INPUT -p tcp -m tcp --dport 111 -j DROP
-A INPUT -p tcp -m tcp --dport 161:162 -j DROP
-A INPUT -p tcp -m tcp --dport 520 -j DROP
-A INPUT -p tcp -m tcp --dport 6348:6349 -j DROP
-A INPUT -p tcp -m tcp --dport 6345:6347 -j DROP
-A INPUT -p tcp -m limit --limit 3/min -j LOG --log-prefix "FIREWALL: " --log-level 6
-A INPUT -p udp -m limit --limit 3/min -j LOG --log-prefix "FIREWALL: " --log-level 6
-A INPUT -j DROP
COMMIT
# Completed on Mon Jun 18 21:21:58 2012

#后表示为注释

*后跟表的名字, 接下来就是这个表的内容。

表包含了链 和 规则。

链的详细说明是:<chain-name> <chain-policy> [<packet-counter>:<byte-counter>]

后面就是该链的规则。


规则

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


可以使用上面的命令来添加iptable中的规则。

该命令中指定了如下几个部分。

-t 选项指定了修改哪个表,

在command中指定了在哪个链中,添加/删除/修改/插入 某个规则


Command

-A  添加

-D 删除

-R 替换

-I 插入

-F 清空规则

-Z 归零计数器

-P 设置链的policy,就是默认的target

-N 新建用户自定义链

-X 删除用户自定义链

-E 重命名某个自定义链

-L  显示


Match

作者把match归成五类。

1. generic match 通用匹配

2. tcp match

3. udp match

4. icmp match

5. state, owner, limit match


以上2-4可以称为隐式匹配,

5是显式匹配,显式匹配必须使用-m来指定。


Generic Match 通用匹配

-p, --protocol    匹配协议

-s, --src           匹配源ip地址

-d, --dst           匹配目标ip地址

-i                     匹配进入的接口地址

-o                    匹配离开的接口地址

-f                     匹配分片的非第一个包


tcp match

tcp match 都需要以 -p tcp 为前提

--sport             匹配源端口

--dport             匹配目的端口

--tcp-flags        匹配tcp的flag, 如SYN, ACK, FIN, RST, PSH


udp match

udp match都需要以-p udp为前提

--sport            匹配源端口

--dport            匹配目的端口


icmp match

icmp match 都要以-p icmp为前提

--icmp-type     匹配icmp的类型


limit match

-m limit --limit 3/hour     每小时出现3次

-m limit --limit-burst       不详


mat match

-m mac --mac-source xxxx  匹配源mac地址


mark match

-m mark --mark num   匹配包被设置的mark值


multiport match

-p tcp -m multiport --source-port 22,53,80  匹配多个源端口

-p tcp -m multiport --destination-port 23,4  匹配多个目的端口

-p tcp -m multiport --port 22,34,32             匹配源和目的端口一样的包


owner match

-m owner --uid-owner 50

-m owner --gid-owner 50

-m owner --pid-owner 43

-m owner --sid-owner 43


state match

-m state --state STATE

可以匹配四种状态, INVALID, ESTABLISHED, NEW, RELATED。


TOS match

-m tos --tos value


TTL match

-m ttl --ttl value


Target/Jump

该语法是 --jump target 或 -j target

可以跳转到  某个具体的操作(ACCEPT 或者 DROP) 或者是同个表内的另外一个链


1. ACCEPT target

在本表中接受,不在匹配链中或该表中的其他规则。

但仍然会匹配其他表的规则。


2. DNAT  target

用于转换ip地址。 

DANT target只能用在nat表的PREROUTING和OUTPUT链中,或者是被这两条链调用的链里。

iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10

把发往15.45.23.67 80的tcp包 转成目的地址为 192.168.1.1-192.168.1.10 的一个。 每个流使用相同的地址。


3. DROP target


4. LOG target

--log-level   

--log-prefix

--log-tcp-sequence

--log-tcp-options

--log-ip-options


5. MARK target

--set mark


6. QUEUE target

用于队列的处理


7. REDIRECT target

只能用在nat表的PREROUTING 和 OUTPUT链

-j REDIRECT --to-ports 8080


8. REJECT target

这个和DROP基本一样, 区别在于除了阻塞包之外,还发送错误信息。

-j REJECT --rejetct-with "reason"


9. RETURN target

就像是return 语句, 返回父链。

-j RETURN


10. SNAT target

只能用于nat 表的postrouting链中, 只要符合条件的第一个包被SNAT, 则该会话的其他包也会被SNAT。


11. TOS target

可以用来设置TOS值

-j TOS --set-tos 0x10

将TOS 设置为 0x10.


12. TTL target

ttl只能在mangle表内设置

-j TTL --ttl-set     设置

-j TTL --ttl-dec    减少

-j TTL --ttl-inc     增加


13. ULOG target

用于记录日志,向用户空间发送来保存。 通过netlink socket。

--ulog-nlgroup 2     向2号netlink组发包

--ulog-prefix  prefix     记录的前缀

--ulog-cprange size    向用户空间拷贝包的字节数

--ulog-qthreshold num  收集到num包后,再向用户空间发送记录






原创粉丝点击