
正文
vpnjava代码的简单介绍
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
登录vpn后,java程序无法访问远数据库或远程服务(微服务或webservice服务)
场景:在家远程办公,使用vpn访问公司微服务, 浏览器能正常访问, 但java程序发起的请求不能
解决方法:加入java启动参数: -Djava.net.preferIPv4Stack=true
如果使用的是tomcat则在tomcat启动参数里面添加 -Djava.net.preferIPv4Stack=true
如果使用的是springboot则
相关问答
Q1: 如何在CentOS创建L2TP/ipsec VPN服务
Xen虚拟化技术虚拟的VPS可以直接安装所有VPN服务,而不用询问是否开通了ppp或者tun权限。
引用
本教程仅仅适用于Xen VPS,不适用于Openvz VPS,安装之前请确定自己是否是Xen VPS!
本教程仅适用于32位Centos5系列,不能用于Centos6或者64位Centos
1. 下载vpn(CentOS专用)一键安装包
Java代码
#wget
#chmod a+x xen_centos_ipsec.sh
2. 运行一键安装包
Java代码
#bash xen_centos_ipsec.sh
会有三个选择:
Java代码
1. 安装VPN服务
2. 修复VPN
3. 添加VPN用户
首先输入1,回车,VPS开始安装VPN服务. 首先需要输入ipsec的共享密匙,如果直接回车的话共享密匙就是”hi-vps.com”. VPN服务安装完毕后会默认生成一个用户名为vpn,密码为随机数的用户来。
3. 添加VPN用户
同样运行刚才的安装包,选择3,然后回车即可:
Java代码
#bash xen_centos_ipsec.sh
选择3,然后输入用户名和密码,OK
4. 修复VPN服务
如果VPN拨号发生错误,可以试着修复VPN,然后重启VPS
Java代码
#bash xen_centos_ipsec.sh
选择2,然后reboot
5. 如何在XP上连接L2TP VPN?
按照创建pptpd VPN的方法新建一个VPN连接,然后选择“网络”属性页面,在“VPN 类型”选择“L2TP IPSec VPN”。由于windows在使用“L2TP/IPsec预共享密钥的VPN连接模式”(英文原版)情况下下仅支持证书,而对于使用psk连接l2tp /ipsec的时候则会会出现789错误,所以只有修改windows注册表,用如下方式修改:在“运行”中输入:
Java代码
reg add "HKLM\SYSTEM\CurrentControlSet\Services\RasMan\Parameters" /v ProhibitIPSec /t REG_DWORD /d 1
然后重启XP,l2tp拨号,成功。
Q2: VPN连接错误711的解决办法
711这个错误代码的大致意思是说:由于连接不到远程服务器。产生原因:很有可能先前出现过错误“651”的情况。最后在处理完651的时候,由于某些操作不当,而导致了711的出现。
处理方法:
1、打开“猫盒子”,运行机器,等进入到桌面的时候,找到C盘里的一个文件夹c:/windows/system32/Logfiles /WMI的文件夹,先别急着打开,对着其点击右键,然后单击“管理员取得所有权“后,出现一个短暂的DOS运行程序,运行完成后重启计算机;
2、重启完成,重新登陆客户端,连接好网络之后,“计算机”点击右键,找到“管理”,依次为 “应用程序和服务”、“服务”,找到Secure Socket Tunneling Protocolservice,对其单击右键,更改为启动类型更改为“自动”单击确定,如果左上角有,或者还是对其单击右键发现有“启动”的选项可以选择的话,一定要点击启动。
3、在该系统树中找到名为“Remote Access AutoConnection Manager”的文件,重复刚才第2步的操作程序。
4、完成后,找到“Remote Access ConnectionManager”这个文件,然后重复第2步的方法,然后重新启动电脑。
提示:建议今后在机器完全关闭之前,不要提前关闭“猫盒”以免造成这个WIN7本身就不太稳定的系统混乱。
Q3: 通过hook connect 函数 实现 VPN功能是否可行
在android系统中,可以使用iptables控制单个应用网络访问。在google code上有一个开源项目-droidwall就是基于iptables实现的。除了iptables可以实现控制单个应用网络访问外,还可以通过拦截应用中的connect函数,达到控制应用访问网络的目的。下面从几个方面分析android应用中connect调用流程为例来实现拦截connect实现网络禁用和ip过滤。(以下分析基于4.2源码)
1.android中网络访问流程
1)android系统中访问网络可以通过Socket.java、URL.java、HttpPost.java、HttpGet.java等关键类来访问网络资源。通过代码追踪,这些类访问网络资源最终需要通过native方式,调用linux系统下的socket函数访问网络。在android4.2源码中,java层访问网络得native方法定义在源码路径libcore/luni/src/main/java/libcore/io/Posix.java中(4.0之前的网络系统、文件系统的native方法是独立分开得,4.0之后组织在Posix.java中)。如下是Posix.java中的代码片段:
public final class Posix implements Os { Posix() { } public native FileDescriptor accept(FileDescriptor fd, InetSocketAddress peerAddress) throws ErrnoException, SocketException; public native boolean access(String path, int mode) throws ErrnoException; public native void bind(FileDescriptor fd, InetAddress address, int port) throws ErrnoException, SocketException; ...... //对应linux下的connect系统调用 public native void connect(FileDescriptor fd, InetAddress address, int port) throws ErrnoException, SocketException;
2)Posix.java中的native方法实现源码路径libcore/luni/src/main/native/libcore_io_Posix.cpp文件中,native connect方法实现代码片段如下:
taticvoidPosix_connect(JNIEnv*env,jobject,jobjectjavaFd,jobjectjavaAddress,jintport)
{
sockaddr_storagess;
if(!inetAddressToSockaddr(env,javaAddress,port,ss))
{
return;
}
constsockaddr*sa=reinterpret_castconstsockaddr*(ss);
(void)NET_FAILURE_RETRY(env,int,connect,javaFd,sa,sizeof(sockaddr_storage));
}
有上代码可知,java层connect最终功能由linux系统connect函数实现。
2.so注入
so注入可以参考古河大哥牛逼的libInject(点击这里访问)。
3.拦截connect库编写
在connect中,获取传入的参数ip地址,根据需要把需要禁用的ip地址改为127.0.01.以下是我测试的拦截connect函数关键代码:
intnew_connect(intsockfd,conststructsockaddr*addr,socklen_taddrlen)
{
LOGDD("HOOK
====new connect****************");
charip[128]={0};
intport=-1;
if(addr-sa_family==AF_INET)
{
structsockaddr_in*sa4=(structsockaddr_in*)addr;
inet_ntop(AF_INET,(void*)(structsockaddr*)sa4-sin_addr,ip,128);
port=ntohs(sa4-sin_port);
LOGDD("AF_INET IP===%s:%d",ip,port);
}
elseif(addr-sa_family==AF_INET6)
{
structsockaddr_in6*sa6=(structsockaddr_in6*)addr;
char*ipv6=NULL;
inet_ntop(AF_INET6,(void*)(structsockaddr*)sa6-sin6_addr,ip,128);
ipv6=strstr(ip,"f:");
if(NULL!=ipv6)
{
strcpy(ip,ipv6+2);
}
port=ntohs(sa6-sin6_port);
LOGDD("af_inet6
IP===%s:%d",ip,port);
}
else
{
returnold_connect(sockfd,addr,addrlen);
}
if(strcmp(ip,"115.23.20.178")==0)
{
LOGDD("%s
==127.0.0.1",ip);
structsockaddr_inmy_addr;
intmy_len=sizeof(structsockaddr_in);
bzero(my_addr,sizeof(my_addr));
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(80);
my_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
returnold_connect(sockfd,(constsockaddr*)my_addr,sizeof(my_addr));
}
else
{
return old_connect(sockfd,addr,addrlen);
}
}
4.拦截connect函数功效
1)禁用应用网络访问。
2)过滤广告ip
3)禁用定位功能







