mangle表:可以对数据包进行修改,此表中的链与其它表中的关系如下:


wKiom1NnGJWi5vrZAAE_HLDDdWM502.jpg


数据包从网卡接口进来后,最先经过的就是mangle表中的prerouting链。此表中有五条链:

iptables -t mangle -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination       
Chain INPUT (policy ACCEPT)
target     prot opt source               destination       
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination       
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination       
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destinatio


通常不要在此表做过滤。若是在此表中做过滤,也是可以生效的,效率应比别的链快。

比如禁止访问本机的22端口,可以在mangle的input链做规则。


例:禁止访问iptables主机的30001端口

[root@LinuxB ~]# telnet 10.1.1.1 30001

Trying 10.1.1.1...

Connected to 10.1.1.1.

Escape character is '^]'.

现在是可以正常telnet


mangleinput链添加一条禁止访问30001的规则

iptables -t mangle -A INPUT -p tcp --dport30001 -j DROP

[root@fw /]# iptables -t mangle -L -n

Chain PREROUTING (policy ACCEPT)

target    prot opt source              destination        


Chain INPUT (policy ACCEPT)

target    prot opt source              destination        

DROP      tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:30001


Chain FORWARD (policy ACCEPT)

target    prot opt source              destination        


Chain OUTPUT (policy ACCEPT)

target    prot opt source              destination        


Chain POSTROUTING (policy ACCEPT)

target    prot opt source              destination        

应用之后,无法连接此端口,mangle表做规则是生效的。

[root@LinuxB ~]# telnet 10.1.1.1 30001

Trying 10.1.1.1...

telnet: connect to address 10.1.1.1:Connection timed out

[root@LinuxB ~]#




设置TTL:

TTL的初值通常是系统缺省值,是包头中的8位的域。TTL的最初设想是确定一个时间范围,超过此时间就把包丢弃。由于每个路由器都至少要把TTL域减一,TTL通常表示包在被丢弃前最多能经过的路由器个数。当记数到0时,路由器决定丢弃该包,并发送一个ICMP报文给最初的发送者。


win7的TTL值默认是:64 (若想知道系统的默认TTL值是多少,在本机ping一下本机,可以看到TTL=数值 ,这个数据就是此系统的默认ttl)



例: LinuxB - iptables -LinuxA (第一节的环境)正常情况下,LinuxB ping LinuxA,在LinuxA机上抓包,可以看到10.1.1.2来的数据包,里面的ttl = 63。因为经过了iptables这个开了路由功能的主机,所以会把原来值减1(64-1=63)

[root@LinuxA ~]# tcpdump -i eth1 icmp -vv

tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes

11:13:45.125190 IP (tos 0x0, ttl 63, id 0, offset 0, flags [DF], proto ICMP (1), length 84)

   10.1.1.2 > puppet.onepc.com: ICMP echo request, id 13833, seq 1, length 64

11:13:45.125253 IP (tos 0x0, ttl 64, id 63336, offset 0, flags [none], proto ICMP (1), length 84)

   puppet.onepc.com > 10.1.1.2: ICMP echo reply, id 13833, seq 1, length 64

11:13:46.126795 IP (tos 0x0, ttl 63, id 0, offset 0, flags [DF], proto ICMP (1), length 84)

   10.1.1.2 > puppet.onepc.com: ICMP echo request, id 13833, seq 2, length 64

11:13:46.126826 IP (tos 0x0, ttl 64, id 63337, offset 0, flags [none], proto ICMP (1), length 84)

   puppet.onepc.com > 10.1.1.2: ICMP echo reply, id 13833, seq 2, length 64



从LinuxB的ttl值可以看出,LinuxB只经过一个路由器。若是想不让其他人知道我的机器穿过多少个路由,可以在mangle表中设置TTL值。


[root@fw ~]# iptables -j TTL -h

TTL target options

 --ttl-set value               Set TTL to <value 0-255>

 --ttl-dec value               Decrement TTL by <value 1-255>

 --ttl-inc value               Increment TTL by <value 1-255>


简单设置,隐藏iptables减去1的值,保持原来的ttl值,从eth2接口进来的数据包的ttl值加1,离去后会再减去1:

iptables -t mangle -A PREROUTING -i eth2 -j TTL --ttl-inc 1


linuxb再pinglinuxa,在linxa抓包发现,ttl值变成64,达到隐藏网络位置的效果:



11:30:35.269945 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84)

   10.1.1.2 > puppet.onepc.com: ICMP echo request, id 47122, seq 1, length 64

11:30:35.270327 IP (tos 0x0, ttl 64, id 63338, offset 0, flags [none], proto ICMP (1), length 84)

   puppet.onepc.com > 10.1.1.2: ICMP echo reply, id 47122, seq 1, length 64

11:30:36.261973 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84)

   10.1.1.2 > puppet.onepc.com: ICMP echo request, id 47122, seq 2, length 64

11:30:36.262045 IP (tos 0x0, ttl 64, id 63339, offset 0, flags [none], proto ICMP (1), length 84)

   puppet.onepc.com > 10.1.1.2: ICMP echo reply, id 47122, seq 2, length 64




还可以做策略路由等,这些暂时不去学习了。