目录
3、将一台公网 ip 主机的端口转发到另一台公网 ip 主机
iptables之路由 路由表 转发
1.路由表
路由表在Linux中 ⾸先是⼀张 可见的 可更改的表, 它的作⽤ 就是当数据包发到Linux的时 候 , 系统(或者说内核)就根据这张表中定义好的信息 来决定这个数据包接下来该怎么⾛
重要知识点:在Linux当中 只要有网络传输的发生 就⼀定会跟路由表有最直接的联系
2.路由功能和路由器
有了路由表之后,Linux就可以遵循这个表中的路由信息,决定数据的流向了,不过数据包最终跨网段的时候,必须借助网关设备才能到达其它网络
3.网关设备
⽹关设备:是⽤于连接两个不同⽹络的媒介, 可以是⼀个硬件的路由器 (我们平时家⾥⽤ 的那种 ⼩路由器 就是这个功能)也可以是⼀个开启了 路由功能的 Linux主机
⼀个开启了路由功能的Linux 就可以作为⼀个 ⽹关设备使⽤
4.转发
如何开启转发?
使能数据转发功能:
echo 1 > /proc/sys/net/ipv4/ip_forward ##查看cat /proc/sys/net/ipv4/ip_forward
禁⽌数据转发功能:
echo 0 > /proc/sys/net/ipv4/ip_forward
Linux开启了转化功能后,其实起到了两种功效?
Linux本身可以转发数据包,自身就会形成了一个小路由器,可以充当网关来使用
Linux开启了数据包转发功能,iptables的NAT表才可以正常使用
————————————————
原文链接:https://blog.csdn.net/weixin_43443216/article/details/116500414
###############NAT 网络地址转换的原理及功能,实现局域网访问互联#################
网络地址转换 NAT(Network Address Translation),被广泛应用于各种类型 Internet 接入方式和各种类型的网络中。原因很简单,NAT 不仅完美地解决了 IP 地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。默认情况下,内部 IP 地址是无法被路由到外网的,内部主机 10.1.1.1 要与外部 Internet通信,IP 包到达 NAT 路由器时,IP 包头的源地址 10.1.1.1 被替换成一个合法的外网 IP,并在 NAT 转发表中保存这条记录。当外部主机发送一个应答到内网时,NAT 路由器收到后,查看当前 NAT 转换表,用 10.1.1.1 替换掉这个外网地址。NAT 将网络划分为内部网络和外部网络两部分,局域网主机利用 NAT 访问网络时,是将局域网内部的本地地址转换为全局地址(互联网合法的 IP 地址)后转发数据包;
NAT 分为两种类型:NAT(网络地址转换)和 NAPT(网络端口地址转换 IP 地址对应一个全局地址)。
静态 NAT:实现内部地址与外部地址一对一的映射。现实中,一般都用于服务器;
动态 NAT:定义一个地址池,自动映射,也是一对一的。现实中,用得比较少;
NAPT:使用不同的端口来映射多个内网 IP 地址到一个指定的外网 IP 地址,多对一。
#############################################################################
iptables 端口转发
iptables 的端口转发则是在内核进行。
1、将本地的端口转发到本机端口
将本机的 7777 端口转发到 6666 端口。
iptables -t nat -A PREROUTING -p tcp --dport 7777 -j REDIRECT --to-port 6666
1.242 机器上将 7777 端口转发到 6666,并侦听 6666 端口。
# nc -l 6666
Ncat: bind to 0.0.0.0:6666: Address already in use. QUITTING.
# iptables -t nat -A PREROUTING -p tcp --dport 7777 -j REDIRECT --to-port 6666
# nc -l 7777 注释:本机并未启用7777端口
1.237 机器上连接 1.242 的 7777 端口,虽然 1.242 的 7777 端口并未被侦听,但是被转发给了处于侦听状态的 6666 端口。
Shell1:1.237主机上输入nc -v 192.168.1.242 7777保持连接
Shell2: 1.237 上查看连接信息
1.242 上查看连接信息
注意 1.242 查查看到的连接信息中,本端端口是转发之后的端口 6666,而不是 7777.
删除该端口转发:
查看当前iptables 的 nat 表的所有规则:(不用 -t 指定表名默认的是指 filter 表)
iptables -t nat -nL --line
删除指定表的指定链上的规则, -D 并指定序号即可。
iptables -t nat -D PREROUTING 1
*说明:PREROUTING链修改的是从外部连接过来时的转发,如果本机连接到本机的转发,需要修改 OUTPUT链。 #####同一台电脑下的虚拟机之间访问用REDIRECT,这里的本机指的是同一个操作系统(ip)下,因为使用lo网卡的时候,是没有PREROUTING这个阶段的,如果一定要在本地(即127.0.0.1)进行NAT的验证,可以添加:
iptables -t nat -A OUTPUT -p tcp --dport 7777 -j REDIRECT --to-port 6666
此命令是设置了,lo网卡的数据包的目的端口是7777的时候,转发到6666端口去。使用的是OUTPUT,因此从外部访问7777端口的话,不会转发的6666端口去,一定要是本地访问本地的时候才行。
[root@master ~]# iptables -t nat -A OUTPUT -p tcp --dport 7776 -j REDIRECT --to-port 80
[root@master ~]# curl localhost:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
.......................
[root@master ~]# curl localhost:7776
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
#############################################################################
实际配置:本地局域网联网主机192.168.220.111访问阿里云公网nginx服务:47.97.21.83:80
阿里云配置:
iptables -t nat -A PREROUTING -p tcp --dport 7776 -j REDIRECT --to-port 80
阿里云开放7776端口
220.111使用telnet 47.97.21.83 7776
220.111访问:
#############################################################################
2、将本机的端口转发到其他机器
整个配置过程概括如下:
1、开启网关主机的路由转发功能
2、添加使用SNAT策略的防火墙规则
通过 1.168 的 6666 端口访问 1.8 的 7777 端口,在 1.168 上设置:
sysctl -w net.ipv4.ip_forward=1 #############1.168主机上开启nat转发
#####################此处为sysctl -w net.ipv4.ip_forward=1 的注释####################
1.临时会话重启后失效
使能数据转发功能:
echo 1 > /proc/sys/net/ipv4/ip_forward ###相当于sysctl -w net.ipv4.ip_forward=1
禁⽌止数据转发功能:
echo 0 > /proc/sys/net/ipv4/ip_forward ##查看cat /proc/sys/net/ipv4/ip_forward
设置后可以使用sysctl net.ipv4.ip_forward查看
[root@localhost ~]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
2.永久生效
在内核文件/etc/sysctl.conf里开启转发功能,然后执行sysctl -p生效
[root@localhost ~]# sed -i '$a\net.ipv4.ip_forward = 1' /etc/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
#############################################################################
iptables -t nat -A PREROUTING -p tcp --dport 6666 -j DNAT --to-destination 192.168.1.8:7777
iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.8 --dport 7777 -j SNAT --to-source 192.168.1.168
#1.168主机上配置转发规则,需要配置PREROUTING和POSTROUTING这2条链,如果只配置其中某一条链则无法正常建立tcp连接,3138 端口从后边的抓包结果中获取
分别在 1.6上抓包和 1.8 上抓包:tcpdump -i virbr0 port 6666 or 7777 -w result.cap
-i 选项指定网卡,-w 选项保存结果到文件当中。抓包的结果使用 Wireshark 查看如下。
1.6的抓包结果:
可以看到 168 收到的包被转发。因为转发发生在内核,在 1.168 转发机上,使用 ss 看不到任何与 1.6 和1.8 的连接(168上用tcpdump程序抓到的是空包,因为转发发生在内核空间,应用程序在用户空间)。##实测在 1.168 转发机上,使用 ss 看不到任何与 1.6 和1.8 的连接。tcpdump命令抓包可以看到与 1.6 和1.8 的连接
1.8 机器上,看到的就是正常的和 1.168 建立连接并传送数据,1.8 并不知道 1.168 仅仅是转发而已。
###################################实际配置###################################
说明:192.168.45.129为虚拟机
[root@master ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.45.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
(无法访问外网,可以ping通192.168.45.131)网络配置如下:
[root@master ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO="static"
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.168.45.129"
NETMASK="255.255.255.0"
虚拟机(192.168.45.129)要通过已联网虚拟主机(192.168.45.131)访问腾讯云nginx:43.139.150.132:80
#45.131上配置:
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@localhost ~]# iptables -t nat -A PREROUTING -p tcp --dport 6767 -j DNAT --to-destination 43.139.150.132:80
[root@localhost ~]# iptables -t nat -A POSTROUTING -p tcp -d 43.139.150.132 --dport 80 -j SNAT --to-source 192.168.45.131
#45.129访问:
#############################################################################
3、将一台公网 ip 主机的端口转发到另一台公网 ip 主机
我有两台AWS主机,一台位于伦敦,一台位于俄勒冈。红色为对应主机的公网 ip. 黑色为私网ip. 将 London 主机的 8016 端口转发到 Oregon 的 8017 端口。
在 London 主机上操作:
iptables -t nat -A PREROUTING -p tcp --dport 8016 -j DNAT --to-destination 18.222.236.211:8017
iptables -t nat -A POSTROUTING -p tcp -d 18.222.236.211 --dport 8017 -j SNAT --to-source 10.53.1.49
在 London 主机上抓包:
注意:这里关键的地方在于 SNAT 之后的 source 地址只能是内网地址,不能 London 主机的公网地址。
如果配成了 London 主机的公网地址,抓包结果如下,转发不会成功。
虽然通过公网 ip 连接主机,但实际上在主机上抓包显示,数据包的目的地址都是主机的私网地址。DNAT 修改了数据包的目的地址,SNAT修改了数据包的源地址,一旦源地址被修改为本机的公网地址,该数据包将会被丢弃。
————————————————
原文链接:https://blog.csdn.net/zhouguoqionghai/article/details/81947603
ss命令:查看服务是否启动
基础环境
centos 7.5
ss命令介绍
ss主要用来查看tcp、udp端口链接情况,主要用于查看tcp、udp套接字的链接情况,比如:查看端口是不是被占用、查看占用端口的程序名字、查看来自于指定ip的端口链接情况等
ss 常用参数
-l
显示处于监听状态的端口信息-u
显示udp协议端口-t
显示tcp协议端口-p
显示端口对应的进程名字以及pid-s
显示端口链接统计信息-n
显示端口号,不显示对应的服务名字-a
显示所有的端口连接,包括不同状态、不同协议
ss常用实例
查看tcp服务端口在不在
ss -tln
tcp服务端口监听
查看udp服务端口在不在
ss -uln
udp端口监听
显示tcp服务端口对应的程序名称以及pid
ss -tlnp
查看端口对应的程序名称以及pid
根据链接的目标地址查看对应的链接情况
ss -at dst 124.64.31.204
查看目的地址的链接
查看链接的统计信息
ss -s
查看端口连接的统计信息
转自:https://baijiahao.baidu.com/s?id=1724618961141932611&wfr=spider&for=pc