博客:iptables
iptables中总计含有五条链(chain):
PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING
总计有四个表(table,优先级次序):
raw --> mangle --> nat --> filter
filter:过滤,防火墙;
nat:用于修改报文的源地址或目的地址,以及端口号;
地址转换
地址伪装
mangle:拆解报文并对封装格式进行修改,然后再重新封装报文;
流量控制
数据标签
raw:关闭nat表上启用的连接追踪的机制;
一般情况下,我们默认对filter进行操作,其包含chain有INPUT, FORWARD, OUTPUT
iptables命令:
对于链的操作命令:
***-P:policy,策略,定义指定链的默认策略;一般有两种选择,即:ACCEPT或DROP;
***-N:new chain,新建一条自定义的规则链;只有被内建链上的规则调用才能使自定义规则链上的规则生效;-j chain_name
-X:drop chain,删除被内建链引用次数为0的自定义链;
-F:flush,清除指定链上的所有规则;
-E:重命名被内建链引用次数为0的自定义链;
对于规则的操作命令:
***-A:append,追加,在指定的链的尾部追加一条规则;
***-I [#]:insert,插入,在指定的位置插入一条规则,省略了数字表示将规则插入到 链的第一条;
-D [#]:delete,删除,删除指定的规则
-R:replace,替换,用指定的规则去替换目标链中的原有规则;不能仅修改规则中的某一部分,而是整条规则完全替换;
查看规则的命令:
-L:list,列出指定表指定链上的所有规则;
-n:numeric,将规则中的信息数字化显示,主要指:主机名和端口号;
-v:verbose,显示详细格式的信息,还有-vv,-vvv;
-x:exactly,精确的显示计数器的结果;
--line-numbers:显示规则链中的规则编号;
*******
注意:重启防火墙服务的时候,规则会被清空我们可以使用命令来保存到一个文件中,这样在重启防火墙时,会自动加载文件中保存的规则;
文件的默认路径:/etc/sysconfig/iptables
[root@localhost~]# service iptables save
另一种方法可以把防火墙规则保存到一个指定的文件中,可以自己手动的导入规则,如下:
[root@localhost~]# iptables-save /root/iptables
#将防火墙规则保存到/root/iptables文件中
[root@localhost~]# iptables-resstore < /root/iptables
#将防火墙规则从/root/iptables文件中导入
条件匹配:
[!]-s:匹配源地址
[!]-d:匹配目的地址
[!]-p:{tcp|icmp|udp}:指定协议类型
TCP/UDP
[!] --sport port,port
[!] --dport port,port
指明此次匹配uude源端口或目的端口
icmp:
[!] --icmp-type (8/0)
8: echo-request
0: echo-reply
[!] -i:input interface:指定数据包的进入接口
[!] -o:output interface:指定数据包的外出接口
拓展匹配条件:
显示拓展:
-m state --state
NEW:已经或将启动新的连接
ESTABLISHED:已建立的连接
RELATED:正在启动新连接
INVALID:非法或无法识别的
-m multiport:可以指定15个离散端口
--source-ports:源端口
--destination-ports:目标端口
--ports:指定端口
示例:
~]# iptables -I INPUT -d 172.16.72.1 -s 172.16.0.0/16 -p tcp -m multiport --dports 21,22,23,80 -j ACCEPT
-m iprange
--src-range:源端口范围
--dst-range:目标端口范围
示例:
~]# iptables -I INPUT 4 -m iprange --src-range 172.16.0.1-172.16.72.254 -p tcp -m multiport --dports 21,22,80 -j ACCEPT
-m limit
--limit n/{second/minute/hour}:指定时间内的请求速率"n"为速率,后面为时间分别为:秒、分、时
--limit-burst [n]:在同一时间内允许通过的请求"n"为数字,不指定默认为5
-m string
--string "":过滤指定的字符串
--algo {bm|kmp}:过虑指定的算法
~]# iptables -A OUTPUT -s 172.16.72.1 -d 172.16.0.0/16 -m string --string "admin" --algo kmp -j DROP
-m time
--datestart --datestop:指定起始日期
--timestart --timestop:指定开始和结束时间
--weekdays:周可以指定每周几,周一到周日可以使用"1-7"
--monthdays:月可以指定每个月的哪几天
示例:
~]# iptables -I INPUT -d 172.16.72.1 -p tcp -m multiport --dports 21,23,80 -m time --timestart 09:00:00 --timestop 17:00:00 --weekdays Sat,Sun --kerneltz -j ACCEPT
-m connlimit:
根据每个客户端IP做并发连接数的匹配;
--connlimit-upto n:连接数数量小于等于n,此时规则应设置为允许;
--connlimit-above n:连接数数量大于n,此时规则应设置为拒绝;
示例:
~]# iptables -I INPUT -d 172.16.72.1 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT
在FORWARD链上定义规则,要注意以下几个问题:
1.对于经由FORWARD链的数据,在做访问控制时要注意数据的流向;即,源地址和目的地址,源端口和目的端口;
2.如果可以启用连接追踪机制,建议将双方向的状态为ESTABLISHED数据直接放行;且将此规则放置于链的第一条;
3.必须在链的最后设置默认拒绝所有数据的规则,可以设置默认策略,也可以设置拒绝规则;
DNAT与SNAT:
SNAT:源地址转换,代理内部客户端访问外部网络
目标地址不变,重新改写源地址,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机,目前基本都是解决内网用户用同一个公网IP地址上网的情况
DNAT:目标地址转换,将内部服务器发布至外部网络
和SNAT相反,源地址不变,重新修改目标地址,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机在DNAT的基础上,可以根据请求数据包的端口做PNAT(端口转换,也称为端口映射),可以根据请求数据包不同的端口改写不同的目标地址,从而发送给不同的主机这在用一个公网地址做不同服务时用的比较多,而且相对来说,用NAT的方式可以隐藏后端服务器的真实地址,比较安全
SNAT的数据流向过程:
首先进入PREROUTING,发现不是本网段的地址,而后开始查找路由表(查找路由的过程在PREROUTING和FORWARD之间),于是经过FORWARD链进行转发,在通过POSTROUTING时进行NAT转换。在这个流程中,NAT转换的步骤在POSTROUTING链上实现,之所以不再PREROUTING上做NAT是因为数据包在进来之前,还不知道是本网段地址还是外网地址
DNAT的数据流向过程:
在DNAT中,NAT要在PREROUTING链上做。在数据进入主机后,路由选择过程是在PREROUTING和FORWARD之间的,所以应该先做地址转换之后再进行路由选择,而后经过FORWARD链,最后从POSTROUTING链出去
下篇实现SNAT和DNAT。