Nginx Header,实现对HTTP/S请求、响应进行添加、修改、删除等操作

删除Header

来源库:ngx_http_fastcgi_module、ngx_http_proxy_module

fastcgi_hide_header ‘Key’;

Syntax: fastcgi_hide_header field;
Default:
Context: httpserverlocation

proxy_hide_header ‘Key’;

Syntax: proxy_hide_header field;
Default:
Context: httpserverlocation

例如:反向代理和fastcgi区分不同的场景使用。

fastcgi_hide_header X-Powered-By;

proxy_hide_header X-Powered-By;

 

修改Header

通过内置的操作,修改header分为两步,先将其删除再增加。

例如:

fastcgi_hide_header Content-Type;

proxy_hide_header Content-Type;

add_header ‘Content-Type’ ‘text/css’;

 

添加请求Header

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

fastcgi_param  ‘HTTP-X-Forwarded-For’ $remote_addr;

删除请求Header

proxy_set_header X-Forwarded-For ”;

fastcgi_param  ‘HTTP-X-Forwarded-For’ ”;

 

通过第三方模块

headers-more-nginx-module

Github:https://github.com/openresty/headers-more-nginx-module

添加/设置Header

syntax: more_set_headers [-t <content-type list>]... [-s <status-code list>]... <new-header>...

default: no

context: http, server, location, location if

phase: output-header-filter

more_set_headers “Server: yunjiasu-nginx”;

清除Header

syntax: more_clear_headers [-t <content-type list>]... [-s <status-code list>]... <new-header>...

default: no

context: http, server, location, location if

phase: output-header-filter

more_clear_headers -s 404 -t ‘text/plain’ Foo Baz;

more_clear_headers ‘X-Hidden-*’;

 

添加请求Header

more_set_input_headers

syntax: more_set_input_headers [-r] [-t <content-type list>]... <new-header>...

default: no

context: http, server, location, location if

phase: rewrite tail

删除请求Header

more_clear_input_headers

syntax: more_clear_input_headers [-t <content-type list>]... <new-header>...

default: no

context: http, server, location, location if

phase: rewrite tail

例子:

more_clear_input_headers -t ‘text/plain’ Foo Baz;

more_clear_input_headers “Foo” “Baz”;
more_clear_input_headers ‘X-Hidden-*’;

 

OpenVPN推送默认路由表

根据官方Server配置文件:https://github.com/OpenVPN/openvpn/blob/master/sample/sample-config-files/server.conf可以得出一下配置方法:

1、客户端:

在client-config-dir指定的文件夹内配置指定客户端信息如下,比如证书Thelonious,那么路径为ccd/Thelonious的文件信息如下:

复制代码
# tun模式(此模式下,如果nat30时第二位为前面IP的下一位,但nat24时第二位为子网掩码,第三位的网关不能设置)
# 路由表
iroute 10.9.0.0 10.9.0.1
# IP
ifconfig-push 10.9.0.1 10.9.0.2
# tap模式
push "route IP 子网掩码 网关(可有可无,无时为VPN服务器地址)"
ifconfig-push IP 子网掩码
复制代码

2、服务端

在Server.conf文件配置如下:

#tun模式(第三位网关不能设置)
push "route 192.168.10.0 255.255.255.0"
#tap模式
push "route IP 子网掩码 网关(可有可无,无时为VPN服务器地址)"

可以看到上面的路由都默认没有指定默认网关,那么都会走向服务端的IP,然后统一由服务端进行路由转发

民间方法如下(不一定有效):

1、客户端:

直接在客户端配置文件配置client.conf的最后加入:

route 172.16.100.0 0.0.0.0 net_gateway

2、服务端:

在server.conf加入:

push "route 172.16.100.0 0.0.0.0 net_gateway"

可以看出上面的配置都指定了默认网关。

 

参考:

https://www.52os.net/articles/openvpn-add-local-routing-table.html

https://xiaolife.com/wordpress/use-openvpn-route-and-vpn_gateway/

https://datahunter.org/openvpn_lan2lan

https://serverfault.com/questions/648083/openvpn-tunnel-between-two-lans-traffic-dropped-on-the-way

openvpn路由配置

openvpn路由配置

通常openvpn部署好以后,客户端连接VPN后会被配置一些路由,其客户端的路由会被修改为所有的流量都通过VPN来传输。但有时候,我们需要客户端的某些IP走VPN或者本地网关。这里有两种方法进行openvpn的路由配置

第一种方法: 客户端进行配置
在配置文件下增加如下内容:
route-nopull # 客户端连接openvpn后 不从服务端获取路由
max-routes 1000 # 设置路由的最大条数,默认是100,这里可以根据需求修改
route 192.168.0.0 255.255.0.0 net_gateway # 使192.168.0.0/24网段,不走vpn网关
route 192.168.1.0 255.255.0.0 vpn_gateway # 使192.168.1.0/24网段,走vpn网关

第二种方法: 在服务端进行配置
服务端和客户端的配置略有不同
push “route 192.168.0.0 255.255.0.0 net_gateway” # 将引号中的路由推送到客户端
push “route 192.168.1.0 255.255.0.0 vpn_gateway ” # 将引号中的路由推送到客户端
注意: 如果这里有 若配置中有redirect-gateway则需要先删除

配置完成后,需要重启openvpn服务。

两种方法选取其一即可。

openvpn添加本地路由表

默认情况下,VPN连接成功后会自动增加一些路由,并把网关设置成vpn的,所以所有的流量都会通过VPN来传送,但是如果使用openvpn,可以自己修改路由,指定某些ip走vpn,或者某些ip不走vpn,从而达到节省流量或者提高访问速度的目的。openvpn有两种方法修改路由表:

1.从客户端修改

这种情况只要改本地配置文件即可,服务器不需要修改。适合客户端比较多且网络条件比较复杂,某些客户端有定制路由的需求,或者临时有修改的情况。例如打开openvpn的配置文件open.ovpn,在“max-routes 1000” 后加入相应的路由就:

route 172.16.100.0 0.0.0.0 net_gateway 
route 10.252.252.0 255.255.255.0 net_gateway 
route 103.103.103.0 255.255.255.0 net_gateway

最后一个参数“net_gateway”表示强行指定IP段不使用vpn,还有一个正好相反的“vpn_gateway”强行指定IP段使用VPN。

2.在服务器端配置
在服务器中配置推送全局路由,客户端不需要更改任何配置,适合客户端网络条件比较相似的情况。在openvpn服务器的配置文件中加入:

push "route 172.16.100.0 0.0.0.0 net_gateway"
push "route 10.252.252.0 255.255.255.0 net_gateway"
push "route 192.168.1.0 255.255.255.0 net_gateway"
重启服务:
killall openvpn
openvpn --daemon --config /etc/openvpn/2.0/conf/server.conf

windows/linux下都可以用“ netstat -nr ”来查看路由是否添加成功。
当然windows/linux下也可以用route命令永久添加路由,采用什么方法,看你的需求和习惯了。

Linux下的GRE隧道及其路由转发

隧道,字面上来看就是一条通道,这条通道由点到点,独立与其他。linux下的隧道其他的了解不深,单独写下最近搭建过的gre隧道和路由转发功能实现。

先说一下隧道的基本概念:

一种技术(协议)或者策略的两个或多个子网穿过另一种技术(协议)或者策略的网络实现互联,称之为overlay topology,这一技术是电信技术的永恒主题之一。
电信技术在发展,多种网络技术并存,一种技术的网络孤岛可能需要穿过另一种技术的网络实现互联,这种情况如果发生在高层协议的PDU封装于低层协议PDU中时通常称之为复用,特别地三层PDU穿过二层网络地技术称为租用链路或虚电路;而如果穿越发生在一种协议PDU封装在同一层协议的PDU中,或者封装在高层协议的PDU中时,人们通常称之为隧道。
隧道提供了一种某一特定网络技术的PDU穿过不具备该技术转发能力的网络的手段,如组播数据包穿过不支持组播的网络;另一种情况是有时因为管理策略的原因,一个管理者(策略)的子网不能通过和另一个管理者(策略)的网络互联而连接,而是要穿过另一个管理者(策略)的网络实现连接,这就是所谓的VPN(Virtual Private Networks),不管是L2 VPN还是L3 VPN都需要利用隧道技术实现。因此隧道某种意义上可以概括为穿越不同的网络的技术,不同既可以是技术方面的,也可以是管理策略方面的。

隧道可以作为一个虚拟接口来实现。隧道接口并不指定特定的“乘客”或“传输”协议连接,而是一种结构,可以实现任何标准点到点封装的服务。由于隧道是点到点连接,因此对每个连接必须配置一个单独的隧道。

GRE(通用路由协议封装)工作在三层,即IP层。它的工作方式很简单,看看数据包结构能了解大概。

技术分享

在接收到走gre隧道的包(不一定是IP包)之后,将这个包加上GRE的包头,然后再借助对外的网络进行通信。

现场环境:

两台linux机器作为GRE隧道路由器,其中172开头的内网已互相连通,10与20开头的外网不能通

A机器:eth1:10.10.1.1

bond0:172.19.1.1

B机器:eth1:20.10.1.1

bond0:172.19.1.2

在做完隧道后,实现10.10.1.1网段与20.10.1.1网连通。

1、在两台LINUX开通路由转发,为等下的路由功能做准备:

vim /etc/sysctl.conf
修改net.ipv4.ip_forward=0 修改成1
sysctl -p

 

2、建立隧道(A机器上):

modprobe ip_gre
ip tunnel add My_Tunnel mode gre remote 172.19.1.2 local 172.19.1.1 
# My_Tunnel改为你要搭建的隧道名,local后面添加的是本机器的内网IP。 remote为对端内网的IP
,这两个要先确认能互通。
Ip link set  My_Tunnel up
Ip addr add 192.168.8.1 peer 192.168.8.11 dev My_Tunnel
#My_Tunnel需要修改(下面的TLX_DD都需修改),设定本机隧道的IP 192.168.8.1,对端的IP为192.168.8.11。
route add -net 20.10.1.0 netmask 255.255.255.0 dev My_Tunnel gw 192.168.8.1
#设置去往20.10.1.0网段默认的路由通过隧道走

注意:两台机到这里配完隧道,两边的隧道ip是要能ping通的,不通的话先确认remote的ip

和local ip能相互ping通。

 

step3:配置网络转发(A机器)

/sbin/iptables -t nat -A POSTROUTING -o eth1 -s 192.168.8.11 -j MASQUERADE
#将对端过来的192.168.8.11源地址nat转换成eth1上的地址
/sbin/iptables -A FORWARD -s 192.168.8.11 -o eth1 -j ACCEPT
#开启对源地址192.168.8.11出口为eth1的转发功能

/sbin/iptables -t nat -A POSTROUTING  -o  My_Tunnel  -s 10.10.1.0/24 -j MASQUERADE
#将源地址10.10.1.0网段的包nat成My_tunnel的地址即为192.168.8.1
/sbin/iptables  -A FORWARD  -s 10.10.1.0/24  -o  My_Tunnel  -j ACCEPT
#开启转发源地址10.10.1.0网段的转发

然后在10.10.1.0网段的机器上把去往20网段的机器路由配成A就行了
route add -net 20.10.1.0 netmask 255.255.255.0  gw 10.10.1.1

在B机器上做相同格式的操作。整个隧道路由就搭建成功了。

不过说实话,这种需求是不是直接nat转发就行了,需要配隧道这么麻烦吗?

解决GRE隧道的问题:

1、GRE是将一个数据包封装到另一个数据包中,因此你可能会遇到GRE的数据报大于网络接口所设定的数据包最大尺寸的情况。解决这种问题的方法是在隧道接口上配置ip tcp adjust-mss 1436。另外,虽然GRE并不支持加密,但是你可以通过tunnel key命令在隧道的两头各设置一个密钥。这个密钥其实就是一个明文的密码。或者使用gre over ipsec,那样就比较复杂了再另说。

2、GRE隧道没有状态控制,可能隧道的一端已经关闭,而另一端仍然开启。这一问题的解决方案就是在隧道两端开启keepalive数据包。它可以让隧道一端定时向另一端发送keepalive数据,确认端口保持开启状态。如果隧道的某一端没有按时收到keepalive数据,那么这一侧的隧道端口 也会关闭。

 

参考:http://blog.sina.com.cn/s/blog_4fad46a801015wto.html

http://www.server110.com/linux/201310/2242.html

http://www.server110.com/linux/201309/1417.html

http://blog.163.com/leekwen@126/blog/static/33166229200981954962/

本文出自 “DanielQu” 博客,请务必保留此出处http://qujunorz.blog.51cto.com/6378776/1767933

Linux下的GRE隧道及其路由转发