使用iptables给内网服务器做端口映射

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用iptables给内网服务器做端口映射相关的知识,希望对你有一定的参考价值。

iptables filter 表案例

iptables的语法规则
iptables -nvL 查看规则
iptables -F 清空规则
iptables save 保存写入的规则
iptables -Z 清空iptables的数据流计数器
iptables -A INPUT -s 源IP -p tcp --sprot 来源端口 -d 目标IP --dport 目标端口 -j DROP/ACCEPT 指定放行的数据流和端口
iptables -I/-A/-D INPUT -s 源IP -j DROP 添加一条简单的匹配规则
iptables -nvL --line-numbers 列出规则的排列序号,例如用于根据序号来删除某条规则
iptables -P INPUT DROP 用于修改链的默认policy(规则),修改前需确认是否会影响数据连接

[[email protected] tmp]# cat ipt.sh 
#!/bin/bash
ipt="/usr/sbin/iptables"
$ipt -F
$ipt -P INPUT DROP
$ipt -P OUTPUT ACCEPT
$ipt -P FORWARD ACCEPT
$ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$ipt -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
$ipt -A INPUT -p tcp --dport 80 -j ACCEPT
$ipt -A INPUT -p tcp --dport 21 -j ACCEPT
$ipt -A INPUT -p icmp --icmp-type 8 -j DROP

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
这条语句是用来指定放行正在通信状态的数据,RELATED,ESTABLTLSHED 这是一种连接状态,放行数据流的通行状态,是一种数据流的状态(tcp/ip握手的传输状态),可以通过netstat 的统计来查看通信有哪些状态,根据需要放行这些状态的数据包才能够正常通信

iptables -A INPUT -p icmp --icmp-type 8 -j DROP 拒绝icmp的ping的数据包
拒绝掉ping的数据流量,--icmp-type 是指定tcp数据的类型,8则是这个数据的协议号

Iptables参数
-m state --state <状态>
有数种状态,状态有:
INVALID:无效的封包,例如数据破损的封包状态
ESTABLISHED:已经联机成功的联机状态;
NEW:想要新建立联机的封包状态;
RELATED:这个最常用!表示这个封包是与我们主机发送出去的封包有关, 可能是响应封包或者是联机成功之后的传送封包!这个状态很常被设定,因为设定了他之后,只要未来由本机发送出去的封包,即使我们没有设定封包的 INPUT 规则,该有关的封包还是可以进入我们主机, 可以简化相当多的设定规则。

nat表应用-1

实践需求:
技术分享图片
VMware操作(仅用于实践,没有实际意义),在VMware克隆一台相同的虚拟机,原虚拟机增加一块网卡,克隆的虚拟机在网卡配置中重新生成一个新的网卡MAC地址,否则会造成MAC地址冲突导致网络不通
生成新MAC地址
技术分享图片
克隆虚拟机上生成一个新的MAC地址
两个网卡的NAT转发服务器和内网服务器都设置为同一类型网卡,这里我设置的是VMnet1仅主机网络,不过这时候在客户端还是能直接连接上192.168.2.22的,下面再做其他设置拒绝掉客户端直接访问

技术分享图片
在解决了mac地址冲突问题后,可以正常使用LAN模式的网络了
设置完毕内网服务器192.168.2.22可以跟192.168.2.33通信,而192.168.2.33的这台服务器公网IP192.168.182.128又可以跟192.168.1.113的客户端通信,这一步网络设置完成,这些步骤仅是VMware中操作,现实中服务器只需要配置相对应的两个网卡(网口)的IP地址,实现物理服务器互相访问即可

nat应用-2

想要192.168.1.113直接访问192.168.2.22的话还需要进一步设置,在192.168.182.128的NAT转发服务器上打开端口转发

[[email protected] ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
[[email protected] ~]# cat !$
cat /proc/sys/net/ipv4/ip_forward
1

192.168.182.128上添加转发规则,使192.168.2.0网段能够上网

[[email protected] ~]# iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o ens33 -j MASQUERADE
[[email protected] ~]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target prot opt in out source destination         

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target prot opt in out source destination         

Chain OUTPUT (policy ACCEPT 2 packets, 224 bytes)
 pkts bytes target prot opt in out source destination         

Chain POSTROUTING (policy ACCEPT 2 packets, 224 bytes)
 pkts bytes target prot opt in out source destination         
    0 0 MASQUERADE all -- * ens33 192.168.2.0/24 0.0.0.0/0 

192.168.2.22内网服务器设置网关,指定192.168.2.33为默认网关,网络需要拥有一个网关出口才能与其他网段主机进行通信,这里需要指定的网关为一台能够与外网通信的服务器的一个内网ip,需要这台服务器能够访问外网也能访问内网,添加好的默认路由如下

[[email protected] ~]# route add default gw 192.168.2.33
[[email protected] ~]# route -n
destination          Gateway          Genmask        Flags   Metric   Ref   Use    Iface
0.0.0.0              192.168.2.33     0.0.0.0        UG      0        0     0      ens34
192.168.2.0          0.0.0.0          255.255.255.0  U       100      0     0      ens34

为内网服务器添加 DNS服务器解析地址,并测试是否能够ping通外网,能够访问外网,但是此时的服务器网络还不能够让客户端从外网ip访问到内网的这台服务器,我们还需要设置iptables端口转发规则
[[email protected] ~]# vim /etc/resolv.conf

Generated by NetworkManager

nameserver 119.29.29.29

[[email protected] ~]# ping www.baidu.com
PING www.a.shifen.com (61.135.169.121) 56(84) bytes of data.
64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=1 ttl=128 time=5.49 ms
64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=2 ttl=128 time=5.15 ms
64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=3 ttl=128 time=6.22 ms

net表应用-3

需求:内网服务器可以访问公网,但是公网依旧不能访问内网的这台服务器,这里我们需要使用iptables做端口映射,把需要转发的数据通过某些端口转发出去,这样才能够使公网能够访问内网服务器
转发服务器打开路由转发

[[email protected] ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
设置转发规则,让内网能够访问外网,这条规则作用于内网服务器访问外部网络,做端口转发时需要删除此条规则,因为这条规则会影响端口转发过程
[[email protected] ~]# iptables -t nat -D POSTROUTING -s 192.168.2.0/24 -o ens33 -j MASQUERADE

在转发的NAT服务器上添加转发的iptables规则,-d这里指的目标地址是转发服务器的公网ip,并非客户端的ip地址,这里是个误区,在实践中会把客户端ip当成为目标ip,设置完成后保存规则即可

[[email protected] ~]# iptables -t nat -A PREROUTING -d 192.168.182.128 -p tcp --dport 1122 -j DNAT --to 192.168.2.22:22
[[email protected] ~]# iptables -t nat -A POSTROUTING -s 192.168.2.22 -j SNAT --to 192.168.182.128

连接内网的192.168.2.22服务器,远程的连接并非内网服务器的ip地址(显得非常蠢- -),而是做了转发的转发服务器的外网ip。根据转发端口指定要连接的内网服务器。如转发的1122端口对应的是192.168.2.22的22端口,这样连接192.168.182.128时写入远程ssh的1122端口就会转发到192.168.2.22服务器上,如图(192.168.182.128服务器和192.168.2.22服务器的ip状态 ):

技术分享图片

以上是关于使用iptables给内网服务器做端口映射的主要内容,如果未能解决你的问题,请参考以下文章

iptables 设置端口转发/映射

怎么用IPTABLES配置端口映射?

iptables综合实验

使用iptables将内网ftp服务映射到其他内网服务器上

iptables

iptables实现端口映射