iptables随笔
iptables 分为四表五链
四表:
filter表
nat 表
mangle 表
raw 表
五链
INPUT 链
OUTPUT 链
FORWARD 链
PREROUTING(路由前)
POSTROUTING(路由后)
我们最主要使用的就是filter表和nat表
filter表用来过滤流量
NAT主要用来做转发
比如我们要开放一个80端口,这个就用到了filter表
规则定义如下
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
-A 增加一条规则,默认位置为最后
-p 指定协议 这里为tcp
--dport 目的端口 这里为80 由于是外界访问到这台机器,所以对于iptables来说,外界访问的目的端口就是80,反之如果从本机出去,源端口就是80,那就要用--sprot了
-j 执行的动作,这里为放行 ACCEPT
其实我们首先要清除和初始化防火墙
iptables -F
执行后我们可以看到是没有任何规则的
使用iptables -L -n -v --line-numbers 来显示当前规则
还有个参数是-t 指定那个表,如果不写就默认是filter 表
--line-numbers显示规则的的行号,这个下面会用到
这时的防火墙是完全放开的,可以访问这台机器的任何内容,这样是不好的,我们要添加一条默认规则,就是拒绝一切不符合规则的流量
iptables -A INPUT -p tcp -j DROP
注意 执行完上面这条,你就会断开ssh链接,所以在这之前,你要先增加一条规则放行ssh端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
然后我们再执行
iptables -A INPUT -p tcp -j DROP
这样才是妥当的。
由于从本机出去的流量都是安全的也就是OUTPUT链,所以默认我们的OUTPUT链都是默认放行的
现在有2条规则了
我们再增加一条规则
这时候有3条规则了,那么第三条规则会生效吗?
答案是不会,由于规则匹配是从上到下,匹配到第二条后就不会匹配第三条了,所以增加时候要插入到适当的位置
我们先删除第三条规则
iptables -D INPUT 3
再来插入
iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT
我们在第2个位置插入
这次就可以生效了,其余的不匹配的规则统统丢弃,也就是匹配到了第三条规则
如果是以上规则是无法Ping本机和其他机器以及网站的,因为规则默认丢弃一切非匹配规则,所以还需要增加一条本机主动建立的链接和已经建立链接放行的规则
iptables -I INPUT 3 -m state --state RELATED,ESTABLISHED -p tcp -j ACCEPT
如果不增加以上规则,比如ping百度是无法ping通的
来试试NAT的端口 转发
比如我们这台机器的IP是172.17.3.78,我们叫他A机器
我们有台B机器IP是172.17.3.117,我们想通过A机器的端口转发来访问B机器的服务
假如B机器上有个nginx服务,并且开放端口是80,由于种种原因我们不想让外界知道B机器存在,所以我们通过A机器端口转发来访问B机器提供的WEB服务,我们通过A机器的8090端口去访问B机器的WEB服务
我们默认的NAT表所有规则都是空的
我们访问172.17.3.78:8090 这时候是无法访问到B机器的WEB服务的
我们来添加转发规则
iptables -t nat -A PREROUTING -p tcp -d 172.17.3.78 --dport 8090 -j DNAT --to-destination 172.17.3.117:80
-t nat 使用nat表
-A 增加一条规则,使用的表为PREROUTING表,路由前表,-d 目的地址, --dport目的端口, -j DNAT --to-destination 转发的目的地址
解释下我对这条规则理解,对于Iptables来说只要符合目的地址是172.17.3.78并且端口是8090的访问请求就转发到172.17.3.117:80的80端口上
然后还需要增加一条路由后规则
iptables -t nat -A POSTROUTING -p tcp -d 172.17.3.117 --dport 80 -j SNAT --to-source 172.17.3.78
在路由后,对于Iptables来说,源地址变成了A机器本机的IP,目的地址和端口变成了B
我们来看下NAT表的规则
我们来访问下172.17.3.78:8090
访问下172.17.3.117
都没问题,成功实现了端口转发
还有个问题就是filter的FORWARD链默认是全放行的,如果我们为了安全期间默认全给拒绝了呢?
iptables -P FORWARD DROP
执行完以前命令后,FORWARD默认规则就是DROP了,那我们的端口转发还有效吗?
肯定是失效了
因为访问请求过来后需要通过PREROUTING---ROUT--FORWARD----ROUTE---POSTROUTING
FORWARD默认拒绝的话是无法访问到的
如果是这样我们需要增加两条规则
[root@localhost ~]# iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
[root@localhost ~]# iptables -A FORWARD -p tcp --sport 80 -j ACCEPT
增加以上2条规则后就可以了
为什么增加以上2条规则就可以了呢?
我的理解是FORWARD在PREROUTING之后在POSTROUTING之前
在PREROUTING-ROUTE 之后目的端口被转换成了80
在ROUTE-POSTROUTING 之后源端口变成80
所以FORWARD不加这2条规则是无法实现端口转发的
可以参照下以下,是摘抄别人的