本文转载自leekwen《Iptables之FORWARD转发链》

iptables有5个链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING,4个表:filter,nat,mangle,raw.
4个表的优先级由高到低的顺序为:raw-->mangle-->nat-->filter

wKiom1m6eDSBwZ1oAAE0Vi8OqEs236.jpg-wh_50

filter:一般的过滤功能

nat:用于nat功能(端口映射,地址映射等)

mangle:用于对特定数据包的修改

raw:有限级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能

表和链的关系如下:

 filter

 FORWARD、INPUT、 OUTPUT

 nat

 PREROUTING、POSTROUTING、OUTPUT

 mangle

 PREROUTING、POSTROUTING、OUTPUT、INPUT、FORWARD

 raw

 PREROUTING、OUTPUT

1.prerouting:进入netfilter后的数据包在进入路由判断前执行的规则。改变包。

2.Input:当经过路由判断后,要进入本机的数据包执行的规则。

3.output:由本机产生,需向外发的数据包执行的规则。

4.forward:经过路由判断后,目的地不是本机的数据包执行的规则。与nat 和 mangle表相关联很高,与本机没有关联。

5.postrouting:经过路由判断后,发送到网卡接口前。即数据包准备离开netfilter时执行的规则。

本机路由转发的时候,才配置FORWARD转发链

# iptables –A FORWARD –s 192.168.0.0/24 –j ACCEPT

# iptables –A FORWARD –d 192.168.0.0/24 –j ACCEPT

禁止转发源IP地址为192.168.1.20-192.168.1.99的TCP数据包

# iptables -A FORWARD -p tcp -m iprange --src-range 192.168.0.20-192.168.0.99 -j DROP

不允许本企业内部的主机访问企业以外的网站,也可以这样eth0(连接因特网),(eth1 企业内网)

# iptables -A FORWARD -i eht1 -o eth0 -p tcp --dport 80 -j DROP

上面只是打通了局域网通过此机的Forward的通道,也就是打通了局域网与外网的链路,实际上并起不到任何的作用,因为在内核里面的转发文件并没有打开;echo 1 > /proc/sys/net/ipv4/ip_forward 的值,将默认的0改为1(1为打开,0为关闭)

例:# 10.0.0.241 -----< 202.96.209.5

内网在访问外网的时候,包在到达外网后,外网不知道也没有办法回应此包给内网的主机,从而使得内外网无法实现通信;所以在网关上要在一个地址转换(NAT)将局域网地址翻译成互联网地址,它是通过NAT表(Network Address Trastation)来实现的。

MAC和地址绑定

#iptables –P FORWARD DROP

#iptables –A FORWARD -s 192.168.30.20 –m mac --mac-source 00:11:5B:EF:7A:D8 -j  ACCEPT

mac地址为00:11:5B:EF:7A:D8的就可以上网了

例:

#iptables –P FORWARD ACCEPT

#iptables –A FORWARD -s 192.168.30.20 –m mac --mac-source 00:11:5B:EF:7A:D8 -j  DROP

mac地址为00:11:5B:EF:7A:D8的就上不了网了


wKioL1m6eC_wpyEfAABKCg4ARaM438.jpg-wh_50

在端口映射环境下如何放行web服务:

在做地址转发的时候必须以转换之后的端口和地址为目标端口和目标ip地址,外部端口是80,内部端口是8080

[root@test3~]# iptables -P FORWARD DROP

[root@test3~]# iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT

[root@test3~]# iptables -A FORWARD -d 192.168.0.110 -p tcp --dport 8080 -mstate --state NEW -j ACCEPT

[root@test3~]# iptables -t nat -A PREROUTING -d 10.0.10.62 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.110:8080

假设在此服务器上还有mysql服务,假设mysql在内网工作在正常服务端口,但告知外面工作在6789端口上,那么

在iptables服务器上添加规则如下

[root@test3~]# iptables -P FORWARD DROP

[root@test3~]# iptables -A FORWARD -d 192.168.0.110 -p tcp --dport 3306 -m state --state NEW -j ACCEPT

[root@test3~]# iptables -t nat -A PREROUTING -d 10.0.10.62 -p tcp --dport 6789 -j DNAT --to-destination 192.168.0.110:3306

SNAT应用

#iptables –t nat –A POSTROUTING–s 10.0.0.0/24 –j SNAT --to-source 192.168.0.254

#iptables –t nat –A POSTROUTING –s 10.0.0.0/24 –j MASQUERADE (伪装)