概述
Linux-iptables命令
Linux-SNAT和DNAT
netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。
规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。
当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。
当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。
如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。
语法
代码语言:javascript复制iptables(选项)(参数)
选项
-t<表>:指定要操纵的表; -A:向规则链中添加条目; -D:从规则链中删除条目; -i:向规则链中插入条目; -R:替换规则链中的条目; -L:显示规则链中已有的条目; -F:清除规则链中已有的条目; -Z:清空规则链中的数据包计算器和字节计数器; -N:创建新的用户自定义规则链; -P:定义规则链中的默认目标; -h:显示帮助信息; -p:指定要匹配的数据包协议类型; -s:指定要匹配的数据包源ip地址; -j<目标>:指定要跳转的目标; -i<网络接口>:指定数据包进入本机的网络接口; -o<网络接口>:指定数据包要离开本机所使用的网络接口。
iptables命令选项输入顺序
代码语言:javascript复制iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
四张表
raw:高级功能,如:网址过滤。 mangle:数据包修改(QOS),用于实现服务质量。 nat:地址转换,用于网关路由器。 filter:包过滤,用于防火墙规则。
我们现在用的比较多个功能有3个: 1.filter 定义允许或者不允许的 2.nat 定义地址转换的 3.mangle功能:修改报文原数据
五条链
INPUT链:处理输入数据包。 OUTPUT链:处理输出数据包。 PORWARD链:处理转发数据包。 PREROUTING链:用于目标地址转换(DNAT)。 POSTOUTING链:用于源地址转换(SNAT)。
这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。
- 对于filter来讲一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT
- 对于nat来讲一般也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING
- 而mangle则是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
动作
accept:接收数据包。 DROP:丢弃数据包。 REDIRECT:重定向、映射、透明代理。 与DROP基本一样,区别在于它除了阻塞包之外, 还向发送者返回错误信息。 SNAT:源地址转换,即改变数据包的源地址 DNAT:目标地址转换,即改变数据包的目的地址 MASQUERADE:IP伪装(NAT),用于ADSL。即是常说的NAT技术,MASQUERADE只能用于ADSL等拨号上网的IP伪装,也就是主机的IP是由ISP分配动态的;如果主机的IP地址是静态固定的,就要使用SNAT LOG:日志记录,将符合规则的数据包的相关信息记录在日志中,以便管理员的分析和排错
iptables命令格式
iptables过滤条件
iptables传输数据包的过程
① 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。 ② 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。 ③ 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
实例
清除已有iptables规则
代码语言:javascript复制iptables -F
iptables -X
iptables -Z
开放指定的端口
代码语言:javascript复制iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许本地回环接口(即运行本机访问本机)
代码语言:javascript复制iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已建立的或相关连的通行
代码语言:javascript复制iptables -A OUTPUT -j ACCEPT #允许所有本机向外的访问
代码语言:javascript复制 iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许访问22端口
代码语言:javascript复制 iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许访问80端口
代码语言:javascript复制 iptables -A INPUT -p tcp --dport 21 -j ACCEPT #允许ftp服务的21端口
代码语言:javascript复制 iptables -A INPUT -p tcp --dport 20 -j ACCEPT #允许FTP服务的20端口
代码语言:javascript复制 iptables -A INPUT -j reject #禁止其他未允许的规则访问
代码语言:javascript复制 iptables -A FORWARD -j REJECT #禁止其他未允许的规则访问
屏蔽IP
代码语言:javascript复制iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP #封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 123.45.6.0/24 -j DROP #封IP段即从123.45.6.1到123.45.6.254的命令
项目实操
使用xshell或者secucreCRT等外部访问 10.45.7.198的2121端口,实际是访问容器192.168.123.221的22端口,可简单的理解为从外访问里。
代码语言:javascript复制 iptables -t nat -A PREROUTING -p tcp -d 10.45.7.198 --dport 2121-j DNAT --to-destination 192.168.123.221:22
容器的地址为172.25.243.103, 和 10.45.7.198的地址不通,但是172.25.243.103和10.45.7.197是通的,10.45.7.197和10.45.7.198是通的, 所以如果172.25.243.103想访问10.45.7.198可以加以下规则,可简单的理解为从里面访问外面
代码语言:javascript复制iptables -t nat -A POSTROUTING -s 172.25.243.103 -o eth0 -j SNAT --to 10.45.7.197
删除的话,将A换成D 即可,其余保持不变。
查看已添加的iptables规则
代码语言:javascript复制iptables -L -n -v
这好像查不到我在nat表增加的规则呢…..坑逼
代码语言:javascript复制 iptables -t nat -nL
iptables -L命令还可以查看nat表和mangle表的内容哦
代码语言:javascript复制iptables -L -t nat
cat /proc/net/ip_conntrack | less
iptables -F -t nat (清除NAT表)
iptables --list 查看过滤表 (没查到nat表中的...)
删除已添加的iptables规则
将所有iptables以序号标记显示,执行:
代码语言:javascript复制iptables -L -n --line-numbers
比如要删除INPUT里序号为8的规则,执行:
代码语言:javascript复制iptables -D INPUT 8
查看 nat表的规则
代码语言:javascript复制[root@entel1 ~]# iptables -t nat -L -n --line-numbers
Chain PREROUTING (policy ACCEPT)
num target prot opt source destination
1 DNAT tcp -- 0.0.0.0/0 10.45.7.197 tcp dpt:22013 to:172.25.243.13:22
2 DNAT tcp -- 0.0.0.0/0 10.45.7.197 tcp dpt:22023 to:172.25.243.23:22
3 DNAT tcp -- 0.0.0.0/0 10.45.7.197 tcp dpt:22033 to:172.25.243.33:22
4 DNAT tcp -- 0.0.0.0/0 10.45.7.197 tcp dpt:22043 to:172.25.243.43:22
...........
Chain INPUT (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
num target prot opt source destination
Chain DOCKER (0 references)
num target prot opt source destination
详细介绍请看: http://www.linuxso.com/linuxpeixun/10332.html