准备三台机器:
A:10.35.78.64
iptables:10.35.78.69,172.18.101.111
B:172.18.101.222

iptables的黑白名单策略的区别:
黑名单:
[root@iptables ~]# iptables -I INPUT -s 10.35.78.64 -j REJECT
[root@iptables ~]# iptables -nvL
Chain INPUT (policy ACCEPT 37 packets, 3497 bytes)
pkts bytes target prot opt in out source destination
13 780 REJECT all -- * * 10.35.78.64 0.0.0.0/0 reject-with icmp-port-unreachable
只要是数据包的源ip地址是10.35.78.64,不管什么协议(prot all),全部拒绝,这其实就是把该台主机拉黑了
白名单添加方式1:
[root@iptables ~]# iptables -I INPUT -s 10.33.38.94 -j ACCEPT
[root@iptables ~]# iptables -A INPUT -j REJECT
[root@iptables ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
121 10140 ACCEPT all -- * * 10.33.38.94 0.0.0.0/0
210 21155 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
iptables -A INPUT -j REJECT拒绝所有来源的数据包,但是接受10.33.38.94的数据包
白名单添加方式2:
[root@iptables ~]# iptables -F
[root@iptables ~]# iptables -I INPUT -s 10.33.38.94 -j ACCEPT
[root@iptables ~]# iptables -P INPUT DROP
(-P改变默认策略,因此当清空策略时,主机就连接不上了,不建议加,还是使用上述白名单的添加方式1 )
Chain INPUT (policy DROP 0 packets, 0 bytes)
iptables主机防火墙:策略应当设置在FORWARD上
因为数据报文一定会通过linux的数据包转发功能,设置在INPUT可能把给发送给防火墙主机的报文误杀,设置在output上可能把防火墙主机上的请求报文误杀
[root@iptables ~]# iptables -A FORWARD -j REJECT
[root@iptables ~]# iptables -I FORWARD -d 10.35.78.64 -j ACCEPT
[root@iptables ~]# iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
39 3347 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
153 12828 ACCEPT all -- * * 10.35.78.64 0.0.0.0/0
3294 200K REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
[root@A ~]# curl 172.18.101.222:80
HELLO,SERVER 172.18.101.222
ip的全局性验证:
[root@iptables ~]# iptables -F
[root@iptables ~]# iptables -I FORWARD -j REJECT
用A去ping10.35.78.111可以ping通,但是无法ping通10.35.78.222,因为做路由决策的时候该防火墙主机有3个ip,3
个ip都有全局性,检测到172.18.101.111是防火墙主机的本机ip,就不走FORWARD了
iptables 实现DNAT(端口映射,反向代理)
[root@iptables ~]# iptables -t nat -A PREROUTING -d 10.35.78.69 -p tcp --dport 80 -j DNAT --to-destination 172.18.101.222:80
[root@iptables ~]# iptables -nvL -t nat
Chain PREROUTING (policy ACCEPT 1051 packets, 85801 bytes)
pkts bytes target prot opt in out source destination
2 120 DNAT tcp -- * * 0.0.0.0/0 10.35.78.69 tcp dpt:80 to:172.18.101.222:80
- web服务器不会直接使用公网地址,一般web服务器都用私有网络地址,前面架设调度器,使用dnat做反向代理。
- dnat一定配置在PREROUTING上,在路由前就要把目标ip修改掉,修改完ip之后进行路由决策,来决定这个包是走本机(INPUT),还是走转发(FORWARD)。
- 使用场景:外部网络想要访问内网的某个服务,因为互联网上不能直接使用私有地址,,因此就要把该服务的ip和端口映射到公网上面,然后外部客户端 通过访问公网ip+port,就能请求到内网的服务
- 防火墙特点:一侧是私网,一边是公网
- iptables无法做到调度功能(负载均衡), 一个端口只能映射到内部一个ip:port,
iptables 实现SNAT(私有ip如何上公网)
私有网络
10.0.0.0/8
172.16.0.0/16-----172.31.0.0/16 16个B类
192.168.0.0/24------182.168.255.0/24 256个C类
snat:(使用私有网络地址上网)
- 用私网地址直接上网,有去无回,因为互联网上没有上述地址的路由,报文返回时没有路由
- pat—port nat 因为ip和端口都要映射,snat作只是源地址替换,可能存在多台机器同时请求,私有对公有,多对一可以;但是回来时,变成公对私变成,一对多端口不做映射,多台机器可能启动同一个端口的
- 私有网络地址内部不要配置公有地址,因为会屏蔽外面真实的公有地址
iptables -t nat -A POSTROUTING -s 192.168.37.0/24 -j SNAT --to-source 172,16.0.7(专线)
iptables -t nat -A POSTROUTING -s 192.168.37.0/24 -j MASQUERADE (拨号上网,因为公网地址会变动)
iptables 自定义链:
iptables -N TOINTERNET(定义)
iptables -I TOINTERNET -s 192,168.37.0/24 -p icmp --icmp-type 8 -j ACCEPT
iptables -I TOINTERNET -s 192.168.37.0/24 -p tcp --dport 80 -j ACCEPT
iptables -I FORWORD -J TOINTERNET(TOINTERNET关联到系统的5个链中)
心得:
OUTPUT不仅控制响应报文,而且控制主动请求报文。因此output基本不设置,因为自己请求可以不设置,而控制响应报文可以直接在INPUT链上reject
配置防火墙可以先在计划任务(atd、cron)中配置初始化操作iptables -F,以防止配置错误导致去机房修改