在 Linux 系统启动时,内核会为路由策略数据库配置三条缺省的规则:
使用命令:ip rule list
0 匹配任何条件 查询路由表local(ID 255) 路由表local是一个特殊的路由表,包含对于本地和广播地址的高优先级控制路由。rule 0非常特殊,不能被删除或者覆盖。
32766 匹配任何条件 查询路由表main(ID 254), 路由表main(ID 254)是一个通常的表,包含所有的无策略路由。系统管理员可以删除或者使用另外的规则覆盖这条规则。
32767 匹配任何条件 查询路由表default(ID 253) 路由表default(ID 253)是一个空表,它是为一些后续处理保留的。对于前面的缺省策略没有匹配到的数据包,系统使用这个策略进行处理。这个规则也可以删除。
不要混淆路由表和策略:规则指向路由表,多个规则可以引用一个路由表,而且某些路由表可以没有策略指向它。如果系统管理员删除了指向某个路由表的所有规则,这个表就没有用了,但是仍然存在,直到里面的所有路由都被删除,它才会消失。
# iptables
1. iptable的mark功能可以用于标记网络数据包,用于标记数据包。在一些不同的table或者chain之间需要协同处理某一个数据包时尤其有用。
2.NAT
iptables只是[Linux](http://lib.csdn.net/base/linux)防火墙的管理工具而已。真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构。
```
四表五链:
- 5种链说明如下:
PREROUTING链——对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
INPUT链——进来的数据包应用此规则链中的策略
OUTPUT链——外出的数据包应用此规则链中的策略
FORWARD链——转发数据包时应用此规则链中的策略
POSTROUTING链——对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)
### 链和表的关系及顺序
PREROUTING: raw -> mangle -> nat
INPUT: mangle -> filter
FORWARD: mangle -> filter
OUTPUT: raw -> mangle -> nat -> filter
POSTROUTING: mangle -> nat
### 实际使用中是从表作为操作入口;表和链的关系
raw 表:PREROUTING,OUTPUT
mangle表:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat 表:PREROUTING,OUTPUT,POSTROUTING
filter 表:INPUT,FORWARD,OUTPUT
```
iptables 选项:
- -F 删除指定表或链中的所有规则,若没有指定表或者链,则为所有表或者链
- -X 删除链本身,注意,只能删除用户自定义的链(并且该链没有被引用中)
- -P 对给定目标设置链策略(目标动作)。
只有内置链(built-in chains)才有链策略,所有链都能设置策略。
策略对象有以下四种:
- - ACCEPT 接收数据报
- DROP 丢弃数据报
- QUEUE 将数据报提交到用户空间
- RETURN 将数据报原封不动地返回给上层链
如果已经是顶层,则将取采取默认策略(ACCEPT,DROP)
下面介绍iptables mark简单的用法:
- -j MARK //-j代表动作这里代表要执行mark操作
- -m mark //-m代表匹配mark
- –mark xxx/yyy //xxx代表要匹配的mark的值,yyy代表掩码,如果要完全匹配可以省略掉掩码,不过一般不会直接整个匹配,因为可能一个系统中很多模块都需要打mark,所以一般用掩码来取得某几位
```cpp
//打标记
iptables -t mangle -A PREROUTING -j MARK --set-mark 33
//匹配标记
iptables -t nat -A PREROUTING -m mark --mark 33 -j ACCEPT
//or-mark
iptables -t mangle -A PREROUTING -j MARK --or-mark 0x400
//掩码匹配
iptables -t nat -A PREROUTING -m mark --mark 0x400/0x400 -j ACCEPT
1
```
#### CONNMARK target的选项
| 选项 | 功能 |
| ---------------------------- | ---------------------------------------- |
| --set-mark value[/mask] | 给链接跟踪记录打标记。 |
| --save-mark [--mask mask] | 将数据包上的标记值记录到链接跟踪记录上。 |
| --restore-mark [--mask mask] | 重新设置数据包的nfmark值。 |
例子:
```undefined
iptables -t mangle -A QOS_MARK_FORWARD_eth1 -j CONNMARK --restore-mark --nfmask 0xfffff --ctmask 0xfffff
```
```undefined
iptables -t mangle -A QOS_MARK_FORWARD_eth1 -m mark --mark 0x0/0xfffff -j QOS_RULES_FORWARD_eth1
```
```undefined
iptables -t mangle -A QOS_RULES_FORWARD_eth1 -j CONNMARK --save-mark --nfmask 0xfffff --ctmask 0xfffff
```
#### MARK target 的选项
| 选项 | 功能 |
| ---------------- | --------------------------------------- |
| --set-mark value | 设置数据包的nfmark值。 |
| --and-mark value | 数据包的nfmark值和value进行按位与运算。 |
| --or-mark value | 数据包的nfmark值和value进行按或与运算。 |
```css
iptables -t mangle -A POSTROUTING -m iprange --src-range 192.168.0.2-192.168.0.200 -j MARK --or-mark 0x1
```
–or-mark 用于以或的关系设置mark,因为mark可能提前被提前设置过,如之前的mark为0x0100,通过–or-mark设置0x1后mark为0x0101,不会影响之前设置的mark,注意匹配是用掩码按位匹配。
而如果是–set-mark,会清楚之前的mark 0x0100 --set-mark(0x1) = 0x0001
#### MARK match的选项
| 选项 | 功能 |
| ----------------------- | ------------------------------------------------------- |
| [!] --mark value[/mask] | 数据包的nfmark值与value进行匹配,其中mask的值为可选的。 |
```
CONNMARK和MARK的区别:
同样是打标记,但CONNMARK是针对连接的,而MARK是针对单一数据包的
这两种机制一般都要和ip rule中的fwmark联用,实现对满足某一类条件的数据包的策略路由
1.对连接打了标记,只是标记了连接,没有标记连接中的每个数据包。标记单个数据包,也不会对整条连接的标记有影响。二者是相对独立的
2. 路由判定(routing decision)是以单一数据包为单位的。或者说,在netfilter框架之外,并没有连接标记的概念。或者说,ip命令只知道MARK, 而不知道CONNMARK是什么。
3.关键在于:给所有要进行ip rule匹配的单一数据包打上标记。方法一般有二:用MARK直接打,或者用CONNMARK –restore-mark把打在连接上的标记转移到数据包上。
```
```
iptalbes 的多个MARK 模块的区别:
-m mark
-m connmark
-j MARK
-j CONNMARK
-j CONNSECMARK
-j SECMARK
小写的是数据包匹配模块,大写的是数据包修改模块。
带 CONN 的是连接的标记,不带的是标记数据包的。
带 SEC 的是用于处理 IPSEC 数据的,不带的是处理一般数据的。
CONNMARK target options:
--set-xmark value[/ctmask] Zero mask bits and XOR ctmark with value
--save-mark [--ctmask mask] [--nfmask mask]
Copy ctmark to nfmark using masks
--restore-mark [--ctmask mask] [--nfmask mask]
Copy nfmark to ctmark using masks
--set-mark value[/mask] Set conntrack mark value
--save-mark [--mask mask] Save the packet nfmark in the connection
--restore-mark [--mask mask] Restore saved nfmark value
--and-mark value Binary AND the ctmark with bits
--or-mark value Binary OR the ctmark with bits
--xor-mark value Binary XOR the ctmark with bits
在这个模块中..--save-mark,--set-mark,--restore-mark
这些常用的..如何用..有什么区别呢
--set-mark value[/mask] Set conntrack mark value
--save-mark [--mask mask] Save the packet nfmark in the connection
--restore-mark [--mask mask] Restore saved nfmark value
就像描述中说的一样
--set-mark 是直接设置连接中的 mark(注意,不是设置数据包的)
--save-mark 是把数据包中的 mark 设置到连接中
--restore-mark 是把连接中的 mark 设置到数据包中
例子:
iptables -t mangle -A INPUT -m state --state NEW-j MARK --set-mark 1
iptables -t mangle -A INPUT -j CONNMARK --save-mark
iptables -t mangle -A INPUT -j CONNMARK --restore-mark
虽然只匹配了每个连接的第一个包,但通过后面两个操作,使得这个连接的每个包都被设置成了 MARK 1
这个功能在 ipp2p 结合 tc 进行限速时特别有用
http://www.ipp2p.org/docu_en.html#example
在表的开头添加规则 iptables -t table_name -I chain_name -s address/mask -j target
在表的尾部追加一条数据 iptables -f table_name -A chain_name -s address/mask -j target
在指定位置插入规则 iptables -t table_name -I chain place_num -s address/mask -j target
删除规则 iptables -t table_name -D chain_name line_number/rule
规则的修改iptables -t table_name -R INPUT chain_name rule_num rule
* 修改链的默认规则 iptables -t table_name -P chain_name target
默认情况下添加的规则都是临时的,当重启 iptables 或者重启系统时规则将丢失
ubuntu系统保存 iptables iptables-save
centos 系统保存 iptables service iptables save;centos6需要提前安装iptables-services
自定义链 iptables -t table -N customize_chain_name
重新命名自定义链 iptables -E TEXT TEST
在其他链中引用自定义链 iptables -t filter -I INPUT -p tcp --dport 80 -j TEXT
删除自定义链 iptables -t filter -E TEST;前提是没有引用自定义链且自定义链中规则为0
向自定义链中添加规则和默认相同;
参数说明
参数 说明 示例
--flush -F chain 删除某个链或所有链的规则 iptables -F INPUT
--inster -I chain [rulenum] 插入规则(表第一行插入) iptables -t filter -I INPUT -s 192.1.68.12.23 -j DROP
--source -s address[/mask] 指定条件(例中 -s 指定的是源 ip 地址) iptables -t filter -I INPUT -s 192.1.68.12.23 -j DROP
--jump -j target 当-s 条件满足时要做的动作;常用动作如下;
ACCEPT: 允许数据包通过;
DROP:直接丢弃数据包,不给任何回应信息;
REJECT:拒绝数据包通过,需要时会给数据发送端一个相应信息 iptables -t filter -I INPUT -s 192.1.68.12.23 -j DROP
--append -A chain 添加一条规则(在表的尾部) iptables -A INPUT -s 192.1.68.12.23 -j DROP
--delete -D chain rulenum 删除规则 iptables -t filter -D INPUT 3
--flush -F [chain] 删除链中所有规则 iptables -f filter -F INPUT
--replace -R chain rulenum 修改规则 iptables -t filter -R INPUT 1 -j ACCEPT
--policy -P chain target 修改链的默认规则 iptables -t filter -P INPUT DROP
--destination -d address[/mask] 指定目标ip或端口等规则 iptables -t filter -I INPUT -s 10.1.1.1 -d 10.1.2.2 -j ACCEPT
--protocol -p proto 指定协议(示例,拒绝 tcp)默认所有协议均可使用 iptables iptables -t filter -I INPUT -s 10.1.1.1 -d 10.1.1.2 -p tcp -j REJECT
--in-interface -i input name 定制网卡接口 iptables -t filter -I INPUT -i eth2 -p icmp -j DROP
--match -m match 指定模块
--new -N chain 自定义链 iptables -t filter -N TEST
--delete-chain -X chain 删除自定义链,前提没有引用且自定义链中规则为0 iptables -t filter -X TEST
--rename-chain -E old-chain new-chain 修改链名 iptables -t filter -E TEXT TEST
```