网络密码学相关

ssh: 一种确保远程通信安全的方法

生成新公钥:
ssh-keygen -t rsa -C "您的email"
在回车中会提示你输入一个密码, 这个密码会在你提交项目时使用,如果为空的话提交项目时则不用输入, 建议采用不输入密码的方式。公钥生成后您可以在本机系统盘下,您的用户文件夹里发现一个.ssh文件,其中的id_rsa.pub文件里存储的即为刚刚生成的ssh公钥。

proxychains

proxychains方案,可以让不支持proxy设置的程序使用代理。
透明代理一般分为Pre-Load动态库、IP转发表等方案。proxychains采用的是Pre-Load方案,如果要在docker容器中使用,需要在容器中配置(可以做到镜像中,以方便容器使用)。

一、安装proxychains-ng
解压、编译并安装proxychains-ng:

1
2
3
4
5
unzip proxychains-ng-4.11.zip
cd proxychains-ng-4.11
./configure --prefix=/usr --sysconfdir=/etc
make && make install
cp src/proxychains.conf/etc

二、配置proxychains-ng
修改/etc/proxychains.conf文件,主要内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
strict_chain
# Proxy DNS requests -no leak for DNS data
proxy_dns
remote_dns_subnet 224
# Some timeouts in milliseconds
tcp_read_time_out 15000
tcp_connect_time_out 8000
### Examples for localnet exclusion
## localnet ranges will *not* use a proxy to connect
## connects to localhost.
localnet 127.0.0.0/255.0.0.0 # 修改
## RFC1918 Private Address Ranges
localnet 10.0.0.0/255.0.0.0 # 修改
localnet 172.16.0.0/255.240.0.0 # 修改
localnet 192.168.0.0/255.255.0.0 # 修改
# ProxyList format
# type ip port [userpass]
# (values separated by 'tab' or 'blank')
# only numeric ipv4 addresses are valid
[ProxyList]
http 172.19.6.47 8080 用户名 密码 # 修改

三、使用proxy
执行时在需要使用proxy的应用前加上proxychains4即可,例如:

1
2
proxychains4 curl http://www.google.com
proxychains4 curl https://www.google.com

也可以设置环境变量 LD_PRELOAD=/usr/lib/libproxychains4.so
或者修改配置文件 /etc/ld.so.preload,在最后增加一行

1
2
.*\n                # 文件原始内容内容
libproxychains4.so # 在最后增加的内容

这样执行程序时,不需要在前面加proxychains4即可使用代理。
可以设置环境变量PROXYCHAINS_QUIET_MODE=1,以减少proxychains的输出消息。

redsocks+iptables

redsocks+iptables方案让不支持proxy设置的程序使用代理。
透明代理一般分为Pre-Load动态库、IP转发表等方案。本方案采用的是IP转发表,较前者的优势是支持docker容器(只需在宿主机上配置,docker容器不需要任何配置即可使用)。

一、安装redsocks
在ubuntu系统中切换到root用户,执行:apt-get install redsocks -y即可完成redsocks的安装。
redsocks会自动检查http-proxy支持的鉴权方案,而华为proxy会在http头中返回支持的两种鉴权方式:

1
2
Proxy-Authenticate:NTLM
Proxy-Authenticate:Basic realm="Pinacolada"

redsocks只识别第一个(NTLM),与其支持的(Basic或Digest)不匹配导致无法通过鉴权。需要修改源码重新编译或替换其bin文件(替换前需要停止redsocks服务: service redsocks stop)。
如若redsocks无法运行,请到https://github.com/darkk/redsocks下载源码,然后修改其中的http-auth.c文件,自行编译。

1
2
3
4
5
6
7
8
9
10
11
12
293 if(strncasecmp(line, auth_request_header, strlen(auth_request_header)) == 0)
... {
... char *ptr = line + strlen(auth_request_header);
... while(isspace(*ptr)){
... ptr++;
... }
... if(strncasecmp(ptr, "Basic", 5) == 0 || strncasecmp(ptr, "Digest", 6)==0){
294 return line;
... }
... //log_error(LOG_WARNING, line);
... }
295 free(line);

带数字号的是原始的 -> 如 293、294、295
... 后代表的是修改新增的

二、配置redsocks
修改/etc/redsocks.conf文件。重启redsocks服务(service redsocks restart)。

  • 如果要在docker容器中使用proxy, local_ip要配置成0.0.0.0(在所有网口上侦听端口)。
  • 需要配置两个侦听端口,分别对应http、https代理(http代理类型为http-relay、https代理类型为http-connect)。

三、配置IP转发表
自己建立一个名为addiptables的shell执行脚本用来配置IP转发表(对80/8080/443端口转发),转发表中的端口号必须与/etc/redsocks.conf一致。
后续可以将addiptables加到系统启动脚本中,以便系统重启时自动配置IP转发表。系统自动启动脚本的方法有多种(例如: 将 addiptables 放到 /etc/init.d/ 目录下,然后修改 /etc/rc.local文件,在exit 0前面插入一行 /etc/init.d/addiptables)。

四、使用proxy
配置完成后,应用不需要做任何配置与修改,即可使用代理了。
[备注] 当使用https代理时,”CONNECT”HTTP头使用的IP地址(非域名),导致客户端校验SSL证书失败。可以采用以下方法解决:

  • 客户端关闭证书校验(例如: curl带上-k参数); 无法关闭证书校验的客户端,使用另外的方法。
  • 安装代理服务器证书: 将hwproxy.crt(可在浏览其导出Base64编码的证书)放在/usr/local/share/ca-certificates目录,然后执行命令update-ca-certificates
  • 使用Linux下通过proxychains-ng设置透明代理