iptables:
防火墙分为网络层防火墙和应用层防火墙,网络层防火墙主要针对源地址和目标地址来进行检查。应用层防火墙几乎可以实现所有的检测。七层防火墙虽然更加安全,但是却带来了效率的降低。所以,在不同的场合选择不同的防火墙。
iptables 是与最新的 3.5 版本 Linux 内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。
五链:
PREROUTING--路由前
INPUT--数据包流入
FORWARD--转发
OUTPUT--数据包流出
POSTROUTING--路由后
四表:
filter表:一般只能做在3个链上:INPUT,FORWARD,OUTPUT
nat表:一般只能做在3个链上:PREROUTING,OUTPUT,POSTROUTING
mangel表(修改报文):5个都可以做
raw表(恢复报文):5个都可以做
iptables由四表五链组成
每个规则都有两个内置的计数器,记录了被匹配的报文个数和被匹配的报文大小之和。
通用匹配:
-s源地址
-d目的地址
-p协议
-i数据报流入接口
-o数据报流出接口
查看:
iptables -L -n 数字显示端口地址|-v显示链和规则详细信息|-x显示计数器精确值|--line-numbers显示规则号码
[root@slave-01 ~]# iptables -l
iptables v1.4.7: option `-l' requires anargument
Try `iptables -h' or 'iptables --help' formore information.
[root@slave-01 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
这是iptables默认制定的规则。而且显示了三个链,input forward和outp。
管理规则:
-A---add追加
-I----insert插入
-D---drop删除
-R---replace替换
管理链:
-F---清空规则链
-P---默认策略
-N---新建
-X---删除
-Z---清空链和链中默认规则的计数器
-E---重命名
动作:
放行,丢弃drop,拒绝reject,目标源地址转换
扩展匹配:
隐含扩展
-picmp --icmp-type 0|8
-ptcp --dport --sport
-pudp --dport --sport
显示扩展
-mmultiport --destination-ports 21,22,80 可以实现多端口
-miprange ! --src-range 172.16.100.3-172.16.100.100
-mconnlimit !--connlimit-above n -j ACCEPT 注意“!”,这里限定同一个ip的同时 多少个请求
-mlimit --limit rate访问速率 3/minutes --limit-burst top一次性访问上限
限制请求文件的名的匹配过滤,字符串匹配。
限制请求文件的内容的匹配过滤,
-mstring --algo{bm|kmp} --string "STRING"这里的需要注意的是限制文件内容的匹配 的的时候,需要再output加上限定。
-jACCEPT REJECT LOG
完整的命令的例子:
iptables -t (table表名默认为filter表3) filter -I(管理规则 -A -I-D -R)INPUT(chain插入链5) -d 192.168.174.155 -p tcp (这里的小写字母为通用匹配,源,目的,协议)--dport 22 -j(目标动作是) REJECT
[root@slave-01~]# iptables -t filter -I INPUT -d 192.168.174.155 -p tcp --dport 22 -j REJECT
[root@slave-01 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
REJECT tcp -- anywhere slave-01 tcp dpt:ssh reject-withicmp-port-unreachable
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
可以看到在iptables的INPUT链的第一行插入了一条规则,插入的规则是排在前面,因为iptables的规则就是优先匹配第一条规则,越往前的规则具有的效力就越大。再用xshell链接linux就无法连上了。
再试一个,使得icmp报文的ping命令失效。
iptables -I INPUT -p icmp --icmp-type 8 -jREJECT
使用ping命令,则提示无法连接到端口。
nat转换
-jSNAT
--to-source
-jMASQUERADE
-jDNAT
命令:iptables -t nat -A PREROUTING -d ip -p tcp --dport 80 -j DNAT--to-detination ip
1.SNAT基于原地址的转换
基于原地址的转换一般用在我们的许多内网用户通过一个外网的口上网的时候,这时我们将我们内网的地址转换为一个外网的IP,我们就可以实现连接其他外网IP的功能。
所以我们在iptables中就要定义到底如何转换:
定义的样式:
比如我们现在要将所有192.168.10.0网段的IP在经过的时候全都转换成172.16.100.1这个假设出来的外网地址:
iptables -t nat -A POSTROUTING -s192.168.10.0/24 -j SNAT --to-source 172.16.100.1
这样,只要是来自本地网络的试图通过网卡访问网络的,都会被统统转换成172.16.100.1这个IP.
那么,如果172.16.100.1不是固定的怎么办?
我们都知道当我们使用联通或者电信上网的时候,一般它都会在每次你开机的时候随机生成一个外网的IP,意思就是外网地址是动态变换的。这时我们就要将外网地址换成 MASQUERADE(动态伪装):它可以实现自动寻找到外网地址,而自动将其改为正确的外网地址。所以,我们就需要这样设置:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -jMASQUERADE
2.DNAT目标地址转换
对于目标地址转换,数据流向是从外向内的,外面的是客户端,里面的是服务器端通过目标地址转换,我们可以让外面的ip通过我们对外的外网ip来访问我们服务器不同的服务器,而我们的服务却放在内网服务器的不同的服务器上。
如何做目标地址转换呢?:
iptables -t nat -A PREROUTING-d 192.168.10.18 -p tcp --dport 80 -j DNAT --todestination 172.16.100.2
目标地址转换要做在到达网卡之前进行转换,所以要做在PREROUTING这个位置上
控制规则的存放以及开启
注意:你所定义的所有内容,当你重启的时候都会失效,要想我们能够生效,需要使用一个命令将它保存起来
1.service iptables save 命令
它会保存在/etc/sysconfig/iptables这个文件中
2.iptables-save 命令
iptables-save >/etc/sysconfig/iptables