策略路由与iptables

在 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


```

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值