一、概念理解
iptables是如何对包进行控制的:
对包的控制是我们在不同的链(chain)上添加不同的规则来实现的,而链,则是由一条或者多条规则组成的,可是如果有多条规则同时对一个包进行了定义,会发生什么呢?在chain中,所有的规则都是按从上而下的顺序来执行的(即,如果匹配第一行,就按照第一行的规则来执行,一行一行 的往下找,直到找到符合这个包的规则为止),但是如果没有找到符合规则的包,那就按照Policy来处理。iptables使用 -P 来设置Chain的策略。
二、链操作
对链的操作有以下几种:
-I(插入)
-A(追加)
-R(替换)
-D(删除)
-L (列表显示)
注意:这里的-I与-A选项功能差不多,但是-I将规则放在第一行,-A放在最后一行。
例:添加一个规则至filter表中的FORWARD链
iptables -t filter -A FORWARD -s 10.1.1.11 -d 202.1.1.1 -j ACCEPT
该命令意思为:追加一个规则至filter表中的FORWARD链尾,允许源地址为10.1.1.11,目标地址为202.1.1.1的数据包通过。其中 -t 后面跟的是表名,-A 后面跟的是链名,-s 表示源地址,-d 表示目标地址,-j 表示处理方向。(在iptables中,默认的表名是filter,所以此处可以省略 -t filter)
三、匹配参数
-s:匹配源地址
-d:匹配目标地址
-p:协议匹配
-i:入接口匹配
-o:出接口匹配
--sport,--dport:源端口与目的端口的匹配
-j:包的处理方向(如 -j ACCEPT)
!:取反
-s 这个参数呢就是指定源地址的,如果使用这个参数也就是告诉netfilter,对于符合这样一个源地址
的包怎么去处理,可以指定某一个单播ip地址,也可以指定一个网络,如果单个的ip地址其实隐含了一个
32位的子网掩码,比如-s 10.1.1.11 其实就是-s 10.1.1.11/32,同样我们可以指定不同的掩码用以实现
源网络地址的规则,比如一个C类地址我们可以用-s 10.1.1.0/24来指定。
-d参数与-s格式一样。
-i参数是指定入接口的网络接口,比如我仅仅允许从eth3接口过来的包通过FORWARD链,就可以这样指定iptables -A FORWARD -i eth3 -j ACCEPT
-o是出接口,与上同。
实例:简单的nat路由器
环境介绍
linux 2.4 +
2个网络接口
Lan口:10.1.1.254/24 eth0
Wan口:60.1.1.1/24 eth1
目的:实现内网中的节点(10.1.1.0/24)可控的访问internet。
首先将Lan的节点pc的网关指向10.1.1.254。
确定你的linux的ip配置无误,可以正确的ping通内外的地址。同时用route命令查看linux的本地路由表,确认指定了可用的ISP提供的默认网关。
打开linux的转发功能:sysctl net.ipv4.ip_forward=1
将FORWARD链的策略设置为DROP,这样做的目的是做到对内网ip的控制,你允许哪一个访问internet就可以增加一个规则,不在规则中的ip将无法访问internet.
iptables -P FORWARD DROP
这条规则规定允许任何地址到任何地址的确认包和关联包通过。一定要加这一条,否则你只允许lan IP访问没有用,至于为什么,下面我们再详细说。
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
这条规则做了一个SNAT,也就是源地址转换,将来自10.1.1.0/24的地址转换为60.1.1.1
(Deven:因为是让内网上网,因此对于代理服务器而言POSTROUTING(经过路由之后的包应该要把源地址改变为60.1.1.1,否则包无法返回))
iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -j SNAT --to 60.1.1.1
有这几条规则,一个简单的nat路由器就实现了。这时你可以将允许访问的ip添加至FORWARD链,他们就能访问internet了。
比如我想让10.1.1.9这个地址访问internet,那么你就加如下的命令就可以了。
iptables -A FORWARD -s 10.1.1.9 -j ACCEPT
也可以精确控制他的访问地址,比如我就允许10.1.1.99访问3.3.3.3这个ip
iptables -A FORWARD -s 10.1.1.99 -d 3.3.3.3 -j ACCEPT
或者只允许他们访问80端口。
iptables -A FORWARD -s 10.1.1.0/24 -p tcp --dport http -j ACCEPT