面对世界
面对未来

Iptables 端口(流量)转发 教程

FaceTheWorld阅读(5713)

闲的没事干,不如水一篇文章来的舒服,首先声明,教程源自互联网,本教程只是缝合!

安装环境

  1. 一台可以访问互联网的 VPS ,能与被转发的端口互相通信
  2. 机器系统为 Linux 发行版 Debian、Redhat 系列,教程使用系统为 Debian 10 和 CentOS 8
  3. 系统镜像采用公有云(Ucloud)的公共镜像
  4. 关闭系统 SELinux

教程开始

Redhat (CentOS 8)系列

关闭并禁用系统默认的 Firewalld 防火墙

systemctl stop firewalld.service
systemctl disable firewalld.service

安装并启用 Iptables

dnf install iptables iptables-services -y
systemctl start iptables.service
systemctl enable iptables.service

CentOS 7 安装并启用 Iptables

yum install iptables iptables-services -y
systemctl start iptables.service
systemctl enable iptables.service

清空 Iptables 默认规则并保存

iptables -F
iptables -X
iptables -Z
service iptables save

开启系统内核转发

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf

设置转发规则

iptables -t nat -A PREROUTING -p tcp --dport [本机端口号] -j DNAT --to-destination [目标IP:端口]
iptables -t nat -A PREROUTING -p udp --dport [本机端口号] -j DNAT --to-destination [目标IP:端口]
iptables -t nat -A POSTROUTING -p tcp -d [目标IP] --dport [目标端口号] -j SNAT --to-source [本机主网卡IP]
iptables -t nat -A POSTROUTING -p udp -d [目标IP] --dport [目标端口号] -j SNAT --to-source [本机主网卡IP]

保存重启 Iptables

service iptables save
service iptables restart

Debian (Debian 10)系列

Debian 系列发行版系统默认都是使用的 Iptables 顾不需要再次安装

清空 Iptables 默认规则并保存

iptables -F
iptables -X
iptables -Z
iptables-save > /etc/iptables.up.rules

开启系统内核转发

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

设置转发规则

iptables -t nat -A PREROUTING -p tcp --dport [本机端口号] -j DNAT --to-destination [目标IP:端口]
iptables -t nat -A PREROUTING -p udp --dport [本机端口号] -j DNAT --to-destination [目标IP:端口]
iptables -t nat -A POSTROUTING -p tcp -d [目标IP] --dport [目标端口号] -j SNAT --to-source [本机主网卡IP]
iptables -t nat -A POSTROUTING -p udp -d [目标IP] --dport [目标端口号] -j SNAT --to-source [本机主网卡IP]

保存规则并重启 Iptables

iptables-save > /etc/iptables.up.rules
iptables-restore < /etc/iptables.up.rules

至此简单的使用 Iptables 转发端口(流量)的教程就到此结束,一下是进阶教程

进阶教程

多端口转发方案

iptables -t nat -A PREROUTING -p tcp -m tcp --dport [本机端口段开始:本机端口段结束] -j DNAT --to-destination [目标IP]
iptables -t nat -A PREROUTING -p udp -m udp --dport [本机端口段开始:本机端口段结束] -j DNAT --to-destination [目标IP]
iptables -t nat -A POSTROUTING -d [目标IP] -p tcp -m tcp --dport [目标端口段开始:目标端口段结束] -j SNAT --to-source [本机主网卡IP]
iptables -t nat -A POSTROUTING -d [目标IP] -p udp -m udp --dport [目标端口段开始:目标端口段结束] -j SNAT --to-source [本机主网卡IP]

查看目前 Iptables 规则

iptables -nL --line-number

查看目前 Iptables 的 NAT(转发)规则

iptables -t nat -vnL

删除指定 NAT(转发)规则

通过查看 NAT 规则找到规则对应的列号(一条规则就是一列,初始号为 1)

iptables -t nat -D POSTROUTING [规则列号]
iptables -t nat -D PREROUTING [规则列号]

总结

使用系统防火墙如 Iptables 等来转发流量是最稳定、资源开销最低的一种方式,同时可以看到转发后从使用者本地通过转发端到被转发端的具体延迟,而不是像其他第三方工具转发出来只会显示使用者本地到转发端的延迟,同时资源开销也很大,两者各有优劣;下一篇教程可能是使用 Firewalld 转发端口(流量)的教程,或者是如 Nginx、Brook、Gost、Socat 等第三方工具来实现端口(流量)转发;最后还是那句话,如有问题,欢迎评论留言,如果有被帮助到,请点一个赞,或者分享这篇文章,十分感谢!咕咕咕….

IPSec Over GRE 隧道教程 Redhat 系列篇

FaceTheWorld阅读(1902)

教程来自互联网缝合而成,均为亲自安装测试后发布

谷歌一下,你就知道

安装环境

  1. 两台具有公网 IP 的 VPS A 和 B,其中至少有一台拥有独立 IP ,并且另一台如果是 NAT VPS 则需要内外映射端口一致,假设 A 的公网 IP 为 1.1.1.1,B 的公网 IP 为 2.2.2.2
  2. 设定隧道 A 端内网 IP 为 10.0.0.1,B 端内网 IP 为 10.0.0.2
  3. A、B 两台机器系统为 Linux 发行版 Redhat 系列,教程使用系统为 CentOS 8.3
  4. 关闭防火墙和 SELinux
  5. 尽可能纯净的镜像,教程均采用公有云(Ucloud)的公共镜像

配置 GRE 隧道

在 A、B 机器上分别执行以下命令

安装常用所需软件

dnf install -y vim wget curl net-tools tcpdump mtr

CentOS 7.x

yum install -y vim wget curl net-tools tcpdump mtr

启用 ip_gre 模块

echo "ip_gre" >> /etc/modules
modprobe ip_gre

调整内核参数

echo "net.ipv4.conf.all.forwarding = 1" >> /etc/sysctl.conf
echo "net.ipv4.conf.default.forwarding = 1" >> /etc/sysctl.conf
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

CentOS 8.x 因为网络配置的更改,这里提供了两种方案

方案1(Redhat官方提供的教程,推荐使用该方案):

在 A 机器执行

nmcli connection add con-name gre1 ifname gre1 type ip-tunnel ip-tunnel.mode gre remote [B 机器公网 IP]
nmcli connection modify gre1 ipv4.addresses '10.0.0.1/24'
nmcli connection modify gre1 ipv4.method manual
nmcli connection up gre1

在 B 机器执行

nmcli connection add con-name gre1 ifname gre1 type ip-tunnel ip-tunnel.mode gre remote [A 机器公网 IP]
nmcli connection modify gre1 ipv4.addresses '10.0.0.2/24'
nmcli connection modify gre1 ipv4.method manual
nmcli connection up gre1

方案2(由于 network-scripts 即将被 Redhat 淘汰,而且重启后需要手动启动 GRE 和 IPSec 的配置 ,不推荐;CentOS 7.x 请使用该方案):

在 A 机器上新增并编辑 /etc/sysconfig/network-scripts/ifcfg-gre1 网络配置文件,加入以下内容并保存

DEVICE=gre1
BOOTPROTO=none
ONBOOT=yes
TYPE=GRE
PEER_OUTER_IPADDR=2.2.2.2	# B 机器公网 IP
PEER_INNER_IPADDR=10.0.0.2	# B 机器GRE内网地址
MY_INNER_IPADDR=10.0.0.1	# A 机器GRE内网地址

同样在 B 机器上新增并编辑 /etc/sysconfig/network-scripts/ifcfg-gre1 网络配置文件,加入以下内容并保存

DEVICE=gre1
BOOTPROTO=none
ONBOOT=yes
TYPE=GRE
PEER_OUTER_IPADDR=1.1.1.1	# A 机器公网 IP
PEER_INNER_IPADDR=10.0.0.1	# A 机器GRE内网地址
MY_INNER_IPADDR=10.0.0.2	# B 机器GRE内网地址

CentOS 8.x 启动 GRE 隧道

dnf install -y network-scripts
ifup gre1

CentOS 7.x 启动 GRE 隧道

ifup gre1

测试 GRE 隧道

在 A 机器上测试 GRE 隧道通讯

ping 10.0.0.2	# B 机器 GRE 内网 IP

能 ping 通即为成功

在 B 机器上测试 GRE 隧道通讯

ping 10.0.0.1	# A 机器 GRE 内网 IP

能 ping 通即为成功

配置 IPSec

在 A、B 机器上分别执行以下命令

安装 IPSec 环境

dnf install -y libreswan

CentOS 7.x

yum install -y libreswan

创建 Key

ipsec initnss
ipsec newhostkey --output /etc/ipsec.d/gre.secrets

在 A 机器上执行以下命令

查询所有 IPSec Key

ipsec showhostkey --list

结果应显示为:< 1> RSA keyid: xxxxxxxxx ckaid: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

记下 keyid ,执行以下命令,并保存执行后获得的结果

ipsec showhostkey --left --rsaid [keyid]

结果应为:leftrsasigkey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx….

在 B 机器上执行以下命令

查询所有 IPSec Key

ipsec showhostkey --list

结果应显示为:< 1> RSA keyid: xxxxxxxxx ckaid: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

记下 keyid ,执行以下命令,并保存执行后获得的结果

ipsec showhostkey --right --rsaid [keyid]

结果应为:rightrsasigkey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx….

在 A 机器上执行以下命令

在 A 、B 机器上新建文件 /etc/ipsec.d/gre.conf,加入以下内容并保存,两边机器可以用同一个文件,系统会自动判断自己是左边右边。

conn gre1
	[email protected]
	left=10.0.0.1	# A 机器 GRE 内网 IP
	leftrsasigkey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx....	# A 机器保存的结果
	[email protected]
	right=10.0.0.2	# B 机器 GRE 内网 IP
	rightrsasigkey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx....	# B 机器保存的结果
	authby=rsasig
	auto=start

启动并设置 IPSec 的开机自启

systemctl enable ipsec
systemctl start ipsec

增加并启用 IPSec 规则

ipsec auto --add gre1
ipsec auto --up gre1

上面两条命令只需首次安装执行,执行后重启 IPSec 服务或者重启服务器均不需要执行上方两条命令

检查 IPSec

在 A 机器开启 tcpdump 监听 ESP 数据包

tcpdump -n -i gre1 esp or udp port 500 or udp port 4500

在 B 机器 Ping A 机器的 GRE 内网 IP

ping 10.0.0.1

在 A 机器查看监听数据,如果发现有 ESP 数据包通过,则加密成功

在 B 机器监听,A 机器 Ping 如果也有ESP包通过,则成功

总结

Redhat 系列和 Debian 系列教程基本相同,只是 CentOS 8 的命令有些地方做了改动,同时精简了在 Debian 系列中的部分步骤,教程总体都不难,弄明白一个系列之后,例外系列的基本命令也差不了多少;最后还是那句话,如有问题,欢迎评论留言,如果有被帮助到,请点一个赞,或者分享这篇文章,十分感谢!

IPSec Over GRE 隧道教程 Debian 系列篇

FaceTheWorld阅读(2484)

教程均来自互联网缝合而成,均为亲自安装测试后发布

百度一下,你就知道

安装环境:

  1. 两台具有公网 IP 的 VPS A 和 B,其中至少有一台拥有独立 IP ,并且另一台如果是 NAT VPS 则需要内外映射端口一致,假设 A 的公网 IP 为 1.1.1.1,B 的公网 IP 为 2.2.2.2
  2. 设定隧道 A 端内网 IP 为 10.0.0.1,B 端内网 IP 为 10.0.0.2
  3. A、B 两台机器系统为 Linux 发行版 Debian 系列,教程使用系统为 Debian 10
  4. 关闭防火墙和 SELinux
  5. 尽可能纯净的镜像,教程均采用公有云(Ucloud)的公共镜像

配置 GRE 隧道

在 A、B 机器上分别执行以下命令

安装常用所需软件

apt install -y vim wget curl net-tools tcpdump mtr

启用 ip_gre 模块

echo "ip_gre" >> /etc/modules
modprobe ip_gre

调整内核参数

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.ipv4.conf.default.send_redirects = 0" >> /etc/sysctl.conf
echo "net.ipv4.conf.default.accept_redirects = 0" >> /etc/sysctl.conf
sysctl -p

编辑 A 上的 /etc/network/interfaces 文件,加入以下内容并保存

auto gre1
iface gre1 inet tunnel
address 10.0.0.1
netmask 30
mode gre
endpoint 2.2.2.2	# B 机器公网 IP
ttl 64

同样编辑 B 上的 /etc/network/interfaces 文件,加入以下内容并保存

auto gre1
iface gre1 inet tunnel
address 10.0.0.2
netmask 30
mode gre
endpoint 1.1.1.1	# A 机器公网 IP
ttl 64

启动 GRE 隧道

ifup gre1

测试 GRE 隧道

在 A 机器上测试 GRE 隧道通讯

ping 10.0.0.2	# B 机器 GRE 内网 IP

能 ping 通即为成功

在 B 机器上测试 GRE 隧道通讯

ping 10.0.0.1	# A 机器 GRE 内网 IP

能 ping 通即为成功

配置 IPSec

在 A、B 机器上分别执行以下命令

安装 IPSec 环境并创建 Key

apt install -y libreswan
ipsec initnss
ipsec newhostkey --output /etc/ipsec.d/gre.secrets

在 A 机器上执行以下命令

查询所有 IPSec Key

ipsec showhostkey --list

结果应显示为:< 1> RSA keyid: xxxxxxxxx ckaid: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

记下 keyid ,执行以下命令,并保存执行后获得的结果

ipsec showhostkey --left --rsaid [keyid]

结果应为:leftrsasigkey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx….

在 B 机器上执行以下命令

查询所有 IPSec Key

ipsec showhostkey --list

结果应显示为:< 1> RSA keyid: xxxxxxxxx ckaid: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

记下 keyid ,执行以下命令,并保存执行后获得的结果

ipsec showhostkey --right --rsaid [keyid]

结果应为:rightrsasigkey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx….

在 A 机器上执行以下命令

在 A 机器上新建文件 /etc/ipsec.d/gre.conf,加入以下内容并保存

config setup
	protostack=netkey
conn gre1
	left=10.0.0.1	# A 机器 GRE 内网 IP
	right=10.0.0.2	# B 机器 GRE 内网 IP
	authby=rsasig
	leftrsasigkey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx....	# A 机器保存的结果
	rightrsasigkey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx....	# B 机器保存的结果
	auto=start

在 B 机器上执行以下命令

在 B 机器上新建文件 /etc/ipsec.d/gre.conf,加入以下内容并保存

config setup
	protostack=netkey
conn gre1
	left=10.0.0.2	# B 机器 GRE 内网 IP
	right=10.0.0.1	# A 机器 GRE 内网 IP
	authby=rsasig
	leftrsasigkey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx....	# B 机器保存的结果
	rightrsasigkey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx....	# A 机器保存的结果
	auto=start

在 A、B 机器上分别执行以下命令

启动并设置 IPSec 的开机自启

systemctl enable ipsec
systemctl start ipsec

增加并启用 IPSec 规则

ipsec auto --add gre1
ipsec auto --up gre1

上面两条命令只需首次安装执行,执行后重启 IPSec 服务或者重启服务器均不需要执行上方两条命令

检查 IPSec

在 A 机器开启 tcpdump 监听 ESP 数据包

tcpdump -n -i gre1 esp or udp port 500 or udp port 4500

在 B 机器 Ping A 机器的 GRE 内网 IP

ping 10.0.0.1

在 A 机器查看监听数据,如果发现有 ESP 数据包通过,则加密成功

在 B 机器监听,A 机器 Ping 如果也有ESP包通过,则成功

总结

教程还是相对比较简单的,稍后出 Redhat 系列教程,如有问题,欢迎评论留言,如果有被帮助到,请点一个赞,或者分享这篇文章,十分感谢!

分享源于热爱