1 iptables简介和使用
1.1 iptables简介
iptables命令是Linux上常用的防火墙软件,是netfilter项目的一部分。可以直接配置,也可以通过许多前端和图形界面配置。
1.2 iptables语法
iptables(选项)(参数)
-t<表>:指定要操纵的表;
-A:向规则链中添加条目;
-D:从规则链中删除条目;
-i:向规则链中插入条目;
-R:替换规则链中的条目;
-L:显示规则链中已有的条目;
-F:清楚规则链中已有的条目;
-Z:清空规则链中的数据包计算器和字节计数器;
-N:创建新的用户自定义规则链;
-P:定义规则链中的默认目标;
-h:显示帮助信息;
-p:指定要匹配的数据包协议类型;
-s:指定要匹配的数据包源IP地址;
-j<目标>:指定要跳转的目标;
-i<网络接口>:指定数据包进入本机的网络接口;
-o<网络接口>:指定数据包要离开本机所使用的网络接口
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
iptables表:
- Filter(过滤器):主要和进入Linux的数据包有关,是默认的tables;包过滤,用于防火墙规则
- NAT (地址转换):Network Address Translation的缩写,这个表格主要用来进行数据包的源地址以及目的地址的IP和Port的转换;地址转换,用于网关路由器
- Mangle:数据包修改(QOS),用于实现服务质量。
- raw:高级功能,如:网址过滤。
每个表包含多个规则链名包括:
- INPUT链:处理输入数据包。
- OUTPUT链:处理输出数据包。
- PORWARD链:处理转发数据包。
- PREROUTING链:用于目标地址转换(DNAT)。
- POSTOUTING链:用于源地址转换(SNAT)。
- Filter过滤器的链
- INPUT: 定义规则过滤想要进入Linux主机的数据包;
- OUTPUT:处理Linux主机想要送出去的数据包;
- FORWARD:与当前的Linux主机无关,需要转发到其他计算机的包;
- NAT地址转换的链
- PREROUTING:进行路由判断前要遵循的规则;
- POSTROUTING:进行路由判断后要遵循的规则;
- OUTPUT:过滤发出去的数据包
动作包括:
- ACCEPT:接收数据包。
- DROP:丢弃数据包。
- REDIRECT:重定向、映射、透明代理。
- SNAT:源地址转换。 DNAT:目标地址转换。
- MASQUERADE:IP伪装(NAT),用于ADSL。
- LOG:日志记录。
1.3 常用命令
(1)查看已添加的iptables规则
iptables -L -n -v
或者:
iptables -t nat -L -n
(2)删除已经添加的iptables规则
将所有iptables以序号标记显示,执行:
iptables -L -n --line-numbers
比如要删除INPUT里序号为8的规则,执行:
iptables -D INPUT 8
1.4 补充IP转发
IP地址分为公有ip地址和私有ip地址,Public Address是由INIC(internet network information center)负责的,这些IP地址分配给了注册并向INIC提出申请的组织机构。Private Address属于非注册地址,专门为组织内部使用。Private Address是不可能直接用来跟WAN通信的,要么利用帧来通信(FRE帧中继,HDLC,PPP),要么需要路由的转发(nat)功能把私有地址转换为公有地址才行。
出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功
查是否启动 ip地址转发
cat /proc/sys/net/ipv4/ip_forward
为1则为开启,为0 则为关闭:
sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1
这种设置只是暂时的,它的效果会随着计算机的重启而失效。
通过在/etc/sysctl.conf设置参数:
如果想使IP转发永久生效,就请修改/etc/sysctl.conf ,在这里可以增加一条net.ipv4.ip_forward = 1
2 跨IP转发restful请求
转发服务器的功能如下:
数据包从网卡进入,首先会被PREROUTING这个内置的规则链处理。之后会进行路由判断。如果目的地址是本机,则会走INPUT规则链,然后提交给本机程序处理;如果目的地不是本机地址,且开启了转发功能,则会经过FORWARD规则链,然后准备将数据包发出。本机要发出的数据包和经过FORWARD的数据包,会经过路由判断,然后再经过POSTROUTING规则链,最后从网卡发出。这里的ethX和ethY 可以是同一个网卡。
假设转发服务器的地址192.168.1.20 。目的服务器的地址是 220.181.111.188 。在转发服务器上把8080端口转发到220.181.111.188的80端口。
2.1 打开ipv4时的转发功能/etc/sysctl.conf
(1)这个里面增加以下
net.ipv4.ip_forward = 1
(2)然后使用sysctl -p 的命令将参数生效
sysctl -p /etc/sysctl.conf
(3)然后重新启动网络即可
systemctl restart network
(4)如果只是当前系统生效的话 也可以使用
echo 1 > /proc/sys/net/ipv4/ip_forward
2.2 在PREROUTING上修改目的地址
iptables -t nat -A PREROUTING -p tcp --dport 转发服务器端口 -j DNAT --to-destination 目的地址:目的端口
如:
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 220.181.111.188:80
2.3 在POSTROUTING上修改源地址
iptables -t nat -A POSTROUTING -d 目的地址 -p tcp --dport 目的端口 -j SNAT --to 转发地址
如:
iptables -t nat -A POSTROUTING -d 220.181.111.188 -p tcp --dport 80 -j SNAT --to 192.168.1.20
或者将用伪装的方式
iptables -t nat -A POSTROUTING -d 220.181.111.188 -p tcp --dport 80 -j MASQUERADE
2.4 为了防止在FORWARD上面被丢弃,添加规则允许通过
iptables -I FORWARD -d 目的地址 -p tcp --dport 目的端口 -j ACCEPT
iptables -I FORWARD -s 目的地址 -p tcp --sport 目的端口 -j ACCEPT
如:
iptables -I FORWARD -d 220.181.111.188 -p tcp --dport 80 -j ACCEPT
iptables -I FORWARD -s 220.181.111.188 -p tcp --sport 80 -j ACCEPT
现在就可以在客户端上测试一下访问 192.168.1.20:8080 就会访问到 220.181.111.188:80
参考文献:
【1】用iptables将流量转发到另外一台机器 - 高艳兵 - 博客园
【2】[iptables实现IP地址重定向(转发)] - 简书
【3】https://www.csdn.net/tags/NtjaIgwsOTUwMzAtYmxvZwO0O0OO0O0O.html