linux实现nat转发和内部端口映射

双网卡:

路由机

eth0:114.114.114.114(公网ip)  eth1:192.168.1.1(内网ip)

pc1

eth0:192.168.1.2(内网ip)    eth1(拨号ip)

pc2

eth0:192.168.1.3(内网ip)    eth1(拨号ip)

 

1.配置路由机网卡信息

vim /etc/sysconfig/network-scripts/ifcfg-eth1

复制代码
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=eth1
UUID=85290fec-9166-4a02-90c3-711bf55d1ae2
DEVICE=eth1
ONBOOT=yes
HWADDR=00:0c:29:27:64:b8
IPADDR=192.168.1.1
复制代码

此网卡只配置IP,不配置网关

2.配置pc1网卡

vim /etc/sysconfig/network-scripts/ifcfg-eth0

复制代码
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=eth0
UUID=d79660a0-4225-4f0e-96b1-4d61fc05a17c
DEVICE=eth0
ONBOOT=yes
HWADDR=00:0c:29:97:6a:4b
IPADDR=192.168.1.2
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
复制代码


pc2配置与pc1类似,保证2台pc机与网关能互相ping通

此时pc1 pc2还不能访问外网,需要路由机做iptables规则

1.查看机器的转发功能时候打开

cat /proc/sys/net/ipv4/ip_forward

若返回1则表示已经打开

返回0则:

echo "1" > /proc/sys/net/ipv4/ip_forward

此规则及时生效,但重启后就失效了,需要在配置文件里添加

vim /etc/sysctl.conf

复制代码
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
#每个消息队列的最大字节限制
kernel.msgmax = 65536
#每个消息的最大size
kernel.shmmax = 68719476736
#内核参数定义单个共享内存段的最大值
kernel.shmall = 4294967296
#控制共享内存页数
复制代码

iptables做nat转发规则

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 114.114.114.114

将192.168.1.0网段转发至路由机的公网IP(静态)

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

将所有网段转发至路由机公网ip(动态)
现在2台pc机就能访问外网了,如果不能访问则检查下dns配置

 

 

内部端口映射

iptables -t nat -A PREROUTING -d 114.114.114.114/32 -p tcp -m tcp --dport 26688 -j DNAT --to-destination 192.168.1.2:22

把192.168.1.2的22端口映射到外部26688端口
找台外网机器访问下114.114.114.114的26688端口,就可以直接进入pc1

 

 

删除规则:把-A改为-D

iptables -t nat -D PREROUTING -d 114.114.114.114/32 -p tcp -m tcp --dport 26688 -j DNAT --to-destination 192.168.1.2:22

映射失效

最后保存下iptables配置

/usr/sbin/iptables-save


但是当pc1拨号时也会导致端口映射失效,类似双网卡默认对外路由的问题,通过路由机访问的IP会默认走拨号端口,需要做下ip伪装,将通过访问内网的公网地址伪装成网关地址从而实现内网通信

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE


单网卡:

下面以CentOS为例,说明单网卡NAT代理的配置。

首先增加eth0:0接口:
新建文件:/etc/sysconfig/network-scripts/ifcfg-eth0:0
文件的内容如下:

点击(此处)折叠或打开

  1. DEVICE=eth0:0
  2. IPADDR=192.168.164.100
  3. NETMASK=255.255.255.0
  4. ONBOOT=yes
  5. BOOTPROTO=static
其中 192.168.164.100为内网的代理网关的ip,保存刚才新建的文件,然后运行命令: service network restart,重启网络。
输入ifconfig命令,网络配置如下:
eth0的ip为 211.69.198.191,即外网ip,eth0:0的ip为 192.168.164.100, 即内网ip。读者要根据自己的情况对这两个ip进行替换。

测试单过程中,外网ip必须使用 eth 而且内网ip 使用 eth0:0 才能使用 !!!
还要设置好外网网卡处单路由项目, route

接着输入以下命令:

点击(此处)折叠或打开

  1. echo 1 > /proc/sys/net/ipv4/ip_forward
  2. iptables -F
  3. iptables -F -t nat
  4. iptables -P FORWARD DROP
  5. iptables -A FORWARD -s 192.168.164.0/24 -j ACCEPT
  6. iptables -A FORWARD -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
  7. iptables -t nat -A POSTROUTING -o eth0 -s 192.168.164.0/24 -j SNAT --to 211.69.198.191
在另一台主机上进行配置:
ip为: 192.168.164.114
netmask为: 255.255.255.0
网关为: 192.168.164.100
如下图所示:
则这台主机即可利用配置好的nat代理上网了。

firewall-cmd实现端口转发:

☼ NAT 转发软路由

开启 NAT 转发之后,只要本机可以上网,不论是单网卡还是多网卡,局域网内的其他机器可以将默认网关设置为已开启 NAT 转发的服务器 IP ,即可实现上网。

# 开启 NAT 转发
firewall-cmd --permanent --zone=public --add-masquerade

# 开放 DNS 使用的 53 端口,UDP
# 必须,否则其他机器无法进行域名解析
firewall-cmd --zone=public --add-port=80/tcp --permanent

# 检查是否允许 NAT 转发
firewall-cmd --query-masquerade
# 禁止防火墙 NAT 转发
firewall-cmd --remove-masquerade

☼ 端口转发

端口转发可以将指定地址访问指定的端口时,将流量转发至指定地址的指定端口。转发的目的如果不指定 ip 的话就默认为本机,如果指定了 ip 却没指定端口,则默认使用来源端口。

# 将80端口的流量转发至8080
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080

# 将80端口的流量转发至192.168.0.1
firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.0.1

# 将80端口的流量转发至192.168.0.1的8080端口
firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.0.1:toport=8080
控制端口/服务:

firewall-cmd --add-service=mysql        # 开放mysql端口
firewall-cmd --remove-service=http      # 阻止http端口
firewall-cmd --list-services            # 查看开放的服务
firewall-cmd --add-port=3306/tcp        # 开放通过tcp访问3306
firewall-cmd --remove-port=80tcp        # 阻止通过tcp访问3306
firewall-cmd --add-port=233/udp         # 开放通过udp访问233
firewall-cmd --list-ports               # 查看开放的端口

是否开启IP伪装:
firewall-cmd --query-masquerade # 检查是否允许伪装IP
firewall-cmd --add-masquerade   # 允许防火墙伪装IP
firewall-cmd --remove-masquerade# 禁止防火墙伪装IP

端口转发:

firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080   # 将80端口的流量转发至8080
firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.1.0.1 # 将80端口的流量转发至192.168.0.1
firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.0.1:toport=8080 # 将80端口的流量转发至192.168.0.1的8080端口

Logo

更多推荐