系统环境 RHEL 7
systemctl stop firewalld # 关闭防火墙
systemctl start iptables.service # 打开iptables
systemctl enable iptables.service # 开机自启iptables
1.四表五链
四表
- filter:过滤,防火墙,访问本机数据
- nat :network address translation 网络地址转换,从本机经过的数据
- mangle:拆解报文,作出修改,封装报文
- raw: 关闭nat表上启用的链接追踪机制
五链
- PREROUTING 数据包进入路由之前
- INPUT 目的地址为本机
- FORWARD 实现转发
- OUTPUT 原地址为本机,向外发送,不经过网卡
- POSTROUTING 发送到网卡之前,源地址转换,在路由之后
2.iptables的使用详解
- 链管理:
-F : 清空规则链
-N : 创建新的自定义规则链
-X : drop 删除用户自定义的规则链
-P : Policy 为指定链设置默认策略;
-E : 重命令自定义链
- 规则管理:
-A:将新规则添加到指定的链上
-I:将新规则插入到指定的位置
-D:删除链上的指定规则
-R:替代指定链上的规则
- 基本匹配
-s 源地址IP
-d 目的地址IP
-p 协议{tcp|udp|icmp}
-i 数据报文的流入接口
-o 数据报文的流出接口
-j 目标动作或跳转
- 目标:
TARGET:jump至指定的TARGET
ACCEPT:接受
DROP :丢弃
REJECT:拒绝访问
RETURN:返回调用链
- 具体实现
iptables -A INPUT -s 192.168.0.4 -p tcp --dport 23 -j REJECT # 访问拒绝,有提示
iptables -A INPUT -s 192.168.0.4 -p tcp --dport 23 -j DROP # 访问拒绝,无任何提示,直接被丢弃
iptables -F # 刷新策略
iptables -t nat -F PREROUTING
iptables -I INPUT 2 -p tcp --dport 23 -j DROP # 插入到第二条策略
iptables -E allowed disallowed # 修改规则链名称
iptables -D INPUT 3 # 删除filter表中的第三条规则
iptables -D INPUT -s 192.168.0.1 -j DROP # 按内容删除
iptables -R INPUT 3 -j ACCEPT # 将原来编号为3的规则内容替换为ACCEPT
iptables -P INPUT DROP # 设置filter表INPUT链的默认规则 ,当数据包没
有被规则列表里的任何规则匹配到时,按此默认
规则处理
iptables -t nat -F # 清空nat策略, -F 仅仅是清空链中规则,并不影响 -P 设置的默认规则
iptables -t nat -nL # 查看nat策略
iptables -t nat -L PREROUTING # 查看nat表PREROUTING链的规则
iptables -N redhat # 添加自定义链名
iptables -X redhat # 删除自定义链
iptables -A INPUT -s !192.168.0.4 -p tcp --dport 23 -j REJECT # 只有192.168.0.4不可以连接
-D redhat 1 # 删除自定义链下的策略
-i eth0 # 匹配从网络接口 eth0 进来
-o eth0 # 匹配从网络接口 eth0 出去
-s 192.168.0.1 # 匹配来自 192.168.0.1 的数据包
-s 192.168.1.0/24 # 匹配来自 192.168.1.0/24 网络的数据包
-d 202.106.0.20 # 匹配去往 202.106.0.20 的数据包
-d 202.106.0.0/16 # 匹配去往 202.106.0.0/16 网络的数据包
-d www.abc.com # 匹配去往域名 www.abc.com
-
iptables -t filter -nL # 查看filter表,与iptables -nL看到的效果相同
-
iptables -t nat -nL # 查看nat表
-
iptables -t mangle -nL # 查看mangle表,五条链的信息都可以看到
-
iptables -F # 刷新,清掉策略
-
service iptables save # 保存更改到/etc/sysconfig/iptables
-
iptables -A INPUT -s 172.25.254.78 -p tcp --dport 80 -j ACCEPT # 设置只允许172.25.254.78这台主机连接,但是还是不能访问,因为默认只读第一条正确的策略,以提高读取速度;
其余的策略根本就不会读,所以还不能访问
-
iptables -D INPUT 2 # 删除第二条策略
-
iptables -R INPUT 1 -s 172.25.254.78 -p tcp --dport 80 -j ACCEPT #修改第一条策略使得172.25.254.78这台主机可以访问
-
iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT # 指定在INPUT的第二行添加策略,使得所有主机都可连接此服务端
-
iptables -N westos #添加westos
-
iptables -E westos WESTOS # 重命名
-
iptables -X WESTOS # 删除
-
iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT # -m state表示数据包的连接状态,NEW表示与任何连接无关
-
iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT
-
iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
-
iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT
-
iptables -A INPUT -m state --state NEW -p tcp --dport 3260 -j ACCEPT
-
iptables -A INPUT -m state --state NEW -p -i lo -j ACCEPT
-
iptables -nL
-
service iptables save
-
cat /etc/sysconfig/iptales
3.应用iptables控制服务
- systemctl start httpd
- iptables -P INPUT DROP # 设置为丢弃状态,默认为接受,可以进行访问
测试:
- 修改之前:
- 修改之后:
注: iptables -P #其后只能加ACCEPT或DROP,P表示规则,p表示协议
iptables -A INPUT -p tcp --dport 80 -j REJECT #将80端口设置为拒绝状态
如果有多条策略,但只读第一条正确的,其余的就不会读,以下操作解决这个问题
iptables -D INPUT 1 # 删除原来所有的策略,有几行就依次删除
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 依次添加策略
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 3260 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT # 允许回环接口
iptables -nL # 查看策略
iptables -F # 刷新策略
ipables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 设置使连接过的和正在使用的不读取,那么在后边新写入的策略就会被读取,以此类推,新写入的策略总能被读取到
4.iptable命令实现端口伪装,在nat表中实现
在服务端(双网卡)
- iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 172.25.254.238 #所有从eth1出去的数据包地址都伪装成172.25.0.238输出,SNAT就是改变转发数据包的源地址
- iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 22 -j DNAT --to-dest 172.25.254.238 #22端口是以172.25.254.238输入,DNAT就是改变转发数据包的目的地址
- iptables -t nat -nL
在客户端测试:
-
ping 172.25.0.238 #可以ping通,就代表成功(内网访问外网)
-
连接服务端,连接成功查看eth0,看到172.25.254.238,就代表成功(外网访问内网)