Linux非root用户使用特权端口
更新:新版本的shadowsocks原生支持切换运行用户,解决我这个需求只要添加-a参数即可:
/usr/local/bin/ss-server -a shadowsocks -s 0.0.0.0 -t 1800 -d 8.8.8.8 -u -p 80 -k yourpassword -m rc4-md5 -f /var/run/ss.pid
以下为原文:
Linux下默认普通用户是不能占用1024以下的特权端口的,之前提到我vps上的设置的最后一点有说到让shadowsocks以非root权限执行,又要使用1024以下的特权端口,之前的解决方案是用setcap,给/usr/local/bin/ss-server授权,但是在一些情况下很可能会造成在非root用户下可以占用低位端口,但是通信会出现问题,setcap的资料又比较少,为了稳定起见暂时弃用。
接下来也尝试用了iptables进行端口映射,将80端口收到的数据重定向到8888端口,然后ss-server监听8888端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8888
这样虽然成功了,但是不知道什么原因,必须要开放8888端口才正常使用,应该是ss有一次什么握手之类的,纯瞎猜……总之也是失败了。
后来转了一圈发现一个好东西authbind,可惜这玩意是Debian系下的,centos原生不支持,好在有一个authbind-centos-rpm。
虽然这个项目已经年久失修,按页面上的教程rpmbuild -v -bb --clean SPECS/authbind.spec都会直接报错了,所以干脆就不要装rpm-build了。
git clone https://github.com/tootedom/authbind-centos-rpm.git
cd authbind-centos-rpm/authbind/SOURCES
tar xvf authbind_2.1.1.tar.gz
cd authbind-2.1.1/
make && make install
接着开始配置,配置文件在/etc/authbind/,里面有三个目录:byport、byaddr、byuid。我们要用shadowsocks用户运行一个程序能够绑定80端口,在byport目录下建立80文件:/etc/authbind/byport/80,设置shadowsocks账户有80文件的使用权限,如果80文件可以被shadowsocks访问,则绑定就是成功的,否则绑定就是失败的。
touch /etc/authbind/byport/80
chmod 755 /etc/authbind/byport/80
chown shadowsocks:shadowsocks /etc/authbind/byport/80
把ss文件内容改一改
nohup su - shadowsocks -c "/usr/local/bin/authbind --deep /usr/local/bin/ss-server -s 0.0.0.0 -p 80 -k yourpassword -m rc4-md5 &" > /var/log/ss
看看日志,这下绑定80端口成功了。
最后再优化一下相应的iptables设置,禁止SS访问本地内网。
iptables -N SHADOWSOCKS
iptables -t filter -A SHADOWSOCKS -d 127.0.0.0/8 -j REJECT
iptables -t filter -A SHADOWSOCKS -d 169.254.0.0/16 -j REJECT
iptables -t filter -A SHADOWSOCKS -d 172.16.0.0/12 -j REJECT
iptables -t filter -A SHADOWSOCKS -d 192.168.0.0/16 -j REJECT
iptables -t filter -A SHADOWSOCKS -d 10.168.0.0/24 -j REJECT
iptables -t filter -A SHADOWSOCKS -d 0.0.0.0/0 -j ACCEPT