iptables 关于转发操作的笔记解释 – 附加实例

/ 0评 / 1

要真正理解使用iptables,必须知道他数据流是怎么流动的.这里借用一张图(建议放大看).

圆形的是RouteBox,涉及系统的路由选择问题,这里暂时不讨论,我们用的是iptables,因此只看绿色框,我们看到数据包经历PRERPOUTING->INPUT->FORWARD->OUTPUT->POSTROUTING几步,其中INPUT/OUTPUT比较简单,很多人都理解了,而Mangle链这里没用上,所以暂时也不讨论,用实践来说.

PREROUTING主要目的是改变到达的目标地址,假设我们服务器公网IP是203.0.113.50,现在从外网有一个访问,指定访问203.0.113.50:80,但是本机其实没有监听80,但是内网机器192.168.1.2是监听80的,有提供服务,要改写他,使得访问203.0.113.50:80实际是访问192.168.1.2:80.

下面这句话理解为,访问203.0.113.50,目标端口80时候,由192.168.1.2:80端口负责,DNAT即改变目的地的意思.

iptables -t nat -A PREROUTING -d 203.0.113.50 -p tcp --dport 80 -j DNAT --to 192.168.1.2:80

这样数据包就走到下一个Route Box,然后由于我们访问的IP地址不是本地IP地址(被我们PREROUTING改写了),所以要走入FORWARD表,FORWARD表默认是ACCEPT的,这样不安全,我们可以允许特定的网络进入FORWARD表,防止有进入到网卡的其他源IP错误进入FORWARD(比如内网有人精心构建问题包).

下面两行意思是,先把默认的FORWARD丢弃,但是如果目的地是192.168.1.0/24内.则可以接受,中间表示已经链接的保持畅通,否则就无法出去了,Linux网络装填有NEW,INVALID和这两个共4种,看名字就知道用途.

iptables -P FORWARD DROP
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT

现在数据包顺利通过FORWARD了,进入到POSTROUTING环节,这里有一个关键的地方,SNAT修改源地址,为什么要修改源地址,如果你以192.168.1.2来访问别人,别人是访问不到的,因为你这个地址不会被公网路由,所以修改修改他.

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 203.0.113.50

这样防火墙转发全过程就走完了,还有一个特殊的要说,MASQUERADE操作,非常常用.

这个操作意思是,选择vmbr0网口(当然也可以不选),默认路由出去,不指定出口IP,这样PPPoE不也很方便了.可以理解成是一种特殊的SNAT.

iptables -t nat -A POSTROUTING -s '192.168.1.0/24' -o vmbr0 -j MASQUERADE

当然还有一种特殊的DNAT,即REDIRECT,不太常用.

iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 80 -j REDIRECT --to-port 80

那么问题来了,如果要阻止小鸡访问25端口的邮件服务怎么办呢?

iptables -I FORWARD -p tcp --dport 25 -j DROP

如果也不允许进入怎么办,需要多一条规则吗,为什么,当然是不用的,那如何封禁单方向呢,添加哪个过滤参数呢?

如果要过滤某个小鸡,只允许他使用某个MAC地址呢,既可以用ebtables(原生就是过滤Link),也可以用iptables(使用插件),下面两句基本是等效的.(处理时机不同)

ebtables -A FORWARD -p IPv4 --ip-src 192.168.1.2 -s 3A:37:D8:75:97:F2 -j ACCEPT
iptables -A FORWARD -s 192.168.1.2 -m mac --mac-source 3A:37:D8:75:97:F2 -j ACCEPT

当然规则还可以反写.

iptables -A FORWARD -s 192.168.1.2 -m mac ! --mac-source 3A:37:D8:75:97:F2 -j DROP

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注