iptables实现网络防火墙及地址转换

iptables主机防火墙功能及常用命令

FSM:Finite State Machine 有限状态机

客户端:closed -->syn_sent -->established --> fin_wait_1 -->find_wait_2 --> timewait(2MSL)

网络防火墙:FORWARD

路由:

NAT:

/proc/sys/net/ipv4/ip_forward

地址属于内核,地址当前属于主机的都给予响应

路由:对Linux主机而言,设定/proc/sys/net/ipv4/ip_forward的值为1,即为开启路由

路由表的生成

静态:手动添加

动态:基于路由协议学习,RIP2 OSPF

NAT:网络地址转换

A:10

B:172.16-172.31

C:192.168.0-192.168.255

NAT: 工作于传输层和网络层

过载技术

Basic NAT:静态NAT

NAPT:动态NAT,网络地址端口转换

源地址转换:SNAT 用于内网主机访问互联网

目标地址转换:DNAT

让互联网上主机访问本地内网中的某服务器上的服务(发布)

iptables基于SNAT和DNAT这两个目标实现地址转换技术

-j SNT --to-source SIP

规则添加:POSTROUTING链

-j MASQUERAADE  动态获取

-j DNAT --to-destination DIP{:PORT}

支持端口映射

基于nat表

PREROUTING

POSTROTING

OUTPUT

Proxy(代理):工作在应用层

举例说明:

网络拓扑

简单网络访问路由转发功能

172.16.1.10能ping通192.168.8.40,但不能ping通192.168.8.39

192.168.8.39能Ping通172.16.1.254,但不能ping通172.16.1.10

原因:Linux中网卡程序都加载于系统内核中,运行在上面的网卡程序会被系统认为是同一个设备

配置开启路由转发功能

# vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

让配置生效

# sysctl -p

也可以,采用如下命令临时生效

# sysctl -w net.ipv4.ip_forward=1

验证

# cat /proc/sys/net/ipv4/ip_forward

windows客户端添加路由,也可以实现访问

route add 172.16.1.0 mask 255.255.255.0 172.16.1.254

将转发规则屏蔽,则无法访问

# iptables -P FORWARD DROP

对常见服务的放行实例

放行192.168.8.39中80口的访问

# iptables -A FORWARD -s 172.16.1.10 -d 192.168.8.39 -p tcp --dport 80 -j ACCEPT

# iptables -A FORWARD -d 172.16.1.10 -s 192.168.8.39 -p tcp --sport 80 -j ACCEPT

放行172.16.1.0/24网段对192.168.8.0网段22号端口的访问

# iptables -A FORWARD -s 172.16.1.0/24 -d 192.168.8.0/24 -p tcp --dport 22 -j ACCEPT

# iptables -A FORWARD -s 192.168.8.0/24 -d 172.16.1.0/24 -p tcp --sport 22 -j ACCEPT

重新编写规则

# iptables -F FORWARD

# iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT

# iptables -R FORWARD 2 -d 192.168.8.39 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT

nat规则举例

初始化:

# iptables -P INPUT ACCEPT

# iptables -P OUTPUT ACCEPT

//需要accept否则将无法通过路由转发任何数据包

# iptables -P FORWARD ACCEPT

模拟dnat功能之互联网访问局域网服务器

外网端:172.16.1.10

内网端:192.168.8.39

//将访问172.16.1.254 80端口的服务映射到8.89的80端口上

# iptables -t nat -F

# iptables -t nat -A PREROUTING -d 172.16.1.254 -p tcp --dport 80 -j DNAT --to-destination 192.168.8.39

在目标8.39的web日志中可以看到是172.16.1.10访问的,而不是192.168.8.40路由访问

禁止172.16.1.10的IP访问

# iptables -I FORWARD -s 172.16.1.10 -j REJECT

通过外网地址172.16.1.254的22022端口访问192.168.8.39的22号端口(相当于端口映射)

# iptables -t nat -A PREROUTING -d 172.16.1.254 -p tcp --dport 22022 -j DNAT --to-destination 192.168.8.39:22

模拟snat功能之局域网访问互联网应用

172.16.1.10 和 172.16.1.254的eth1都放置于 vmnet2虚拟交换环境中

充当路由功能的机器

外网接口:

DEVICE=eth0

ONBOOT=yes

BOOTPROTO=none

IPADDR=192.168.8.15

BROADCAST=192.168.8.255

NETMASK=255.255.255.0

GATEWAY=192.168.8.254

NETWORK=192.168.8.0

DNS配置

/etc/resolve.conf

nameserver 192.168.8.251

内网接口:

# cd /etc/sysconfig/network-scripts/

# cp ifcfg-eth0 ifcfg-eth1

DEVICE=eth1

ONBOOT=yes

BOOTPROTO=none

IPADDR=172.16.1.254

BROADCAST=172.16.1.255

NETMASK=255.255.255.0

NETWORK=172.16.1.0

内网的机器:

172.16.1.10

DNS:192.168.8.251

GAWEWAY:172.16.1.254

配置192.168.8.251

# vim /etc/sysctl.conf

打开防火墙转发功能

net.ipv4.ip_forward = 1

sysctl -p 使配置生效

在防火墙上添加规则,对来自内网 172.16.1.0网段的机器进行源地址转换

# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 192.168.8.15

测试在内网机器中可以访问互联网

tupdump抓包

nginx用来做什么?

静态资源的web服务器

http服务器反向代理

访问量统计网站:

tupdump抓包

详细的文档见http://blog.csdn.net/nanyun2010/article/details/23445223/

基本语法

========

过滤主机

--------

- 抓取所有经过 eth1,目的或源地址是 192.168.1.1 的网络数据

# tcpdump -i eth1 host 192.168.1.1

- 源地址

# tcpdump -i eth1 src host 192.168.1.1

- 目的地址

# tcpdump -i eth1 dst host 192.168.1.1

过滤端口

--------

- 抓取所有经过 eth1,目的或源端口是 25 的网络数据

# tcpdump -i eth1 port 25

- 源端口

# tcpdump -i eth1 src port 25

- 目的端口

# tcpdump -i eth1 dst port 25网络过滤

--------

# tcpdump -i eth1 net 192.168

# tcpdump -i eth1 src net 192.168

# tcpdump -i eth1 dst net 192.168

协议过滤

--------

# tcpdump -i eth1 arp

# tcpdump -i eth1 ip

# tcpdump -i eth1 tcp

# tcpdump -i eth1 udp

# tcpdump -i eth1 icmp

常用表达式

----------

非 : ! or "not" (去掉双引号)

且 : && or "and"

或 : || or "or"

- 抓取所有经过 eth1,目的地址是 192.168.1.254 或 192.168.1.200 端口是 80 的 TCP 数据

# tcpdump -i eth1 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dsthost

192.168.1.200)))'

- 抓取所有经过 eth1,目标 MAC 地址是 00:01:02:03:04:05 的 ICMP 数据

# tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))'

- 抓取所有经过 eth1,目的网络是 192.168,但目的主机不是192.168.1.200 的 TCP 数据

# tcpdump -i eth1 '((tcp) and ((dst net192.168) and (not dst host 192.168.1.200)))'

- 只抓 SYN 包

# tcpdump -i eth1 'tcp[tcpflags] = tcp-syn'

- 抓 SYN, ACK

# tcpdump -i eth1 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] &tcp-ack != 0'

抓 SMTP 数据

----------

# tcpdump -i eth1 '((port 25) and (tcp[(tcp[12]>>2):4] = 0x4d41494c))'

抓取数据区开始为"MAIL"的包,"MAIL"的十六进制为0x4d41494c。

抓 HTTP GET 数据

--------------

# tcpdump -i eth1 'tcp[(tcp[12]>>2):4] = 0x47455420'

"GET "的十六进制是 47455420

抓 SSH 返回

---------

# tcpdump -i eth1 'tcp[(tcp[12]>>2):4] = 0x5353482D'

"SSH-"的十六进制是 0x5353482D

# tcpdump -i eth1 '(tcp[(tcp[12]>>2):4] = 0x5353482D) and(tcp[((tcp[12]>>2)+4):2]

= 0x312E)'抓老版本的 SSH 返回信息,如"SSH-1.99.."

- 抓 DNS 请求数据

# tcpdump -i eth1 udp dst port 53

其他

----

-c 参数对于运维人员来说也比较常用,因为流量比较大的服务器,靠人工 CTRL+C 还是

抓的太多,于是可以用-c 参数指定抓多少个包。

# time tcpdump -nn -i eth0 'tcp[tcpflags] = tcp-syn' -c 10000 > /dev/null

上面的命令计算抓 10000 个 SYN 包花费多少时间,可以判断访问量大概是多少。

实时抓取端口号8000的GET包,然后写入GET.log

tcpdump -i eth0 '((port8000) and (tcp[(tcp[12]>>2):4]=0x47455420))' -nnAl -w /tmp/GET.log

本文转自rshare 51CTO博客,原文链接:http://blog.51cto.com/1364952/1956943,如需转载请自行联系原作者

上一篇:Linux iptables防火墙原理与常用配置
下一篇:iptables实现网络防火墙功能,SNAT以及DNAT功能