linux_iptables基础以及常见配置
Linux:网络防火墙
netfilter: Frame
iptables: 数据报文过滤,NAT、mangle等规则生成的工具
TCP连接的三次握手:
Client --1--> Server : SYN=1,ACK=0,FIN=0,RST=0; Client 状态:Closed-->SYN_SENT;
Client <--2-- Server : SYN=1.ACK=1,FIN=0,RST=0; Server 状态:Listen-->SYN_RCVD
Client --3--> Server : SYN=0,ACK=1,FIN=0,RST=0; Server 收到Client的ACK之后,两者转换为ESTABLISHED
TCP断开连接
防火墙: 硬件,软件:规则(匹配标准,处理办法)
Framework:
默认规则:
开放:堵
关闭:通
规则:匹配标准
IP: 源IP,目标IP
TCP: 源端口,目标端口
UDP: 源端口,目标端口
ICMP: icmp-type
linux不同内核的不同防火墙以及工具:
Linux 2.0
ipfw/firewall
Linux 2.2
ipchain/firewall
Linux 2.4-2.6
iptables/netfilter
hook function: 钩子函数
prerouting
input
output
forward
postrouting
规则链(CHAIN):
PERROUTING
INPUT
OUTPUT
FORWARD
POSTROUTING
iptables表:
filter(过滤):
INPUT
OUTPUT
FORWARD
NAT(地址转换):
PREDOUTING
OUTPUT
POSTROUTING
mangle(拆开、修改、封装):
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
raw(原始格式):
PREROUTING
OUTPUT
表在规则链上的优先级:
PREROUTING: raw-->mangle-->nat
INPUT : mangle-->filter
FORWARD : mangle-->filter
OUTPUT : raw-->mangle-->nat-->filter
POSTROUTING: mangle-->nat
可以使用自动义链,但只有在被调用时才能发挥作用,而且如果没有自定义链中的任何规则匹配,还应该有返回机制;
用户可以删除自定义的空链
默认链不能被删除
每一条规则都有两个内置的计数器
1、被匹配的报文个数
2、被匹配的报文大小之和
规则:匹配标准, 处理动作
iptables [-t TABLE_NAME] COMMAND CHAIN [num] 匹配标准 -j 处理方法
保存iptables写入的规则
# service iptables save
/etc/sysconfig/iptables
此命令保存的配置文件,在下次启动iptables时会自动读取此配置文件
# iptables-save > /etc/sysconfig/iptables.20160216
此种方式保存的配置文件,在下次启动iptables时需要使用下面的指令加载配置
# iptables-restore < /etc/sysconfig/iptables.20160216
COMMAND:
管理规则:
-A: 在链的尾部添加一条规则
-I CHAIN [num]: 在链中插入一条规则,如果省略 num ,则插入为第一条
-D CHAIN [num]: 删除链中的第num条规则
-R CHAIN [num]: 替换指定的规则:
管理链:
-F [CHAIN]: flush,清空指定链中的规则,如果省略 CHAIN ,则可以实现删除对应表中所有链中的规则
-P CHAIN target: 设定指定链的默认策略
-N CHAIN: 自定义一个新的空链
-X [CHAIN]: 删除一个自定义的空链
-Z [CHAIN [num]]: 将指定链中的规则的计数器置为0
-E old-chain new-chain: 重命名自定义的链
查看:
-L: 显示指定表中的规则
-n: 以数字格式显示主机地址和端口号
-v: 显示链及规则的详细信息
-vv:
-x: 显示计数器的精确值
--line-numbers: 显示链中规则的号码
-j target
动作(target):
ACCEPT :放行
DROP :丢弃
REJECT :拒绝
DNAT :目标地址转换
SNAT :源地址转换
REDIRECT :端口重定向
MASQUERADE :地址伪装
LOG : 日志
MARK : 打标记
匹配标准:
通用匹配
-s,--src : 指定源地址
-d,--dst : 指定目标地址
-p {tcp|udp|icmp} : 指定协议
-i INTERFACE: 指定数据报文流入接口
可用于定义标准的链: PREROUTING,INPUT,FORWARD
-o INTERFACE: 指定数据报文流出接口
可用于定义标准的链: OUTPUT,POSTROUTING,FORWARD
扩展匹配:
隐含扩展: 不要特别指明由哪个模块进行的扩展,因为此时使用 -p {tcp|udp|icmp}
-p tcp
--sport PORT[-PORT]: 源端口
--dport PORT[-PORT]: 目标端口
--tcp-flags mask comp:只检查mask指明的标志位,使用逗号分隔的标志位列表;comp中指明的标志为必须为1
--tcp-flags SYN,FIN,ACK,RST SYN :表示检查四个标志位,其中SYN为1,其他标志位为0,其相当于 --syn
--syn :TCP三次握手的第一个数据报文
允许192.168.21.64/26访问21.117的80端口(http服务)
# iptables -t filter -A INPUT -s 192.168.21.64/26 -d 192.168.21.117 -p tcp --dport 80 -j ACCEPT
# iptables -A OUTPUT -s 192.168.21.117 -d 192.168.21.64/26 -p tcp --sport 80 -j ACCEPT
-p icmp
--icmp-type
0: echo-reply
8: echo-request
允许本机21.117 ping所有主机,但不允许其他主机ping本机
# iptables -A OUTPUT -s 192.168.21.117 -p icmp --icmp-type 8 -j ACCEPT
# iptables -A INPUT -d 192.168.21.117 -p icmp --icmp-type 0 -j ACCEPT
-p udp
--sport PORT[-PORT]: 源端口
--dport PORT[-PORT]: 目标端口
显式扩展: 必须指明由哪个模块进行的扩展,在iptables中使用 -m 选项完成此功能
-m EXTESTION --spe-opt
state: 状态扩展
--state
NEW : 新请求
ESTABLISHED: 已建立的连接
INVALID: 非法连接
RELATED: 相关联的
# iptables -I INPUT -d 192.168.21.117 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
multiport: 离散多端口匹配
--sports,--source-ports PORT[,PORT|PORT:PORT...]
--dports,--destination-ports
--ports
# iptables -I INPUT 2 -d 192.168.21.117 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT
NAT:
DNAT:
-j DNAT
--to-destination IPaddr[:PORT]
# iptables -t nat -A PREROUTING -d 105.236.8.106 -p tcp --dport 80 -j DNAT --to-destination 192.168.17.212
SNAT:源地址转换(POSTROUTING,OUTPUT)
-j SNAT
--to-source IPaddr[-IPaddr[:PORT]] :指定NAT转换的地址
-j MASQUERADE: 例如使用ADSL拨号上网的时候使用,它会自动选择能够上网的地址进行NAT的转换
SNAT简易实验,三台linux虚拟机
虚拟机1:主机名 httpd ip=192.168.21.117 gw=192.168.21.120
虚拟机2:主机名 test_hostonly ip=172.16.10.123 gw=172.16.10.101
虚拟机3: 主机名 lvs1 eth0=192.168.21.120 eth1=172.16.10.101
打开网关主机LVS1的网卡间转发功能
[root@lvs1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@lvs1 ~]# cat /proc/sys/net/ipv4/ip_forward
1
在虚拟主机1上抓包
[root@httpd ~]# tcpdump -i eth0 -nn -X icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
此时在虚拟主机2上ping 虚拟机1
[root@test_hostonly ~]# ping 192.168.21.117
PING 192.168.21.117 (192.168.21.117) 56(84) bytes of data.
64 bytes from 192.168.21.117: icmp_seq=1 ttl=63 time=0.393 ms
查看当前虚拟机1抓取到的icmp包:
13:55:35.411979 IP 172.16.10.123 > 192.168.21.117: ICMP echo request, id 54795, seq 3, length 64
13:55:35.412037 IP 192.168.21.117 > 172.16.10.123: ICMP echo reply, id 54795, seq 3, length 64
此时的ping的源地址是虚拟机2的IP地址
接下来在虚拟机3上添加SNAT的规则
[root@lvs1 ~]# iptables -t nat -A POSTROUTING -s 172.16.10.0/24 -j SNAT --to-source 192.168.21.120
[root@lvs1 ~]# iptables -t nat -L -n
Chain POSTROUTING (policy ACCEPT)
target prot opt source
SNAT all -- 172.16.10.0/24 0.0.0.0/0 to:192.168.21.120
再次在虚拟机2上ping 虚拟机1
[root@test_hostonly ~]# ping 192.168.21.117
PING 192.168.21.117 (192.168.21.117) 56(84) bytes of data.
64 bytes from 192.168.21.117: icmp_seq=1 ttl=63 time=2.19 ms
64 bytes from 192.168.21.117: icmp_seq=2 ttl=63 time=0.375 ms
然后再查看虚拟机1上的抓包情况,这个时候的ping源地址变成了192.168.21.120,和预期结果相同
14:07:17.711563 IP 192.168.21.120 > 192.168.21.117: ICMP echo request, id 12814, seq 1, length 64
14:07:17.711605 IP 192.168.21.117 > 192.168.21.120: ICMP echo reply, id 12814, seq 1, length 64
这样一个简单的SNAT转换配置就完成了
此时想禁止虚拟主机2 ping 虚拟机1,则在虚拟机3 上添加FORWARD规则:
[root@lvs1 ~]# iptables -t filter -A FORWARD -s 172.16.10.0/24 -p icmp -j REJECT
[root@lvs1 ~]# iptables -L -n
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT icmp -- 172.16.10.0/24 0.0.0.0/0 reject-with icmp-port-unreachable