仿新浪全站网站源码,o2o医药电商平台有哪些,系统开发过程,在北京个人怎么注册公司iptables是一个Linux内核中的防火墙工具#xff0c;可以被用来执行各种网络相关的任务#xff0c;如过滤、NAT和端口转发等#xff0c;可以监控、过滤和重定向网络流量。
iptables可以用于以下应用场景#xff1a;
网络安全#xff1a;iptables可以过滤网络流量#xf…iptables是一个Linux内核中的防火墙工具可以被用来执行各种网络相关的任务如过滤、NAT和端口转发等可以监控、过滤和重定向网络流量。
iptables可以用于以下应用场景
网络安全iptables可以过滤网络流量防止未经授权的访问和攻击。网络管理iptables可以限制网络带宽控制网络流量保证网络的稳定性和可靠性。网络服务iptables可以重定向网络流量实现端口转发和负载均衡等功能。网络监控iptables可以记录网络流量分析网络状况提供网络性能和安全的监控和管理。
iptables实现SNAT和DNAT
主机规划
host1172.28.3.208/20host2172.28.15.169/20
原始网络模式
一开始host1和host2都是通过网关gateway进行对外通讯。
原始网络模式如下 在host2上可以访问百度
$ ping www.baidu.com -c 3
PING www.wshifen.com (104.193.88.77) 56(84) bytes of data.
64 bytes from 104.193.88.77: icmp_seq1 ttl49 time179 ms
64 bytes from 104.193.88.77: icmp_seq2 ttl49 time173 ms
64 bytes from 104.193.88.77: icmp_seq3 ttl49 time173 ms--- www.wshifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 3036ms
rtt min/avg/max/mdev 173.674/175.795/179.824/2.870 msSNAT
SNAT是source network address translation的缩写即源地址目标转换。
比如多个PC机使用路由器共享上网每个PC机都配置了内网IP。PC机访问外部网络的时候路由器将数据包的报头中的源地址替换成路由器的ip。当外部网络的服务器比如网站web服务器接到访问请求的时候他的日志记录下来的是路由器的ip地址而不是pc机的内网ip。
这是因为这个服务器收到的数据包的报头里边的“源地址”已经被替换了。所以叫做SNAT基于源地址的地址转换。
现将host1作为host2的网关在host1上进行SNAT转换实现host2可以访问外网。 修改host2的默认网关
修改host2的默认网关为host1
$ sudo ip route delete default
$ sudo ip route add default via 172.28.3.208 dev eth0
$ sudo ip route delete 172.28.0.1
$ sudo ip route delete 172.28.0.0/20$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.28.3.208 0.0.0.0 UG 0 0 0 eth0此时在host2尝试访问百度发现已经无法访问外部网络
$ ping www.baidu.com -c 3
ping: www.baidu.com: Temporary failure in name resolutionhost1开启转发能力
在host1开启转发能力Linux的IP Forwarding功能并不是默认开启的可以采用下面的方法开启
// 没有持久化临时修改
$ sudo -i# echo 1 /proc/sys/net/ipv4/ip_forward上面的方式只是临时开启转发能力重启之后配置就会被重置如果想永久修改可以在/etc/sysctl.conf下增加如下内容
net.ipv4.ip_forward1然后使用sysctl -p重新加载配置文件
$ sysctl -p /etc/sysctl.confhost1配置SNAT规则
在host1上配置如下规则
$ iptables -t nat -A POSTROUTING -s 172.28.15.169 -j SNAT --to-source 172.28.3.208此时再去host2上访问百度发现已经可以访问外部网络了
$ ping www.baidu.com -c 3
PING www.wshifen.com (104.193.88.77) 56(84) bytes of data.
64 bytes from 104.193.88.77: icmp_seq1 ttl48 time174 ms
64 bytes from 104.193.88.77: icmp_seq2 ttl48 time174 ms
64 bytes from 104.193.88.77: icmp_seq3 ttl48 time174 ms--- www.wshifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2583ms
rtt min/avg/max/mdev 174.052/174.397/174.846/0.585 msSNAT和MASQUERADE的区别
MASQUERADE是SNAT的一个特例。
SNAT是指在数据包从网卡发送出去的时候把数据包中的源地址部分替换为指定的IP这样接收方就认为数据包的来源是被替换的那个IP的主机。
MASQUERADE是用发送数据的网卡上的IP来替换源IP因此对于那些IP不固定的场合比如拨号网络或者通过dhcp分配IP的情况下就得用MASQUERADE。
但使用SNAT的时候出口ip的地址范围可以是一个也可以是多个例如如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3的ip然后发出去
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT –to-source 192.168.5.3如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3/192.168.5.4/192.168.5.5等几个ip然后发出去
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT –to-source 192.168.5.3-192.168.5.5这就是SNAT的使用方法即可以NAT成一个地址也可以NAT成多个地址但是对于SNAT不管是几个地址必须明确的指定要SNAT的ip。
假如当前系统用的是ADSL动态拨号方式那么每次拨号出口ip192.168.5.3都会改变而且改变的幅度很大不一定是192.168.5.3到192.168.5.5范围内的地址这个时候如果按照现在的方式来配置iptables就会出现问题了。
因为每次拨号后服务器地址都会变化而iptables规则内的ip是不会随着自动变化的每次地址变化后都必须手工修改一次iptables把规则里边的固定ip改成新的ip这样是非常不好用的。
MASQUERADE就是针对这种场景而设计的他的作用是从服务器的网卡上自动获取当前ip地址来做NAT。
比如下边的命令
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE如此配置的话不用指定SNAT的目标ip了不管现在eth0的出口获得了怎样的动态ipMASQUERADE会自动读取eth0现在的ip地址然后做SNAT出去这样就实现了很好的动态SNAT地址转换。 注对于MASQUERADE只是计算机的负荷稍微多一点。因为对每个匹配的包MASQUERADE都要查找可用的IP地址而不象SNAT用的IP地址是配置好的。当然这也有好处就是我们可以使用通过PPP、PPPOE、SLIP等拨号得到的地址这些地址可是由ISP的DHCP随机分配的。 DNAT
假设现在host2上了运行了一个端口在8080的web服务但是没有外网ip无法在外部直接访问host2的web服务但是host1上有外网ip可以通过DNAT将访问host1的8080端口的请求转发到host2的8080端口。
在host2上运行一个web服务
$ sudo docker run -d --rm -p 8080:80 --name web httpd
9c9a499ce0e566e1a5897d81a21d6d97d8925ef25066f901e9d41de22bd2f0c5$ curl localhost:8080
htmlbodyh1It works!/h1/body/html在host1上配置DNAT
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 172.28.15.169此时再去其他机器上访问host1的8080端口发现流量已经转发到host1的8080端口了
$ curl 172.28.3.208:8080
htmlbodyh1It works!/h1/body/htmlSNAT和DNAT的区别
SNAT是指在数据包从网卡发送出去的时候把数据包中的源地址部分替换为指定的IP这样接收方就认为数据包的来源是被替换的那个IP的主机。
DNAT就是指数据包从网卡发送出去的时候修改数据包中的目的IP表现为如果你想访问A可是因为网关做了DNAT把所有访问A的数据包的目的IP全部修改为B那么你实际上访问的是B。
因为路由是按照目的地址来选择的因此DNAT是在PREROUTING链上来进行的而SNAT是在数据包发送出去的时候才进行因此是在POSTROUTING链上进行的。
iptables记录网络流量
为了方便调试我们可以在raw的PREROUTING链上增加trace规则
sudo iptables -t raw -I PREROUTING -p tcp --dport 8080 -j TRACE
sudo iptables -t raw -I PREROUTING -p tcp --sport 8080 -j TRACE使用dmesg命令来查看日志
// 先清空下日志
$ dmesg -C// 下面是curl 172.28.3.208:8080的部分日志
$ dmesg
[13428.991593] TRACE: raw:PREROUTING:policy:3 INeth0 OUT MAC00:15:5d:70:01:10:00:15:5d:cc:04:f5:08:00 SRC172.28.0.1 DST172.28.3.208 LEN40 TOS0x00 PREC0x00 TTL128 ID32326 DF PROTOTCP SPT63368 DPT8080 SEQ94812980 ACK2940281795 WINDOW0 RES0x00 ACK RST URGP0
[13428.991675] TRACE: mangle:PREROUTING:policy:1 INeth0 OUT MAC00:15:5d:70:01:10:00:15:5d:cc:04:f5:08:00 SRC172.28.0.1 DST172.28.3.208 LEN40 TOS0x00 PREC0x00 TTL128 ID32326 DF PROTOTCP SPT63368 DPT8080 SEQ94812980 ACK2940281795 WINDOW0 RES0x00 ACK RST URGP0
[13428.991697] TRACE: mangle:INPUT:policy:1 INeth0 OUT MAC00:15:5d:70:01:10:00:15:5d:cc:04:f5:08:00 SRC172.28.0.1 DST172.28.3.208 LEN40 TOS0x00 PREC0x00 TTL128 ID32326 DF PROTOTCP SPT63368 DPT8080 SEQ94812980 ACK2940281795 WINDOW0 RES0x00 ACK RST URGP0
。。。。。。查看/var/log/messages日志
直接查看系统日志文件/var/log/messages时会提示说没有这个文件或目录。
原因是Ubuntu默认不开启系统日志配置文件/etc/rsyslog.d/50-default.conf中系统日志那段的代码默认是被注释掉的
#*.info;*.notice;*.warn;\
# auth,authpriv.none;\
# cron,daemon.none;\
# mail,news.none -/var/log/messages我们只要将这4行前面的注释#去除即可。
然后需要重启rsyslog服务
$ sudo service rsyslog restart最后就可以查看/var/log/messages文件中的日志了。
会话跟踪
疑问当host2给host1返回时目标ip为host1我们也没有配置什么NAT规则把目标ip改成客户端的ip那么服务器为啥不是把报文交给host1的进程处理而是原路forward转发呢
这个其实还是因为NAT依赖了netfilter的会话跟踪功能简单来说netfilter是有状态的以tcp举例tcp连接的建立是因为客户端ip:客户端端口和服务端ip:服务端端口这个四元组是有来有回的就是我给你发了消息你也回我了此时netfilter就认为这是一个会话。
所以在host2给host1返回时host1拿着四元组去查查到有会话因此就按照之前的路径原路回来。
另外nat这个table里的链只在检测到之前不存在会话时才会进后续就不会再进了也就是只有首次报文的时候进nat的链。
像上面这个案例只要执行如下命令关闭会话跟踪就执行不成功了
sudo iptables -t raw -I PREROUTING -p tcp --dport 8080 -j NOTRACK可以安装conntrack工具来查看会话。
sudo apt-get install conntrack使用conntrack -L命令来查看会话
$ conntrack -L
tcp 6 431997 ESTABLISHED src172.28.0.1 dst172.28.3.208 sport65499 dport8080 src172.28.15.169 dst172.28.0.1 sport8080 dport65499 [ASSURED] mark0 use1
tcp 6 300 ESTABLISHED src172.28.0.1 dst172.28.3.208 sport54422 dport22 src172.28.3.208 dst172.28.0.1 sport22 dport54422 [ASSURED] mark0 use1
conntrack v1.4.4 (conntrack-tools): 2 flow entries have been shown.