iptables 配置详解
Linux下的防火墙概念:
a、一般谈到Linux下的防火墙,我们都会首先想到iptables,其实更确切的叫法应该是Netfilter/iptables,iptables和Netfilter其实是存在差别的。
b、尽管它们经常被用来相互替换使用,Netfilter是用来实现Linux内核中防火墙的Linux内核空间程序代码段,它要么被直接编译进内核,要么被包含在模块中。
c、而iptables是用来管理Netfilter防火墙的用户程序,而我这里提到的iptables是包含Netfiler和iptables。
d、Netfilter/iptables是基于包过滤的防火墙,主要是针对2-4层,另外,iptables也支持7层控制。
iptables的组成部分:
iptables有四个表和五个链以及一些规则组成:
四个表:filter、nat、mangle、raw
filter表(过滤规则表),nat表(地址转换规则表),mangle(修改数据标记位规则表),raw(跟踪数据表规则表)
其中最常用的是filter表以及nat表
五个链:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING
iptables的命令语法:
iptables [-t 表名] <-A|-I|-D|-R>链名[规则编号] [-i|-o 网卡名称] [-p 协议类型] [-s 源IP地址|源子网] [–sport 源端口号]
[-d 目标IP地址|目标子网] [–dport 目标端口号] <-j 动作>
参数及动作信息
-A 追加防火墙规则 -D 删除防火墙规则 -I 插入防火墙规则 -F 清空防火墙规则 -L 列出防火墙规则 -R 替换防火墙规则 -Z 清空防火墙数据表统计信息 -P 设置链默认规则
匹配参数:
-p 匹配协议 -s 匹配源地址 -d 匹配目标地址 -i 匹配入站网卡接口 -o 匹配出站网卡接口 –sport 匹配源端口 –dport 匹配目标端口 –src-range 匹配源地址范围 –dst-range 匹配目标地址范围 –limit 匹配数据表速率 –mac-source 匹配源MAC地址 –state 匹配状态(INVALID、ESTABLISHED、NEW、RELATED) –string 匹配应用层字串
触发动作:
ACCEPT 允许数据包通过
DROP 丢弃数据包
REJECT 拒绝数据包通过,并发回封包通知对方
LOG 将数据包信息记录syslog日志
DNAT 目标地址转换
SNAT 源地址转换(适用于静态IP)
MASQUERADE 地址欺骗(只能用于ADSL拨号上网的IP伪装,也就是主机的IP是由ISP分配动态的)
REDIRECT 重定向,将数据包重定向到本机或另外主机的某一个端口,通常能实现透明代理或者对外开放内网的某些服务
常用的命令
a、查看filter表的所有规则:
[root@localhost python]# iptables -n -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
b、清空filter表的所有规则:
[root@localhost ~]# iptables -F
c、查看nat表的所有规则:
[root@localhost python]# iptables -t nat -n -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
# 记录192,.168.10.116访问主机80端口的日志信息(/var/log/messages)
iptables -I INPUT -s 192.168.10.116 -p tcp --dport 80 -j LOG
[root@localhost python]# tail -10 /var/log/messages Mar 25 19:29:25 localhost kernel: IN=eth0 OUT= MAC=00:0c:29:d0:4d:a8:00:e0:4c:68:00:a5:08:00 SRC=192.168.10.100 DST=192.168.10.115 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=30507 DF PROTO=TCP SPT=50870 DPT=80 WINDOW=16425 RES=0x00 ACK URGP=0 Mar 25 19:29:25 localhost kernel: IN=eth0 OUT= MAC=00:0c:29:d0:4d:a8:00:e0:4c:68:00:a5:08:00 SRC=192.168.10.100 DST=192.168.10.115 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=30508 DF PROTO=TCP SPT=50870 DPT=80 WINDOW=16425 RES=0x00 ACK URGP=0 Mar 25 19:29:25 localhost kernel: IN=eth0 OUT= MAC=00:0c:29:d0:4d:a8:00:e0:4c:68:00:a5:08:00 SRC=192.168.10.100 DST=192.168.10.115 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=30509 DF PROTO=TCP SPT=50870 DPT=80 WINDOW=16425 RES=0x00 ACK FIN URGP=0 Mar 25 19:29:25 localhost kernel: IN=eth0 OUT= MAC=00:0c:29:d0:4d:a8:00:e0:4c:68:00:a5:08:00 SRC=192.168.10.100 DST=192.168.10.115 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=30510 DF PROTO=TCP SPT=50871 DPT=80 WINDOW=8192 RES=0x00 SYN URGP=0 Mar 25 19:29:25 localhost kernel: IN=eth0 OUT= MAC=00:0c:29:d0:4d:a8:00:e0:4c:68:00:a5:08:00 SRC=192.168.10.100 DST=192.168.10.115 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=30511 DF PROTO=TCP SPT=50871 DPT=80 WINDOW=16425 RES=0x00 ACK URGP=0 Mar 25 19:29:25 localhost kernel: IN=eth0 OUT= MAC=00:0c:29:d0:4d:a8:00:e0:4c:68:00:a5:08:00 SRC=192.168.10.100 DST=192.168.10.115 LEN=442 TOS=0x00 PREC=0x00 TTL=64 ID=30512 DF PROTO=TCP SPT=50871 DPT=80 WINDOW=16425 RES=0x00 ACK PSH URGP=0 Mar 25 19:29:25 localhost kernel: IN=eth0 OUT= MAC=00:0c:29:d0:4d:a8:00:e0:4c:68:00:a5:08:00 SRC=192.168.10.100 DST=192.168.10.115 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=30513 DF PROTO=TCP SPT=50871 DPT=80 WINDOW=16425 RES=0x00 ACK URGP=0 Mar 25 19:29:25 localhost kernel: IN=eth0 OUT= MAC=00:0c:29:d0:4d:a8:00:e0:4c:68:00:a5:08:00 SRC=192.168.10.100 DST=192.168.10.115 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=30514 DF PROTO=TCP SPT=50871 DPT=80 WINDOW=16425 RES=0x00 ACK URGP=0
# 将来自192.168.10.0/24网段的主机并访问80端口的请求给予拒绝
iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 80 -j DROP
[root@localhost ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- 192.168.10.0/24 0.0.0.0/0 tcp dpt:80 这个就是新添加的防火墙规则 LOG tcp -- 192.168.10.100 0.0.0.0/0 tcp dpt:80 LOG flags 0 level 4 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
# 禁止10.10.10.0/24网段内的主机ping。ICMP类型为8
说明:禁止10.10.10.0/24网段内的主机ping
iptables -A INPUT -s 10.10.10.0/24 -p icmp --icmp-type 8 -j DROP
# -D参数,删除INPUT链的第三条规则:
[root@localhost ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- 192.168.10.0/24 0.0.0.0/0 tcp dpt:80 LOG tcp -- 192.168.10.100 0.0.0.0/0 tcp dpt:80 LOG flags 0 level 4 DROP icmp -- 10.10.10.0/24 0.0.0.0/0 icmp type 8 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@localhost ~]# iptables -D INPUT 3 删除INPUT链的第三条规则 [root@localhost ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- 192.168.10.0/24 0.0.0.0/0 tcp dpt:80 LOG tcp -- 192.168.10.100 0.0.0.0/0 tcp dpt:80 LOG flags 0 level 4 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
# -R参数,替换第二条规则
[root@localhost ~]# iptables -R INPUT 2 ! -s 10.10.10.1 -p tcp --dport 80 -j ACCEPT [root@localhost ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- 192.168.10.0/24 0.0.0.0/0 tcp dpt:80 ACCEPT tcp -- !10.10.10.1 0.0.0.0/0 tcp dpt:80 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
# 定义iptables默认策略
默认策略的定义格式为:
iptables [-t 表名] <-P> <链名> <动作>