Ecoer Logo

@ryyan

25

Cloud Native 工程师,不务正业,随心所欲

steemit.com/@ryyan
VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS0.00%
Net Worth
0.048USD
STEEM
0.001STEEM
SBD
0.023SBD
Effective Power
5.007SP
├── Own SP
0.631SP
└── Incoming Deleg
+4.376SP

Detailed Balance

STEEM
balance
0.001STEEM
market_balance
0.000STEEM
savings_balance
0.000STEEM
reward_steem_balance
0.000STEEM
STEEM POWER
Own SP
0.631SP
Delegated Out
0.000SP
Delegation In
4.376SP
Effective Power
5.007SP
Reward SP (pending)
0.019SP
SBD
sbd_balance
0.000SBD
sbd_conversions
0.000SBD
sbd_market_balance
0.000SBD
savings_sbd_balance
0.000SBD
reward_sbd_balance
0.023SBD
{
  "balance": "0.001 STEEM",
  "savings_balance": "0.000 STEEM",
  "reward_steem_balance": "0.000 STEEM",
  "vesting_shares": "1026.324998 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "7117.334808 VESTS",
  "sbd_balance": "0.000 SBD",
  "savings_sbd_balance": "0.000 SBD",
  "reward_sbd_balance": "0.023 SBD",
  "conversions": []
}

Account Info

nameryyan
id466138
rank1,442,771
reputation385616131
created2017-11-28T06:56:06
recovery_accountsteem
proxyNone
post_count5
comment_count0
lifetime_vote_count0
witnesses_voted_for0
last_post2018-06-20T18:07:00
last_root_post2018-06-20T18:07:00
last_vote_time2017-11-28T15:15:36
proxied_vsf_votes0, 0, 0, 0
can_vote1
voting_power0
delayed_votes0
balance0.001 STEEM
savings_balance0.000 STEEM
sbd_balance0.000 SBD
savings_sbd_balance0.000 SBD
vesting_shares1026.324998 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares7117.334808 VESTS
reward_vesting_balance38.986582 VESTS
vesting_balance0.000 STEEM
vesting_withdraw_rate0.000000 VESTS
next_vesting_withdrawal1969-12-31T23:59:59
withdrawn0
to_withdraw0
withdraw_routes0
savings_withdraw_requests0
last_account_recovery1970-01-01T00:00:00
reset_accountnull
last_owner_update1970-01-01T00:00:00
last_account_update2018-05-05T09:22:03
minedNo
sbd_seconds0
sbd_last_interest_payment1970-01-01T00:00:00
savings_sbd_last_interest_payment1970-01-01T00:00:00
{
  "active": {
    "account_auths": [],
    "key_auths": [
      [
        "STM69uY3bSmDgGkZfkSVRHMSMpgGf5QADgLCDsZgJ2kfpHdBD4jhx",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "balance": "0.001 STEEM",
  "can_vote": true,
  "comment_count": 0,
  "created": "2017-11-28T06:56:06",
  "curation_rewards": 0,
  "delegated_vesting_shares": "0.000000 VESTS",
  "downvote_manabar": {
    "current_mana": 2035914951,
    "last_update_time": 1779083958
  },
  "guest_bloggers": [],
  "id": 466138,
  "json_metadata": "{\"profile\":{\"name\":\"Ryan\",\"about\":\"Cloud Native 工程师,不务正业,随心所欲\",\"profile_image\":\"http://o7z41ciog.bkt.clouddn.com/05ba932c.jpg\"}}",
  "last_account_recovery": "1970-01-01T00:00:00",
  "last_account_update": "2018-05-05T09:22:03",
  "last_owner_update": "1970-01-01T00:00:00",
  "last_post": "2018-06-20T18:07:00",
  "last_root_post": "2018-06-20T18:07:00",
  "last_vote_time": "2017-11-28T15:15:36",
  "lifetime_vote_count": 0,
  "market_history": [],
  "memo_key": "STM824xHURUciC4qWdkset97fQnueFnD8Qx1VcUAqkJmtFzzp4hzo",
  "mined": false,
  "name": "ryyan",
  "next_vesting_withdrawal": "1969-12-31T23:59:59",
  "other_history": [],
  "owner": {
    "account_auths": [],
    "key_auths": [
      [
        "STM77jM1ratqyqQ8C4RmKiaYzkLM5SdAEuo8TJsuMugJU184oNksc",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "pending_claimed_accounts": 0,
  "post_bandwidth": 0,
  "post_count": 5,
  "post_history": [],
  "posting": {
    "account_auths": [
      [
        "dtubeviewer",
        1
      ]
    ],
    "key_auths": [
      [
        "STM7imbdXM2ZffH4qQ7neDoDNXsENzHkqijAviPwnfepC7wQSKyYq",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "posting_json_metadata": "{\"profile\":{\"name\":\"Ryan\",\"about\":\"Cloud Native 工程师,不务正业,随心所欲\",\"profile_image\":\"http://o7z41ciog.bkt.clouddn.com/05ba932c.jpg\"}}",
  "posting_rewards": 38,
  "proxied_vsf_votes": [
    0,
    0,
    0,
    0
  ],
  "proxy": "",
  "received_vesting_shares": "7117.334808 VESTS",
  "recovery_account": "steem",
  "reputation": 385616131,
  "reset_account": "null",
  "reward_sbd_balance": "0.023 SBD",
  "reward_steem_balance": "0.000 STEEM",
  "reward_vesting_balance": "38.986582 VESTS",
  "reward_vesting_steem": "0.019 STEEM",
  "savings_balance": "0.000 STEEM",
  "savings_sbd_balance": "0.000 SBD",
  "savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_sbd_seconds": "0",
  "savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
  "savings_withdraw_requests": 0,
  "sbd_balance": "0.000 SBD",
  "sbd_last_interest_payment": "1970-01-01T00:00:00",
  "sbd_seconds": "0",
  "sbd_seconds_last_update": "1970-01-01T00:00:00",
  "tags_usage": [],
  "to_withdraw": 0,
  "transfer_history": [],
  "vesting_balance": "0.000 STEEM",
  "vesting_shares": "1026.324998 VESTS",
  "vesting_withdraw_rate": "0.000000 VESTS",
  "vote_history": [],
  "voting_manabar": {
    "current_mana": "8143659806",
    "last_update_time": 1779083958
  },
  "voting_power": 0,
  "withdraw_routes": 0,
  "withdrawn": 0,
  "witness_votes": [],
  "witnesses_voted_for": 0,
  "rank": 1442771
}

Withdraw Routes

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
steemdelegated 4.376 SP to @ryyan
2026/05/18 05:59:18
delegateeryyan
delegatorsteem
vesting shares7117.334808 VESTS
Transaction InfoBlock #106150300/Trx f86aa9e39e1475af17299d34ad871217ecdc4822
View Raw JSON Data
{
  "block": 106150300,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "ryyan",
      "delegator": "steem",
      "vesting_shares": "7117.334808 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2026-05-18T05:59:18",
  "trx_id": "f86aa9e39e1475af17299d34ad871217ecdc4822",
  "trx_in_block": 1,
  "virtual_op": 0
}
steemdelegated 2.708 SP to @ryyan
2026/05/13 03:08:12
delegateeryyan
delegatorsteem
vesting shares4405.124403 VESTS
Transaction InfoBlock #106003601/Trx cb5f9c62b1211d0c7659a2adc9f48cef7f9d7910
View Raw JSON Data
{
  "block": 106003601,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "ryyan",
      "delegator": "steem",
      "vesting_shares": "4405.124403 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2026-05-13T03:08:12",
  "trx_id": "cb5f9c62b1211d0c7659a2adc9f48cef7f9d7910",
  "trx_in_block": 0,
  "virtual_op": 0
}
steemdelegated 4.383 SP to @ryyan
2026/04/26 05:11:27
delegateeryyan
delegatorsteem
vesting shares7129.850564 VESTS
Transaction InfoBlock #105517792/Trx b07f559221fa7ab1f0e36afe9f9818177430d84d
View Raw JSON Data
{
  "block": 105517792,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "ryyan",
      "delegator": "steem",
      "vesting_shares": "7129.850564 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2026-04-26T05:11:27",
  "trx_id": "b07f559221fa7ab1f0e36afe9f9818177430d84d",
  "trx_in_block": 0,
  "virtual_op": 0
}
steemdelegated 2.734 SP to @ryyan
2026/01/23 23:13:15
delegateeryyan
delegatorsteem
vesting shares4446.671222 VESTS
Transaction InfoBlock #102870283/Trx 9bc94214c3f580e44813e93ca1d4af530ca0ef1f
View Raw JSON Data
{
  "block": 102870283,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "ryyan",
      "delegator": "steem",
      "vesting_shares": "4446.671222 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2026-01-23T23:13:15",
  "trx_id": "9bc94214c3f580e44813e93ca1d4af530ca0ef1f",
  "trx_in_block": 2,
  "virtual_op": 0
}
steemdelegated 2.835 SP to @ryyan
2024/12/17 18:23:39
delegateeryyan
delegatorsteem
vesting shares4610.890419 VESTS
Transaction InfoBlock #91316503/Trx 93ee35acb891453ef2063117820ed3202176647f
View Raw JSON Data
{
  "block": 91316503,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "ryyan",
      "delegator": "steem",
      "vesting_shares": "4610.890419 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2024-12-17T18:23:39",
  "trx_id": "93ee35acb891453ef2063117820ed3202176647f",
  "trx_in_block": 4,
  "virtual_op": 0
}
steemdelegated 2.939 SP to @ryyan
2023/11/14 10:04:57
delegateeryyan
delegatorsteem
vesting shares4780.023951 VESTS
Transaction InfoBlock #79870657/Trx 659674512d307fa710e698cef311a17ad9a3f69d
View Raw JSON Data
{
  "block": 79870657,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "ryyan",
      "delegator": "steem",
      "vesting_shares": "4780.023951 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2023-11-14T10:04:57",
  "trx_id": "659674512d307fa710e698cef311a17ad9a3f69d",
  "trx_in_block": 8,
  "virtual_op": 0
}
steemdelegated 4.744 SP to @ryyan
2023/09/22 10:02:12
delegateeryyan
delegatorsteem
vesting shares7716.932737 VESTS
Transaction InfoBlock #78362440/Trx 39bacfcfa0c5a20035272f63ab00e89e57a65117
View Raw JSON Data
{
  "block": 78362440,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "ryyan",
      "delegator": "steem",
      "vesting_shares": "7716.932737 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2023-09-22T10:02:12",
  "trx_id": "39bacfcfa0c5a20035272f63ab00e89e57a65117",
  "trx_in_block": 6,
  "virtual_op": 0
}
steemdelegated 4.881 SP to @ryyan
2022/11/03 17:32:33
delegateeryyan
delegatorsteem
vesting shares7938.984175 VESTS
Transaction InfoBlock #69120235/Trx 7766f5eefdf965255c40b491429957e7286707ce
View Raw JSON Data
{
  "block": 69120235,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "ryyan",
      "delegator": "steem",
      "vesting_shares": "7938.984175 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2022-11-03T17:32:33",
  "trx_id": "7766f5eefdf965255c40b491429957e7286707ce",
  "trx_in_block": 0,
  "virtual_op": 0
}
steemdelegated 5.016 SP to @ryyan
2022/01/17 22:46:21
delegateeryyan
delegatorsteem
vesting shares8159.091776 VESTS
Transaction InfoBlock #60823521/Trx 5fafbd433baf3647c90ab5db0ce4bcbbec9183f9
View Raw JSON Data
{
  "block": 60823521,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "ryyan",
      "delegator": "steem",
      "vesting_shares": "8159.091776 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2022-01-17T22:46:21",
  "trx_id": "5fafbd433baf3647c90ab5db0ce4bcbbec9183f9",
  "trx_in_block": 52,
  "virtual_op": 0
}
steemdelegated 5.129 SP to @ryyan
2021/06/14 05:58:06
delegateeryyan
delegatorsteem
vesting shares8343.286064 VESTS
Transaction InfoBlock #54613865/Trx 68929a92b0df5664ae2c4c601b13d67e44ba36f3
View Raw JSON Data
{
  "block": 54613865,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "ryyan",
      "delegator": "steem",
      "vesting_shares": "8343.286064 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2021-06-14T05:58:06",
  "trx_id": "68929a92b0df5664ae2c4c601b13d67e44ba36f3",
  "trx_in_block": 3,
  "virtual_op": 0
}
steemdelegated 5.245 SP to @ryyan
2020/12/11 16:10:48
delegateeryyan
delegatorsteem
vesting shares8530.708038 VESTS
Transaction InfoBlock #49361139/Trx 8df220a0ce23d2e74be2c32a62178788b40cc3b0
View Raw JSON Data
{
  "block": 49361139,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "ryyan",
      "delegator": "steem",
      "vesting_shares": "8530.708038 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-12-11T16:10:48",
  "trx_id": "8df220a0ce23d2e74be2c32a62178788b40cc3b0",
  "trx_in_block": 2,
  "virtual_op": 0
}
steemdelegated 1.176 SP to @ryyan
2020/12/06 09:46:33
delegateeryyan
delegatorsteem
vesting shares1912.543513 VESTS
Transaction InfoBlock #49212664/Trx 913de798b1ada1c541e372147d17d801e43635b4
View Raw JSON Data
{
  "block": 49212664,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "ryyan",
      "delegator": "steem",
      "vesting_shares": "1912.543513 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-12-06T09:46:33",
  "trx_id": "913de798b1ada1c541e372147d17d801e43635b4",
  "trx_in_block": 0,
  "virtual_op": 0
}
steemdelegated 5.248 SP to @ryyan
2020/12/05 19:48:36
delegateeryyan
delegatorsteem
vesting shares8536.915892 VESTS
Transaction InfoBlock #49196222/Trx 87f050ca221bff87eb38f8ed58894d261973b07c
View Raw JSON Data
{
  "block": 49196222,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "ryyan",
      "delegator": "steem",
      "vesting_shares": "8536.915892 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-12-05T19:48:36",
  "trx_id": "87f050ca221bff87eb38f8ed58894d261973b07c",
  "trx_in_block": 2,
  "virtual_op": 0
}
steemdelegated 1.180 SP to @ryyan
2020/11/03 02:09:18
delegateeryyan
delegatorsteem
vesting shares1920.017158 VESTS
Transaction InfoBlock #48270183/Trx 2df39d2df6bd9dc85759be39a62e81945a5fffb8
View Raw JSON Data
{
  "block": 48270183,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "ryyan",
      "delegator": "steem",
      "vesting_shares": "1920.017158 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-11-03T02:09:18",
  "trx_id": "2df39d2df6bd9dc85759be39a62e81945a5fffb8",
  "trx_in_block": 0,
  "virtual_op": 0
}
steemdelegated 5.373 SP to @ryyan
2020/05/09 10:49:21
delegateeryyan
delegatorsteem
vesting shares8739.721251 VESTS
Transaction InfoBlock #43222986/Trx 46768a446e62380c19137a50b6a4865cd6e9dd1f
View Raw JSON Data
{
  "block": 43222986,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "ryyan",
      "delegator": "steem",
      "vesting_shares": "8739.721251 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-05-09T10:49:21",
  "trx_id": "46768a446e62380c19137a50b6a4865cd6e9dd1f",
  "trx_in_block": 4,
  "virtual_op": 0
}
steemdelegated 1.201 SP to @ryyan
2020/05/08 15:11:15
delegateeryyan
delegatorsteem
vesting shares1953.311140 VESTS
Transaction InfoBlock #43199985/Trx e6fa10d2ec9e9f96cfd8c47b487ccef4bfcb132c
View Raw JSON Data
{
  "block": 43199985,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "ryyan",
      "delegator": "steem",
      "vesting_shares": "1953.311140 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-05-08T15:11:15",
  "trx_id": "e6fa10d2ec9e9f96cfd8c47b487ccef4bfcb132c",
  "trx_in_block": 33,
  "virtual_op": 0
}
2019/11/28 07:16:45
authorsteemitboard
bodyCongratulations @ryyan! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@ryyan/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table> <sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@ryyan) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=ryyan)_</sub> ###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
parent authorryyan
parent permlinkxme97laz
permlinksteemitboard-notify-ryyan-20191128t071645000z
title
Transaction InfoBlock #38563637/Trx 9a687562f3225190b9c25bb436e1025ff3f540da
View Raw JSON Data
{
  "block": 38563637,
  "op": [
    "comment",
    {
      "author": "steemitboard",
      "body": "Congratulations @ryyan! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@ryyan/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table>\n\n<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@ryyan) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=ryyan)_</sub>\n\n\n###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}",
      "parent_author": "ryyan",
      "parent_permlink": "xme97laz",
      "permlink": "steemitboard-notify-ryyan-20191128t071645000z",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2019-11-28T07:16:45",
  "trx_id": "9a687562f3225190b9c25bb436e1025ff3f540da",
  "trx_in_block": 7,
  "virtual_op": 0
}
steemdelegated 5.460 SP to @ryyan
2019/09/03 15:39:21
delegateeryyan
delegatorsteem
vesting shares8881.177427 VESTS
Transaction InfoBlock #36102519/Trx b44a440d26e9e0cd41ebb28100e86640d616912a
View Raw JSON Data
{
  "block": 36102519,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "ryyan",
      "delegator": "steem",
      "vesting_shares": "8881.177427 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2019-09-03T15:39:21",
  "trx_id": "b44a440d26e9e0cd41ebb28100e86640d616912a",
  "trx_in_block": 0,
  "virtual_op": 0
}
dtubesent 0.001 STEEM to @ryyan- "Time is running out, claim your DTube account now before anyone else can! Login at https://d.tube"
2019/08/22 16:23:03
amount0.001 STEEM
fromdtube
memoTime is running out, claim your DTube account now before anyone else can! Login at https://d.tube
toryyan
Transaction InfoBlock #35779670/Trx 4d81eea8d9b87002b9c50285a083eb54ba2e5293
View Raw JSON Data
{
  "block": 35779670,
  "op": [
    "transfer",
    {
      "amount": "0.001 STEEM",
      "from": "dtube",
      "memo": "Time is running out, claim your DTube account now before anyone else can! Login at https://d.tube",
      "to": "ryyan"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2019-08-22T16:23:03",
  "trx_id": "4d81eea8d9b87002b9c50285a083eb54ba2e5293",
  "trx_in_block": 41,
  "virtual_op": 0
}
2018/11/28 08:07:51
authorsteemitboard
bodyCongratulations @ryyan! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@ryyan/birthday1.png</td><td>1 Year on Steemit</td></tr></table> <sub>_[Click here to view your Board of Honor](https://steemitboard.com/@ryyan)_</sub> > Support [SteemitBoard's project](https://steemit.com/@steemitboard)! **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
parent authorryyan
parent permlinkxme97laz
permlinksteemitboard-notify-ryyan-20181128t080750000z
title
Transaction InfoBlock #28090279/Trx 41505f0f2356d78014d4620264f2d6123d9725d5
View Raw JSON Data
{
  "block": 28090279,
  "op": [
    "comment",
    {
      "author": "steemitboard",
      "body": "Congratulations @ryyan! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@ryyan/birthday1.png</td><td>1 Year on Steemit</td></tr></table>\n\n<sub>_[Click here to view your Board of Honor](https://steemitboard.com/@ryyan)_</sub>\n\n\n> Support [SteemitBoard's project](https://steemit.com/@steemitboard)! **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}",
      "parent_author": "ryyan",
      "parent_permlink": "xme97laz",
      "permlink": "steemitboard-notify-ryyan-20181128t080750000z",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-11-28T08:07:51",
  "trx_id": "41505f0f2356d78014d4620264f2d6123d9725d5",
  "trx_in_block": 1,
  "virtual_op": 0
}
steemdelegated 5.582 SP to @ryyan
2018/09/22 01:35:36
delegateeryyan
delegatorsteem
vesting shares9079.399230 VESTS
Transaction InfoBlock #26154354/Trx c080aa568c9f8986ef009e3404d58fc914628458
View Raw JSON Data
{
  "block": 26154354,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "ryyan",
      "delegator": "steem",
      "vesting_shares": "9079.399230 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-09-22T01:35:36",
  "trx_id": "c080aa568c9f8986ef009e3404d58fc914628458",
  "trx_in_block": 5,
  "virtual_op": 0
}
steemdelegated 18.034 SP to @ryyan
2018/08/26 10:05:27
delegateeryyan
delegatorsteem
vesting shares29333.327726 VESTS
Transaction InfoBlock #25402884/Trx dfff496d8473f32329336a9cb6d382f2734250d0
View Raw JSON Data
{
  "block": 25402884,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "ryyan",
      "delegator": "steem",
      "vesting_shares": "29333.327726 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-08-26T10:05:27",
  "trx_id": "dfff496d8473f32329336a9cb6d382f2734250d0",
  "trx_in_block": 3,
  "virtual_op": 0
}
ryyanpublished a new post: xme97laz
2018/06/20 18:11:09
authorryyan
body<center><a href='https://d.tube/#!/v/ryyan/xme97laz'><img src='https://ipfs.io/ipfs/QmT6qbaLLkeogeM6GFt6aeUTQm4ypttu9cFRAv66oNMRQu'></a></center><hr> output <hr><a href='https://d.tube/#!/v/ryyan/xme97laz'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmcUZ2coui3Lu331UTA44ncmjz6xiTwUn7qTbJeJbu8cnj'> ▶️ IPFS</a>
json metadata{"video":{"info":{"title":"Westworld.S02E09","snaphash":"Qmaq9hbfZir9YUwgKKpqk8FdHLGcpUVSJY13tcvgtPmAj9","author":"ryyan","permlink":"xme97laz","duration":3550.774,"filesize":754118716,"spritehash":""},"content":{"videohash":"QmcUZ2coui3Lu331UTA44ncmjz6xiTwUn7qTbJeJbu8cnj","description":"Westworld.S02E09","tags":["movie","美剧","科幻"]}},"tags":["movie","美剧","科幻","dtube"],"app":"dtube/0.7"}
parent author
parent permlinkmovie
permlinkxme97laz
titleWestworld.S02E09
Transaction InfoBlock #23494133/Trx 870a844ed16f4fc4f82ed3b23f38204e32a8cfff
View Raw JSON Data
{
  "block": 23494133,
  "op": [
    "comment",
    {
      "author": "ryyan",
      "body": "<center><a href='https://d.tube/#!/v/ryyan/xme97laz'><img src='https://ipfs.io/ipfs/QmT6qbaLLkeogeM6GFt6aeUTQm4ypttu9cFRAv66oNMRQu'></a></center><hr>\n\noutput\n\n<hr><a href='https://d.tube/#!/v/ryyan/xme97laz'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmcUZ2coui3Lu331UTA44ncmjz6xiTwUn7qTbJeJbu8cnj'> ▶️ IPFS</a>",
      "json_metadata": "{\"video\":{\"info\":{\"title\":\"Westworld.S02E09\",\"snaphash\":\"Qmaq9hbfZir9YUwgKKpqk8FdHLGcpUVSJY13tcvgtPmAj9\",\"author\":\"ryyan\",\"permlink\":\"xme97laz\",\"duration\":3550.774,\"filesize\":754118716,\"spritehash\":\"\"},\"content\":{\"videohash\":\"QmcUZ2coui3Lu331UTA44ncmjz6xiTwUn7qTbJeJbu8cnj\",\"description\":\"Westworld.S02E09\",\"tags\":[\"movie\",\"美剧\",\"科幻\"]}},\"tags\":[\"movie\",\"美剧\",\"科幻\",\"dtube\"],\"app\":\"dtube/0.7\"}",
      "parent_author": "",
      "parent_permlink": "movie",
      "permlink": "xme97laz",
      "title": "Westworld.S02E09"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-20T18:11:09",
  "trx_id": "870a844ed16f4fc4f82ed3b23f38204e32a8cfff",
  "trx_in_block": 40,
  "virtual_op": 0
}
ryyanpublished a new post: xme97laz
2018/06/20 18:10:57
authorryyan
body<center><a href='https://d.tube/#!/v/ryyan/xme97laz'><img src='https://ipfs.io/ipfs/QmT6qbaLLkeogeM6GFt6aeUTQm4ypttu9cFRAv66oNMRQu'></a></center><hr> output <hr><a href='https://d.tube/#!/v/ryyan/xme97laz'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmcUZ2coui3Lu331UTA44ncmjz6xiTwUn7qTbJeJbu8cnj'> ▶️ IPFS</a>
json metadata{"video":{"info":{"title":"Westworld.S02E09","snaphash":"Qmaq9hbfZir9YUwgKKpqk8FdHLGcpUVSJY13tcvgtPmAj9","author":"ryyan","permlink":"xme97laz","duration":3550.774,"filesize":754118716,"spritehash":""},"content":{"videohash":"QmcUZ2coui3Lu331UTA44ncmjz6xiTwUn7qTbJeJbu8cnj","description":"Westworld.S02E09","tags":["movie","美剧"]}},"tags":["movie","美剧","dtube"],"app":"dtube/0.7"}
parent author
parent permlinkmovie
permlinkxme97laz
titleWestworld.S02E09
Transaction InfoBlock #23494129/Trx 52d10b3c7a4eba7abc9c51ebb0e97a48fa49ed16
View Raw JSON Data
{
  "block": 23494129,
  "op": [
    "comment",
    {
      "author": "ryyan",
      "body": "<center><a href='https://d.tube/#!/v/ryyan/xme97laz'><img src='https://ipfs.io/ipfs/QmT6qbaLLkeogeM6GFt6aeUTQm4ypttu9cFRAv66oNMRQu'></a></center><hr>\n\noutput\n\n<hr><a href='https://d.tube/#!/v/ryyan/xme97laz'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmcUZ2coui3Lu331UTA44ncmjz6xiTwUn7qTbJeJbu8cnj'> ▶️ IPFS</a>",
      "json_metadata": "{\"video\":{\"info\":{\"title\":\"Westworld.S02E09\",\"snaphash\":\"Qmaq9hbfZir9YUwgKKpqk8FdHLGcpUVSJY13tcvgtPmAj9\",\"author\":\"ryyan\",\"permlink\":\"xme97laz\",\"duration\":3550.774,\"filesize\":754118716,\"spritehash\":\"\"},\"content\":{\"videohash\":\"QmcUZ2coui3Lu331UTA44ncmjz6xiTwUn7qTbJeJbu8cnj\",\"description\":\"Westworld.S02E09\",\"tags\":[\"movie\",\"美剧\"]}},\"tags\":[\"movie\",\"美剧\",\"dtube\"],\"app\":\"dtube/0.7\"}",
      "parent_author": "",
      "parent_permlink": "movie",
      "permlink": "xme97laz",
      "title": "Westworld.S02E09"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-20T18:10:57",
  "trx_id": "52d10b3c7a4eba7abc9c51ebb0e97a48fa49ed16",
  "trx_in_block": 62,
  "virtual_op": 0
}
ryyanpublished a new post: xme97laz
2018/06/20 18:10:36
authorryyan
body<center><a href='https://d.tube/#!/v/ryyan/xme97laz'><img src='https://ipfs.io/ipfs/QmT6qbaLLkeogeM6GFt6aeUTQm4ypttu9cFRAv66oNMRQu'></a></center><hr> output <hr><a href='https://d.tube/#!/v/ryyan/xme97laz'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmcUZ2coui3Lu331UTA44ncmjz6xiTwUn7qTbJeJbu8cnj'> ▶️ IPFS</a>
json metadata{"video":{"info":{"title":"Westworld.S02E09","snaphash":"Qmaq9hbfZir9YUwgKKpqk8FdHLGcpUVSJY13tcvgtPmAj9","author":"ryyan","permlink":"xme97laz","duration":3550.774,"filesize":754118716,"spritehash":""},"content":{"videohash":"QmcUZ2coui3Lu331UTA44ncmjz6xiTwUn7qTbJeJbu8cnj","description":"Westworld.S02E09","tags":["movie"]}},"tags":["movie","dtube"],"app":"dtube/0.7"}
parent author
parent permlinkmovie
permlinkxme97laz
titleWestworld.S02E09
Transaction InfoBlock #23494122/Trx 72f8fef078b5617c3c74334f9612ce58b85a24d3
View Raw JSON Data
{
  "block": 23494122,
  "op": [
    "comment",
    {
      "author": "ryyan",
      "body": "<center><a href='https://d.tube/#!/v/ryyan/xme97laz'><img src='https://ipfs.io/ipfs/QmT6qbaLLkeogeM6GFt6aeUTQm4ypttu9cFRAv66oNMRQu'></a></center><hr>\n\noutput\n\n<hr><a href='https://d.tube/#!/v/ryyan/xme97laz'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmcUZ2coui3Lu331UTA44ncmjz6xiTwUn7qTbJeJbu8cnj'> ▶️ IPFS</a>",
      "json_metadata": "{\"video\":{\"info\":{\"title\":\"Westworld.S02E09\",\"snaphash\":\"Qmaq9hbfZir9YUwgKKpqk8FdHLGcpUVSJY13tcvgtPmAj9\",\"author\":\"ryyan\",\"permlink\":\"xme97laz\",\"duration\":3550.774,\"filesize\":754118716,\"spritehash\":\"\"},\"content\":{\"videohash\":\"QmcUZ2coui3Lu331UTA44ncmjz6xiTwUn7qTbJeJbu8cnj\",\"description\":\"Westworld.S02E09\",\"tags\":[\"movie\"]}},\"tags\":[\"movie\",\"dtube\"],\"app\":\"dtube/0.7\"}",
      "parent_author": "",
      "parent_permlink": "movie",
      "permlink": "xme97laz",
      "title": "Westworld.S02E09"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-20T18:10:36",
  "trx_id": "72f8fef078b5617c3c74334f9612ce58b85a24d3",
  "trx_in_block": 66,
  "virtual_op": 0
}
ryyanupdated options for xme97laz
2018/06/20 18:07:00
allow curation rewardstrue
allow votestrue
authorryyan
extensions[[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]]
max accepted payout1000000.000 SBD
percent steem dollars10000
permlinkxme97laz
Transaction InfoBlock #23494050/Trx cf07dd04f9231fd4d4209df0ac8fbe469a0218d1
View Raw JSON Data
{
  "block": 23494050,
  "op": [
    "comment_options",
    {
      "allow_curation_rewards": true,
      "allow_votes": true,
      "author": "ryyan",
      "extensions": [
        [
          0,
          {
            "beneficiaries": [
              {
                "account": "dtube",
                "weight": 2500
              }
            ]
          }
        ]
      ],
      "max_accepted_payout": "1000000.000 SBD",
      "percent_steem_dollars": 10000,
      "permlink": "xme97laz"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-20T18:07:00",
  "trx_id": "cf07dd04f9231fd4d4209df0ac8fbe469a0218d1",
  "trx_in_block": 46,
  "virtual_op": 0
}
ryyanpublished a new post: xme97laz
2018/06/20 18:07:00
authorryyan
body<center><a href='https://d.tube/#!/v/ryyan/xme97laz'><img src='https://ipfs.io/ipfs/QmT6qbaLLkeogeM6GFt6aeUTQm4ypttu9cFRAv66oNMRQu'></a></center><hr> output <hr><a href='https://d.tube/#!/v/ryyan/xme97laz'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmcUZ2coui3Lu331UTA44ncmjz6xiTwUn7qTbJeJbu8cnj'> ▶️ IPFS</a>
json metadata{"video":{"info":{"title":"output","snaphash":"Qmaq9hbfZir9YUwgKKpqk8FdHLGcpUVSJY13tcvgtPmAj9","author":"ryyan","permlink":"xme97laz","duration":3550.774,"filesize":754118716,"spritehash":""},"content":{"videohash":"QmcUZ2coui3Lu331UTA44ncmjz6xiTwUn7qTbJeJbu8cnj","description":"output","tags":["movie"]}},"tags":["movie","dtube"],"app":"dtube/0.7"}
parent author
parent permlinkmovie
permlinkxme97laz
titleoutput
Transaction InfoBlock #23494050/Trx cf07dd04f9231fd4d4209df0ac8fbe469a0218d1
View Raw JSON Data
{
  "block": 23494050,
  "op": [
    "comment",
    {
      "author": "ryyan",
      "body": "<center><a href='https://d.tube/#!/v/ryyan/xme97laz'><img src='https://ipfs.io/ipfs/QmT6qbaLLkeogeM6GFt6aeUTQm4ypttu9cFRAv66oNMRQu'></a></center><hr>\n\noutput\n\n<hr><a href='https://d.tube/#!/v/ryyan/xme97laz'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmcUZ2coui3Lu331UTA44ncmjz6xiTwUn7qTbJeJbu8cnj'> ▶️ IPFS</a>",
      "json_metadata": "{\"video\":{\"info\":{\"title\":\"output\",\"snaphash\":\"Qmaq9hbfZir9YUwgKKpqk8FdHLGcpUVSJY13tcvgtPmAj9\",\"author\":\"ryyan\",\"permlink\":\"xme97laz\",\"duration\":3550.774,\"filesize\":754118716,\"spritehash\":\"\"},\"content\":{\"videohash\":\"QmcUZ2coui3Lu331UTA44ncmjz6xiTwUn7qTbJeJbu8cnj\",\"description\":\"output\",\"tags\":[\"movie\"]}},\"tags\":[\"movie\",\"dtube\"],\"app\":\"dtube/0.7\"}",
      "parent_author": "",
      "parent_permlink": "movie",
      "permlink": "xme97laz",
      "title": "output"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-20T18:07:00",
  "trx_id": "cf07dd04f9231fd4d4209df0ac8fbe469a0218d1",
  "trx_in_block": 46,
  "virtual_op": 0
}
ryyanupdated their account properties
2018/05/05 09:22:03
accountryyan
json metadata{"profile":{"name":"Ryan","about":"Cloud Native 工程师,不务正业,随心所欲","profile_image":"http://o7z41ciog.bkt.clouddn.com/05ba932c.jpg"}}
memo keySTM824xHURUciC4qWdkset97fQnueFnD8Qx1VcUAqkJmtFzzp4hzo
posting{"account_auths":[["dtubeviewer",1]],"key_auths":[["STM7imbdXM2ZffH4qQ7neDoDNXsENzHkqijAviPwnfepC7wQSKyYq",1]],"weight_threshold":1}
Transaction InfoBlock #22160003/Trx 493650e386536f8af3e3acf6c1b83a59c4611554
View Raw JSON Data
{
  "block": 22160003,
  "op": [
    "account_update",
    {
      "account": "ryyan",
      "json_metadata": "{\"profile\":{\"name\":\"Ryan\",\"about\":\"Cloud Native 工程师,不务正业,随心所欲\",\"profile_image\":\"http://o7z41ciog.bkt.clouddn.com/05ba932c.jpg\"}}",
      "memo_key": "STM824xHURUciC4qWdkset97fQnueFnD8Qx1VcUAqkJmtFzzp4hzo",
      "posting": {
        "account_auths": [
          [
            "dtubeviewer",
            1
          ]
        ],
        "key_auths": [
          [
            "STM7imbdXM2ZffH4qQ7neDoDNXsENzHkqijAviPwnfepC7wQSKyYq",
            1
          ]
        ],
        "weight_threshold": 1
      }
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-05T09:22:03",
  "trx_id": "493650e386536f8af3e3acf6c1b83a59c4611554",
  "trx_in_block": 10,
  "virtual_op": 0
}
ryyanupdated their account properties
2018/05/05 09:18:24
accountryyan
json metadata{"profile":{"name":"Ryan","about":"Cloud Native 工程师,不务正业,随心所欲","profile_image":"http://o7z41ciog.bkt.clouddn.com/05ba932c.jpg"}}
memo keySTM824xHURUciC4qWdkset97fQnueFnD8Qx1VcUAqkJmtFzzp4hzo
Transaction InfoBlock #22159930/Trx be107b509f84b8991b2bb737a6ed4a4c2fbd7ebc
View Raw JSON Data
{
  "block": 22159930,
  "op": [
    "account_update",
    {
      "account": "ryyan",
      "json_metadata": "{\"profile\":{\"name\":\"Ryan\",\"about\":\"Cloud Native 工程师,不务正业,随心所欲\",\"profile_image\":\"http://o7z41ciog.bkt.clouddn.com/05ba932c.jpg\"}}",
      "memo_key": "STM824xHURUciC4qWdkset97fQnueFnD8Qx1VcUAqkJmtFzzp4hzo"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-05T09:18:24",
  "trx_id": "be107b509f84b8991b2bb737a6ed4a4c2fbd7ebc",
  "trx_in_block": 6,
  "virtual_op": 0
}
2018/05/05 05:56:09
authorcheetah
bodyHi! I am a robot. I just upvoted you! I found similar content that readers might be interested in: https://www.yangcs.net/posts/lvs-persistent-connection/
json metadata
parent authorryyan
parent permlinklvs
permlinkcheetah-re-ryyanlvs
title
Transaction InfoBlock #22155887/Trx 4340af3981b415fb9c43fd8277382a21b3604cd7
View Raw JSON Data
{
  "block": 22155887,
  "op": [
    "comment",
    {
      "author": "cheetah",
      "body": "Hi! I am a robot. I just upvoted you! I found similar content that readers might be interested in:\nhttps://www.yangcs.net/posts/lvs-persistent-connection/",
      "json_metadata": "",
      "parent_author": "ryyan",
      "parent_permlink": "lvs",
      "permlink": "cheetah-re-ryyanlvs",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-05T05:56:09",
  "trx_id": "4340af3981b415fb9c43fd8277382a21b3604cd7",
  "trx_in_block": 12,
  "virtual_op": 0
}
cheetahupvoted (0.08%) @ryyan / lvs
2018/05/05 05:56:03
authorryyan
permlinklvs
votercheetah
weight8 (0.08%)
Transaction InfoBlock #22155885/Trx 67db809764ed1b72ec735026d96a1975edfad550
View Raw JSON Data
{
  "block": 22155885,
  "op": [
    "vote",
    {
      "author": "ryyan",
      "permlink": "lvs",
      "voter": "cheetah",
      "weight": 8
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-05T05:56:03",
  "trx_id": "67db809764ed1b72ec735026d96a1975edfad550",
  "trx_in_block": 41,
  "virtual_op": 0
}
ryyanpublished a new post: lvs
2018/05/05 05:55:39
authorryyan
body## <p id="h2">1. 前言</p> ---- 在实际生产环境中,往往需要根据业务应用场景来设置 <code>lvs</code> 的会话超时时间以及防 <code>session</code> 连接丢失的问题提,如在业务支付环节,如若 <code>session</code> 丢失会导致重复扣款问题,严重影响到安全性,本小节解将会讲到关于 <code>lvs</code> 持久性连接问题。 ### 为什么用到持久连接? 在 Web 服务通信中,当用户在一个网站浏览了A网页并跳转到B网页,此时服务器就认为B网页是一个新的用户请求,你之前的登陆的信息就都丢失了。 为了记录用户的会话信息,我们的开发者就在客户端/服务器端软件提供了 `cookie/session` 机制,当你访问网站时,服务器端建立一个 session 会话区,并建立一个 cookie 与这个 session 绑定,将信息发送给你的浏览器。 这样,只要你的 cookie 存在,服务器端的 session 存在,那么当你打开新页面的时候,服务器依然会认识你。 **在做了负载均衡的时候,上面的机制就出现了问题。假设有以下场景:** <p id="div-border-top-red">某电商网站为了实现更多用户的访问,提供了A、B两台服务器,并在前面做了 LVS 负载均衡。于是某用户打开了该购物网站,选中了一件衣服,并加入了购物车(此时背后的操作是:LVS 负载均衡器接受了用户请求,并将其分发到了选中的服务器,并将用户添加了一件衣服记录到这个会话的 session 中)。这时当用户打开了第二个网页,又选中了一件帽子并加入购物车(此时背后的操作是:LVS 负载均衡器接受了用户请求,进行计算,将其发送到选中的服务器上,该服务器将用户添加了一件帽子记录到 session 中)。<br /><br />由于 LVS 是一个四层负载均衡器,仅能根据 <code>IP:Port</code> 对数据报文进行分发,不能确保将同一用户根据 session 发往同一个服务器,也就是用户第一次被分配到了A服务器,而第二次可能分配到了B服务器,但是B服务器并没有A服务器用户的 session 记录,直接导致这个例子里的用户发现自己的购物车没有了之前的衣服,而仅有帽子。这是不可接受的。</p> 为了避免上面的问题,一般站点会有两种方法解决该问题: 1. 将来自于同一个用户的请求发往同一个服务器<br /> 2. 将 session 信息在服务器集群内共享,每个服务器都保存整个集群的 session 信息<br /> 3. 建立一个 session 存储池,所有 session 信息都保存到存储池中 <br /> 当然通过 session 共享解决是比较完美的,但实现起来相对复杂: + 一需要额外增加服务器设备 + 二需要代码改动,在用户操作前,需要先获取该用户的session信息 总结下来,第一种方法是最简单的。 ### hash算法与持久连接 LVS 的八种轮询算法中有(Source Hashing)源地址 hash,它和持久连接的作用都是将来自同一个IP的请求都转发到同一个 Server,从而保证了 session 会话定位的问题。两者的不同是: #### Source Hashing 算法 该算法在内核中会自动维护一个哈希表,此哈希表中用每一个请求的源IP地址经过哈希计算得出的值作为键,把请求所到达的 RS 的地址作为值。 在后面的请求中,每一个请求会先经过此哈希表,如果请求在此哈希表中有键值,那么直接定向至特定 RS,如没有,则会新生成一个键值,以便后续请求的定向。 但是此种方法在时间的记录上比较模糊(依据TCP的连接时长计算)。而且通过 hash 算法无法公平均担后端 real server 的请求,即不能与 rr 等算法同时使用。 #### 持久连接 此种方法实现了无论使用哪一种调度方法,持久连接功能都能保证在指定时间范围之内,来自于同一个IP的请求将始终被定向至同一个 RS,还可以把多种服务绑定后统一进行调度。 在 director 内有一个 LVS 持久连接模板,模板中记录了每一个请求的来源、调度至的 RS、维护时长等等,所以,在新的请求进入时,首先在此模板中检查是否有记录(有内置的时间限制,比如限制是300秒,当在到达300秒时依然有用户访问,那么持久连接模板就会将时间增加两分钟,再计数,依次类推,每次只延长2分钟),如果该记录未超时,则使用该记录所指向的 RS,如果是超时记录或者是新请求,则会根据调度算法先调度至特定 RS,再将调度的记录添加至此表中。 这并不与 SH 算法冲突,lvs 持久连接会在新请求达到时,检查后端 RS 的负载状况,这就是比较精细的调度和会话保持方法。 ## <p id="h2">2. lvs 的持久性连接有两方面</p> ---- **1、把同一个 `client` 的请求信息记录到 lvs 的 `hash` 表里,保存时间使用 `persistence_timeout` 控制,单位为秒。** `persistence_granularity` 参数是配合 `persistence_timeout` 的,在某些情况特别有用。他的值是子网掩码,表示持久连接的粒度,默认是 `255.255.255.255`,也就是单独的 client ip,如果改成 `255.255.255.0`,和 client ip 在同一个网段的都会被分配到同一个 `real server`。 **2、一个连接创建后空闲时的超时时间,这个时间为3种。** + **tcp:** tcp的空闲超时时间 + **tcpfin:** lvs收到客户端tcp fin的超时时间 + **udp:** udp的超时时间 ## <p id="h2">3. lvs 相关超时时间查看</p> ---- 通过 `ipvsadm -Ln` 可以查看 persistence_timeout 超时时间(默认超时时间 360s) ```bash $ ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.254.66.97:8080 rr persistent 10800 -> 172.20.104.7:8080 Masq 1 0 0 -> 172.20.135.6:8080 Masq 1 0 0 -> 172.20.135.7:8080 Masq 1 0 0 ``` 通过 `ipvsadm -Ln --timeout` 可以查看 `tcp tcpfin udp` 的超时时间(默认: 900 120 300) ```bash $ ipvsadm -Ln --timeout Timeout (tcp tcpfin udp): 900 120 300 ``` ## <p id="h2">4. lvs 如何控制这些超时时间工作</p> ---- ```bash $ ipvsadm -Lnc IPVS connection entries pro expire state source virtual destination TCP 01:54 TIME_WAIT 192.168.123.248:35672 10.254.66.97:8080 172.20.135.6:8080 TCP 180:03 NONE 192.168.123.248:0 10.254.66.97:8080 172.20.135.6:8080 ``` + 当一个 client 访问 vip 的时候,这时 ipvs 就会记录一条状态为 `NONE` 的信息,如述上所示,`expire` 初始值为 `persistence_timeout` 的值,然后根据时钟主键变小,在以下记录存在期间,同一 client ip 连接上来,都会被分配到同一个后端。 + `TIME_WAIT` 的值就是 tcp tcpfin udp 中的 `tcpfin` 的超时时间,当 `NONE` 的值为0时,如果 TIME_WAIT 还存在,那么 NONE 的值会从新变成 `persistence_timeout` 的值,再减少,直到 TIME_WAIT 消失以后,NONE 才会消失,只要 NONE 存在,同一 client 的访问,都会分配到统一 real server。 ## <p id="h2">5. lvs 关于相关超时时间的设置</p> ---- `persistence_timeout` 可以通过 `ipvsadm -p timeout` 来设置,默认 360 秒。 ```bash $ ipvsadm -A -t 192.168.20.154:80 -s rr -p 60 ``` <p id="div-border-top-purple">上面命令中红色标记的 80 端口,表示如果是同一客户端访问服务器的 80 端口,会被定义到同一个 real server,如果把 80 端口改为 <code>0</code>,那么同一客户端访问服务器的任何服务都会被转发到同一个 real server。</p> `tcp tcpfin udp` 可以通过 `ipvsadm --set 对应超时时间` 来设置。 ```bash $ ipvsadm --set tcp tcpfin udp ``` <div id="note"> <p id="note-title">Note</p> <br /> <p><code>tcpfin</code> 的值最好小于 <code>persistence_timeout</code> 的值,这样比较方便计算,也有利于 <code>tcpfin</code> 回收</p> </div> ## <p id="h2">6. 持久连接定义与原理</p> ---- ### 定义 > 持久连接是指无论使用什么算法,LVS 持久都能实现在一定时间内,将来自同一个客户端请求派发至此前选定的 `RS`。 ### 原理 当使用 LVS 持久性的时候,Director 在内部使用一个连接根据记录称之为 `持久连接模板` 来确保所有来自同一个客户端的请求被分发到同一台 `Real Server` 上。 <div id="note"> <p id="note-title">Note</p> <br /> <p>持久连接模板是指每一个客户端及分配给它的 <code>RS</code> 的映射关系。</p> </div> ### 持久连接分类 **1、 持久端口连接,简称 PPC(Persistent Port Connections)**:将来自于同一个客户端对同一个集群某个服务的请求,始终定向至此前选定的 `RS` **例如:**`client---->LVS(80)---->RS1 或 client---->LVS(23)---->RS2`<br /> **缺陷:**期望访问不同的端口到同一台 `RS` 上,无法实现。 配置: ```bash $ ipvsadm -A -t 172.16.100.1:80 -s rr -p 3600 $ ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.10 -g -w 2 $ ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.11 -g -w 2 ``` **2、持久客户端连接,简称 PCC(Persistent Client Connections):**将来自于同一个客户端对所有端口的请求,始终定向至此前选定的 `RS` **说明:**`PCC` 是一个虚拟服务没有端口号(或者端口号为 0),以 `-p` 来标识服务。<br /> **缺陷:**定向所有服务,期望访问不同的 Real Server 无法实现。 配置: ```bash $ ipvsadm -A -t 172.16.100.1:0 -s rr -p 3600 $ ipvsadm -a -t 172.16.100.1:0 -r 172.16.100.10 -g -w 2 $ ipvsadm -a -t 172.16.100.1:0 -r 172.16.100.11 -g -w 2 ``` **3、基于防火墙设置端口绑定的持久连接,简称 PNMPP(Persistent Netfilter Marked Packet Persistence):**例如后台 real server 同时提供 `80` 和 `443` 端口的服务,并且两个服务之间有联系,这时就要用到 PNMPC 先对某一特定类型的数据包打上标记,然后再将基于某一类标记的服务送到后台的 `Real Server` 上去,后台的 Real Server 并不识别这些标记。将`持久连接`和`防火墙标记`结合起来就能够实现端口姻亲功能,只要是来自某一客户端的对某一特定服务(需要不同的端口)的访问都定义到同一台 Real Server 上去。 **案例:**一个用户在访问购物网站时同时使用 `HTTP(80)`和 `HTTPS(443)`两种协议,我们需要将其定义到同一台 Real Server 上,而其他的服务不受限制。 配置: ```bash $ iptables -t mangle -A PREROUTING -d 172.16.100.1 -i eth0 -p tcp --dport 80 -j MARK --set-mark 8 $ iptables -t mangle -A PREROUTING -d 172.16.100.1 -i eth0 -p tcp --dport 443 -j MARK --set-mark 8 $ ipvsadm -A -f 8 -s rr -p 600 $ ipvsadm -a -f 8 -r 172.16.100.10 -g -w 2 $ ipvsadm -a -f 8 -r 172.16.100.11 -g -w 1 ``` ## <p id="h2">7. 总结</p> ---- 如何设置 `lvs` 持久性连接需要根据业务场景来选择,比如电商平台,对应的持久性连接应该是 `PNMPP`,另外还需要根据连接类型,比如长连接和短连接,来设置相关超时时间,总之,根据应用场景来选择!
json metadata{"tags":["lvs"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinklvs
permlinklvs
titleLVS负载均衡之持久性连接介绍
Transaction InfoBlock #22155877/Trx 4c42b276a950751940c6c78cf350d653dfd748a3
View Raw JSON Data
{
  "block": 22155877,
  "op": [
    "comment",
    {
      "author": "ryyan",
      "body": "## <p id=\"h2\">1. 前言</p>\n\n----\n\n在实际生产环境中,往往需要根据业务应用场景来设置 <code>lvs</code> 的会话超时时间以及防 <code>session</code> 连接丢失的问题提,如在业务支付环节,如若 <code>session</code> 丢失会导致重复扣款问题,严重影响到安全性,本小节解将会讲到关于 <code>lvs</code> 持久性连接问题。\n\n### 为什么用到持久连接?\n\n在 Web 服务通信中,当用户在一个网站浏览了A网页并跳转到B网页,此时服务器就认为B网页是一个新的用户请求,你之前的登陆的信息就都丢失了。\n\n为了记录用户的会话信息,我们的开发者就在客户端/服务器端软件提供了 `cookie/session` 机制,当你访问网站时,服务器端建立一个 session 会话区,并建立一个 cookie 与这个 session 绑定,将信息发送给你的浏览器。\n\n这样,只要你的 cookie 存在,服务器端的 session 存在,那么当你打开新页面的时候,服务器依然会认识你。\n\n**在做了负载均衡的时候,上面的机制就出现了问题。假设有以下场景:**\n\n<p id=\"div-border-top-red\">某电商网站为了实现更多用户的访问,提供了A、B两台服务器,并在前面做了 LVS 负载均衡。于是某用户打开了该购物网站,选中了一件衣服,并加入了购物车(此时背后的操作是:LVS 负载均衡器接受了用户请求,并将其分发到了选中的服务器,并将用户添加了一件衣服记录到这个会话的 session 中)。这时当用户打开了第二个网页,又选中了一件帽子并加入购物车(此时背后的操作是:LVS 负载均衡器接受了用户请求,进行计算,将其发送到选中的服务器上,该服务器将用户添加了一件帽子记录到 session 中)。<br /><br />由于 LVS 是一个四层负载均衡器,仅能根据 <code>IP:Port</code> 对数据报文进行分发,不能确保将同一用户根据 session 发往同一个服务器,也就是用户第一次被分配到了A服务器,而第二次可能分配到了B服务器,但是B服务器并没有A服务器用户的 session 记录,直接导致这个例子里的用户发现自己的购物车没有了之前的衣服,而仅有帽子。这是不可接受的。</p>\n\n为了避免上面的问题,一般站点会有两种方法解决该问题:\n\n1. 将来自于同一个用户的请求发往同一个服务器<br />\n2. 将 session 信息在服务器集群内共享,每个服务器都保存整个集群的 session 信息<br />\n3. 建立一个 session 存储池,所有 session 信息都保存到存储池中\n\n<br />\n当然通过 session 共享解决是比较完美的,但实现起来相对复杂:\n\n+ 一需要额外增加服务器设备\n+ 二需要代码改动,在用户操作前,需要先获取该用户的session信息\n\n总结下来,第一种方法是最简单的。\n\n### hash算法与持久连接\n\nLVS 的八种轮询算法中有(Source Hashing)源地址 hash,它和持久连接的作用都是将来自同一个IP的请求都转发到同一个 Server,从而保证了 session 会话定位的问题。两者的不同是:\n\n#### Source Hashing 算法\n\n该算法在内核中会自动维护一个哈希表,此哈希表中用每一个请求的源IP地址经过哈希计算得出的值作为键,把请求所到达的 RS 的地址作为值。\n\n在后面的请求中,每一个请求会先经过此哈希表,如果请求在此哈希表中有键值,那么直接定向至特定 RS,如没有,则会新生成一个键值,以便后续请求的定向。\n\n但是此种方法在时间的记录上比较模糊(依据TCP的连接时长计算)。而且通过 hash 算法无法公平均担后端 real server 的请求,即不能与 rr 等算法同时使用。\n\n#### 持久连接\n\n此种方法实现了无论使用哪一种调度方法,持久连接功能都能保证在指定时间范围之内,来自于同一个IP的请求将始终被定向至同一个 RS,还可以把多种服务绑定后统一进行调度。\n\n在 director 内有一个 LVS 持久连接模板,模板中记录了每一个请求的来源、调度至的 RS、维护时长等等,所以,在新的请求进入时,首先在此模板中检查是否有记录(有内置的时间限制,比如限制是300秒,当在到达300秒时依然有用户访问,那么持久连接模板就会将时间增加两分钟,再计数,依次类推,每次只延长2分钟),如果该记录未超时,则使用该记录所指向的 RS,如果是超时记录或者是新请求,则会根据调度算法先调度至特定 RS,再将调度的记录添加至此表中。\n\n这并不与 SH 算法冲突,lvs 持久连接会在新请求达到时,检查后端 RS 的负载状况,这就是比较精细的调度和会话保持方法。\n\n## <p id=\"h2\">2. lvs 的持久性连接有两方面</p>\n\n----\n\n**1、把同一个 `client` 的请求信息记录到 lvs 的 `hash` 表里,保存时间使用 `persistence_timeout` 控制,单位为秒。**\n\n`persistence_granularity` 参数是配合 `persistence_timeout` 的,在某些情况特别有用。他的值是子网掩码,表示持久连接的粒度,默认是 `255.255.255.255`,也就是单独的 client ip,如果改成 `255.255.255.0`,和 client ip 在同一个网段的都会被分配到同一个 `real server`。\n\n**2、一个连接创建后空闲时的超时时间,这个时间为3种。**\n\n+ **tcp:** tcp的空闲超时时间\n+ **tcpfin:** lvs收到客户端tcp fin的超时时间\n+ **udp:** udp的超时时间\n\n## <p id=\"h2\">3. lvs 相关超时时间查看</p>\n\n----\n\n通过 `ipvsadm -Ln` 可以查看 persistence_timeout 超时时间(默认超时时间 360s)\n\n```bash\n$ ipvsadm -Ln\n\nIP Virtual Server version 1.2.1 (size=4096)\nProt LocalAddress:Port Scheduler Flags\n  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn\nTCP  10.254.66.97:8080 rr persistent 10800\n  -> 172.20.104.7:8080            Masq    1      0          0\n  -> 172.20.135.6:8080            Masq    1      0          0\n  -> 172.20.135.7:8080            Masq    1      0          0\n```\n\n通过 `ipvsadm -Ln --timeout` 可以查看 `tcp tcpfin udp` 的超时时间(默认: 900 120 300)\n\n```bash\n$ ipvsadm -Ln --timeout\n\nTimeout (tcp tcpfin udp): 900 120 300\n```\n\n## <p id=\"h2\">4. lvs 如何控制这些超时时间工作</p>\n\n----\n\n```bash\n$ ipvsadm -Lnc\n\nIPVS connection entries\npro expire state       source             virtual            destination\nTCP 01:54  TIME_WAIT   192.168.123.248:35672 10.254.66.97:8080  172.20.135.6:8080\nTCP 180:03 NONE        192.168.123.248:0  10.254.66.97:8080  172.20.135.6:8080\n```\n\n+ 当一个 client 访问 vip 的时候,这时 ipvs 就会记录一条状态为 `NONE` 的信息,如述上所示,`expire` 初始值为 `persistence_timeout` 的值,然后根据时钟主键变小,在以下记录存在期间,同一 client ip 连接上来,都会被分配到同一个后端。\n\n+ `TIME_WAIT` 的值就是 tcp tcpfin udp 中的 `tcpfin` 的超时时间,当 `NONE` 的值为0时,如果 TIME_WAIT 还存在,那么 NONE 的值会从新变成 `persistence_timeout` 的值,再减少,直到 TIME_WAIT 消失以后,NONE 才会消失,只要 NONE 存在,同一 client 的访问,都会分配到统一 real server。\n\n## <p id=\"h2\">5. lvs 关于相关超时时间的设置</p>\n\n----\n\n`persistence_timeout` 可以通过 `ipvsadm -p timeout` 来设置,默认 360 秒。\n\n```bash\n$ ipvsadm -A -t 192.168.20.154:80 -s rr -p 60\n```\n\n\n<p id=\"div-border-top-purple\">上面命令中红色标记的 80 端口,表示如果是同一客户端访问服务器的 80 端口,会被定义到同一个 real server,如果把 80 端口改为 <code>0</code>,那么同一客户端访问服务器的任何服务都会被转发到同一个 real server。</p>\n\n`tcp tcpfin udp` 可以通过 `ipvsadm --set 对应超时时间` 来设置。\n\n```bash\n$ ipvsadm --set tcp tcpfin udp\n```\n\n<div id=\"note\">\n<p id=\"note-title\">Note</p>\n<br />\n<p><code>tcpfin</code> 的值最好小于 <code>persistence_timeout</code> 的值,这样比较方便计算,也有利于 <code>tcpfin</code> 回收</p>\n</div>\n\n## <p id=\"h2\">6. 持久连接定义与原理</p>\n\n----\n\n### 定义\n\n> 持久连接是指无论使用什么算法,LVS 持久都能实现在一定时间内,将来自同一个客户端请求派发至此前选定的 `RS`。\n\n### 原理\n\n当使用 LVS 持久性的时候,Director 在内部使用一个连接根据记录称之为 `持久连接模板` 来确保所有来自同一个客户端的请求被分发到同一台 `Real Server` 上。\n\n<div id=\"note\">\n<p id=\"note-title\">Note</p>\n<br />\n<p>持久连接模板是指每一个客户端及分配给它的 <code>RS</code> 的映射关系。</p>\n</div>\n\n### 持久连接分类\n\n**1、 持久端口连接,简称 PPC(Persistent Port Connections)**:将来自于同一个客户端对同一个集群某个服务的请求,始终定向至此前选定的 `RS`\n\n**例如:**`client---->LVS(80)---->RS1 或 client---->LVS(23)---->RS2`<br />\n**缺陷:**期望访问不同的端口到同一台 `RS` 上,无法实现。\n\n配置:\n\n```bash\n$ ipvsadm -A -t 172.16.100.1:80 -s rr -p 3600\n$ ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.10 -g -w 2\n$ ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.11 -g -w 2\n```\n\n**2、持久客户端连接,简称 PCC(Persistent Client Connections):**将来自于同一个客户端对所有端口的请求,始终定向至此前选定的 `RS`\n\n**说明:**`PCC` 是一个虚拟服务没有端口号(或者端口号为 0),以 `-p` 来标识服务。<br />\n**缺陷:**定向所有服务,期望访问不同的 Real Server 无法实现。\n\n配置:\n\n```bash\n$ ipvsadm -A -t 172.16.100.1:0 -s rr -p 3600\n$ ipvsadm -a -t 172.16.100.1:0 -r 172.16.100.10 -g -w 2\n$ ipvsadm -a -t 172.16.100.1:0 -r 172.16.100.11 -g -w 2\n```\n\n**3、基于防火墙设置端口绑定的持久连接,简称 PNMPP(Persistent Netfilter Marked Packet Persistence):**例如后台 real server 同时提供 `80` 和 `443` 端口的服务,并且两个服务之间有联系,这时就要用到 PNMPC\n\n先对某一特定类型的数据包打上标记,然后再将基于某一类标记的服务送到后台的 `Real Server` 上去,后台的 Real Server 并不识别这些标记。将`持久连接`和`防火墙标记`结合起来就能够实现端口姻亲功能,只要是来自某一客户端的对某一特定服务(需要不同的端口)的访问都定义到同一台 Real Server 上去。\n\n**案例:**一个用户在访问购物网站时同时使用 `HTTP(80)`和 `HTTPS(443)`两种协议,我们需要将其定义到同一台 Real Server 上,而其他的服务不受限制。\n\n配置:\n\n```bash\n$ iptables -t mangle -A PREROUTING -d 172.16.100.1 -i eth0 -p tcp --dport 80 -j MARK --set-mark 8\n$ iptables -t mangle -A PREROUTING -d 172.16.100.1 -i eth0 -p tcp --dport 443 -j MARK --set-mark 8\n$ ipvsadm -A -f 8 -s rr -p 600\n$ ipvsadm -a -f 8 -r 172.16.100.10 -g -w 2\n$ ipvsadm -a -f 8 -r 172.16.100.11 -g -w 1\n```\n\n## <p id=\"h2\">7. 总结</p>\n\n----\n\n如何设置 `lvs` 持久性连接需要根据业务场景来选择,比如电商平台,对应的持久性连接应该是 `PNMPP`,另外还需要根据连接类型,比如长连接和短连接,来设置相关超时时间,总之,根据应用场景来选择!",
      "json_metadata": "{\"tags\":[\"lvs\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "lvs",
      "permlink": "lvs",
      "title": "LVS负载均衡之持久性连接介绍"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-05T05:55:39",
  "trx_id": "4c42b276a950751940c6c78cf350d653dfd748a3",
  "trx_in_block": 39,
  "virtual_op": 0
}
ax3upvoted (1.00%) @ryyan / xt7ih0ok
2018/05/05 05:44:27
authorryyan
permlinkxt7ih0ok
voterax3
weight100 (1.00%)
Transaction InfoBlock #22155653/Trx 4cad97d56bb3563edcb26b5380483b3fcce4866d
View Raw JSON Data
{
  "block": 22155653,
  "op": [
    "vote",
    {
      "author": "ryyan",
      "permlink": "xt7ih0ok",
      "voter": "ax3",
      "weight": 100
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-05T05:44:27",
  "trx_id": "4cad97d56bb3563edcb26b5380483b3fcce4866d",
  "trx_in_block": 28,
  "virtual_op": 0
}
ryyanupdated options for xt7ih0ok
2018/05/05 05:44:18
allow curation rewardstrue
allow votestrue
authorryyan
extensions[[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]]
max accepted payout1000000.000 SBD
percent steem dollars10000
permlinkxt7ih0ok
Transaction InfoBlock #22155650/Trx 8f24436cbe05e0da04a01163a4999eeeed7f9ba2
View Raw JSON Data
{
  "block": 22155650,
  "op": [
    "comment_options",
    {
      "allow_curation_rewards": true,
      "allow_votes": true,
      "author": "ryyan",
      "extensions": [
        [
          0,
          {
            "beneficiaries": [
              {
                "account": "dtube",
                "weight": 2500
              }
            ]
          }
        ]
      ],
      "max_accepted_payout": "1000000.000 SBD",
      "percent_steem_dollars": 10000,
      "permlink": "xt7ih0ok"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-05T05:44:18",
  "trx_id": "8f24436cbe05e0da04a01163a4999eeeed7f9ba2",
  "trx_in_block": 3,
  "virtual_op": 0
}
ryyanpublished a new post: xt7ih0ok
2018/05/05 05:44:18
authorryyan
body<center><a href='https://d.tube/#!/v/ryyan/xt7ih0ok'><img src='https://ipfs.io/ipfs/QmbHXF2CUaGHsrd8cBf4D3VBuzHfami4Ey5oBk7qJeDkr4'></a></center><hr> 西部世界第二季第二集预告 <hr><a href='https://d.tube/#!/v/ryyan/xt7ih0ok'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmXjk3WJxSH3ceBzB9HCQ3sjD76ZjYAdzhuotkPfFJL47M'> ▶️ IPFS</a>
json metadata{"video":{"info":{"title":"Westworld 2x02 Promo \"Reunion\" (HD) This Season On","snaphash":"QmePK389mSe5zdggunwtRMFgSfJGV3wDyEZ69jBaZYLKR7","author":"ryyan","permlink":"xt7ih0ok","duration":62.857,"filesize":9727310,"spritehash":"QmWsTm3VFQycMDSz5NPRQ383VzWn2iNdNSMrxBkZXw3u5a"},"content":{"videohash":"QmXjk3WJxSH3ceBzB9HCQ3sjD76ZjYAdzhuotkPfFJL47M","description":"西部世界第二季第二集预告","tags":["westworld"],"video480hash":"QmXZ6zYhbmFBpvJ1cSUchpP4SVutVfLeDzFaopQiqpaEVe"}},"tags":["westworld","dtube"],"app":"dtube/0.7"}
parent author
parent permlinkwestworld
permlinkxt7ih0ok
titleWestworld 2x02 Promo "Reunion" (HD) This Season On
Transaction InfoBlock #22155650/Trx 8f24436cbe05e0da04a01163a4999eeeed7f9ba2
View Raw JSON Data
{
  "block": 22155650,
  "op": [
    "comment",
    {
      "author": "ryyan",
      "body": "<center><a href='https://d.tube/#!/v/ryyan/xt7ih0ok'><img src='https://ipfs.io/ipfs/QmbHXF2CUaGHsrd8cBf4D3VBuzHfami4Ey5oBk7qJeDkr4'></a></center><hr>\n\n西部世界第二季第二集预告\n\n<hr><a href='https://d.tube/#!/v/ryyan/xt7ih0ok'> ▶️ DTube</a><br /><a href='https://ipfs.io/ipfs/QmXjk3WJxSH3ceBzB9HCQ3sjD76ZjYAdzhuotkPfFJL47M'> ▶️ IPFS</a>",
      "json_metadata": "{\"video\":{\"info\":{\"title\":\"Westworld 2x02 Promo \\\"Reunion\\\" (HD) This Season On\",\"snaphash\":\"QmePK389mSe5zdggunwtRMFgSfJGV3wDyEZ69jBaZYLKR7\",\"author\":\"ryyan\",\"permlink\":\"xt7ih0ok\",\"duration\":62.857,\"filesize\":9727310,\"spritehash\":\"QmWsTm3VFQycMDSz5NPRQ383VzWn2iNdNSMrxBkZXw3u5a\"},\"content\":{\"videohash\":\"QmXjk3WJxSH3ceBzB9HCQ3sjD76ZjYAdzhuotkPfFJL47M\",\"description\":\"西部世界第二季第二集预告\",\"tags\":[\"westworld\"],\"video480hash\":\"QmXZ6zYhbmFBpvJ1cSUchpP4SVutVfLeDzFaopQiqpaEVe\"}},\"tags\":[\"westworld\",\"dtube\"],\"app\":\"dtube/0.7\"}",
      "parent_author": "",
      "parent_permlink": "westworld",
      "permlink": "xt7ih0ok",
      "title": "Westworld 2x02 Promo \"Reunion\" (HD) This Season On"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-05T05:44:18",
  "trx_id": "8f24436cbe05e0da04a01163a4999eeeed7f9ba2",
  "trx_in_block": 3,
  "virtual_op": 0
}
ryyanfollowed @dtube
2018/05/05 05:33:09
idfollow
json["follow",{"follower":"ryyan","following":"dtube","what":["blog"]}]
required auths[]
required posting auths["ryyan"]
Transaction InfoBlock #22155427/Trx 841e6b2cbd0e6d5a84249eb1cd142aa94cf2c7a9
View Raw JSON Data
{
  "block": 22155427,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"ryyan\",\"following\":\"dtube\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "ryyan"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-05-05T05:33:09",
  "trx_id": "841e6b2cbd0e6d5a84249eb1cd142aa94cf2c7a9",
  "trx_in_block": 35,
  "virtual_op": 0
}
steemdelegated 18.158 SP to @ryyan
2018/04/21 20:51:51
delegateeryyan
delegatorsteem
vesting shares29535.842950 VESTS
Transaction InfoBlock #21771325/Trx 41b0cbe2ca8e50adeb762cd4c880d3ef96957f63
View Raw JSON Data
{
  "block": 21771325,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "ryyan",
      "delegator": "steem",
      "vesting_shares": "29535.842950 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-04-21T20:51:51",
  "trx_id": "41b0cbe2ca8e50adeb762cd4c880d3ef96957f63",
  "trx_in_block": 30,
  "virtual_op": 0
}
steemdelegated 18.283 SP to @ryyan
2017/12/12 22:19:57
delegateeryyan
delegatorsteem
vesting shares29739.675002 VESTS
Transaction InfoBlock #18032582/Trx d107a2d9ab82012256d49034e4e47f22787e0ff2
View Raw JSON Data
{
  "block": 18032582,
  "op": [
    "delegate_vesting_shares",
    {
      "delegatee": "ryyan",
      "delegator": "steem",
      "vesting_shares": "29739.675002 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-12-12T22:19:57",
  "trx_id": "d107a2d9ab82012256d49034e4e47f22787e0ff2",
  "trx_in_block": 9,
  "virtual_op": 0
}
ryyanreceived 0.023 SBD, 0.024 SP author reward for @ryyan / linux
2017/12/05 07:25:48
authorryyan
permlinklinux
sbd payout0.023 SBD
steem payout0.000 STEEM
vesting payout38.986582 VESTS
Transaction InfoBlock #17813205/Virtual Operation #7
View Raw JSON Data
{
  "block": 17813205,
  "op": [
    "author_reward",
    {
      "author": "ryyan",
      "permlink": "linux",
      "sbd_payout": "0.023 SBD",
      "steem_payout": "0.000 STEEM",
      "vesting_payout": "38.986582 VESTS"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-12-05T07:25:48",
  "trx_id": "0000000000000000000000000000000000000000",
  "trx_in_block": 4294967295,
  "virtual_op": 7
}
2017/11/28 15:24:51
idfollow
json["follow",{"follower":"ryyan","following":"tumutanzi","what":["blog"]}]
required auths[]
required posting auths["ryyan"]
Transaction InfoBlock #17621265/Trx 5c7e9b31a50eefcbc29bf8e6866753827892c4eb
View Raw JSON Data
{
  "block": 17621265,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"ryyan\",\"following\":\"tumutanzi\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "ryyan"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T15:24:51",
  "trx_id": "5c7e9b31a50eefcbc29bf8e6866753827892c4eb",
  "trx_in_block": 5,
  "virtual_op": 0
}
ryyanfollowed @keepup
2017/11/28 15:18:48
idfollow
json["follow",{"follower":"ryyan","following":"keepup","what":["blog"]}]
required auths[]
required posting auths["ryyan"]
Transaction InfoBlock #17621144/Trx 564a76ce22d92eb6bf56417470ce132d51db041f
View Raw JSON Data
{
  "block": 17621144,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"ryyan\",\"following\":\"keepup\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "ryyan"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T15:18:48",
  "trx_id": "564a76ce22d92eb6bf56417470ce132d51db041f",
  "trx_in_block": 9,
  "virtual_op": 0
}
2017/11/28 15:15:36
authorcnbuddy
permlinkre-keepup-daily-021-sublime-20171125t162130462z
voterryyan
weight10000 (100.00%)
Transaction InfoBlock #17621080/Trx 95481ecd9fcc5393dca1273eaa45f2c3db2bab04
View Raw JSON Data
{
  "block": 17621080,
  "op": [
    "vote",
    {
      "author": "cnbuddy",
      "permlink": "re-keepup-daily-021-sublime-20171125t162130462z",
      "voter": "ryyan",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T15:15:36",
  "trx_id": "95481ecd9fcc5393dca1273eaa45f2c3db2bab04",
  "trx_in_block": 11,
  "virtual_op": 0
}
ryyanfollowed @birds90
2017/11/28 14:51:30
idfollow
json["follow",{"follower":"ryyan","following":"birds90","what":["blog"]}]
required auths[]
required posting auths["ryyan"]
Transaction InfoBlock #17620598/Trx 6e6f2fa3fbf951ace40d3045605bc8d55258972d
View Raw JSON Data
{
  "block": 17620598,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"ryyan\",\"following\":\"birds90\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "ryyan"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T14:51:30",
  "trx_id": "6e6f2fa3fbf951ace40d3045605bc8d55258972d",
  "trx_in_block": 30,
  "virtual_op": 0
}
ryyanfollowed @myfirst
2017/11/28 14:50:03
idfollow
json["follow",{"follower":"ryyan","following":"myfirst","what":["blog"]}]
required auths[]
required posting auths["ryyan"]
Transaction InfoBlock #17620569/Trx 9e0ed2eb33b510b357667307e09d66826dd08fc5
View Raw JSON Data
{
  "block": 17620569,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"ryyan\",\"following\":\"myfirst\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "ryyan"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T14:50:03",
  "trx_id": "9e0ed2eb33b510b357667307e09d66826dd08fc5",
  "trx_in_block": 18,
  "virtual_op": 0
}
2017/11/28 14:45:03
idfollow
json["follow",{"follower":"ryyan","following":"elfkitchen","what":["blog"]}]
required auths[]
required posting auths["ryyan"]
Transaction InfoBlock #17620469/Trx 821f17be07668ecbdec84d3c24f350935a65073f
View Raw JSON Data
{
  "block": 17620469,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"ryyan\",\"following\":\"elfkitchen\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "ryyan"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T14:45:03",
  "trx_id": "821f17be07668ecbdec84d3c24f350935a65073f",
  "trx_in_block": 7,
  "virtual_op": 0
}
2017/11/28 14:12:54
idfollow
json["follow",{"follower":"ryyan","following":"sweetsssj","what":["blog"]}]
required auths[]
required posting auths["ryyan"]
Transaction InfoBlock #17619827/Trx a5379f161fc5f9c24f3a987dbf5760262fe0be58
View Raw JSON Data
{
  "block": 17619827,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"ryyan\",\"following\":\"sweetsssj\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "ryyan"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T14:12:54",
  "trx_id": "a5379f161fc5f9c24f3a987dbf5760262fe0be58",
  "trx_in_block": 9,
  "virtual_op": 0
}
ryyanfollowed @deanliu
2017/11/28 14:05:24
idfollow
json["follow",{"follower":"ryyan","following":"deanliu","what":["blog"]}]
required auths[]
required posting auths["ryyan"]
Transaction InfoBlock #17619677/Trx ea2fb79bcbef98192861fc7c65879b0fc1f1a59e
View Raw JSON Data
{
  "block": 17619677,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"ryyan\",\"following\":\"deanliu\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "ryyan"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T14:05:24",
  "trx_id": "ea2fb79bcbef98192861fc7c65879b0fc1f1a59e",
  "trx_in_block": 8,
  "virtual_op": 0
}
ryyanfollowed @helene
2017/11/28 13:56:03
idfollow
json["follow",{"follower":"ryyan","following":"helene","what":["blog"]}]
required auths[]
required posting auths["ryyan"]
Transaction InfoBlock #17619490/Trx 773daffd13f1415b8033ebe18a09f13942f0389e
View Raw JSON Data
{
  "block": 17619490,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"ryyan\",\"following\":\"helene\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "ryyan"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T13:56:03",
  "trx_id": "773daffd13f1415b8033ebe18a09f13942f0389e",
  "trx_in_block": 6,
  "virtual_op": 0
}
benjmupvoted (3.00%) @ryyan / linux
2017/11/28 08:22:30
authorryyan
permlinklinux
voterbenjm
weight300 (3.00%)
Transaction InfoBlock #17612825/Trx e78ecaf4a4a18d9d8ff0adde2fe4f80e1135e93a
View Raw JSON Data
{
  "block": 17612825,
  "op": [
    "vote",
    {
      "author": "ryyan",
      "permlink": "linux",
      "voter": "benjm",
      "weight": 300
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T08:22:30",
  "trx_id": "e78ecaf4a4a18d9d8ff0adde2fe4f80e1135e93a",
  "trx_in_block": 6,
  "virtual_op": 0
}
2017/11/28 08:04:27
idfollow
json["follow",{"follower":"ryyan","following":"cheetah","what":["ignore"]}]
required auths[]
required posting auths["ryyan"]
Transaction InfoBlock #17612464/Trx c8d2e4f2a75d2ff7dd8dab7dc1f50aa7816dbd24
View Raw JSON Data
{
  "block": 17612464,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"ryyan\",\"following\":\"cheetah\",\"what\":[\"ignore\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "ryyan"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T08:04:27",
  "trx_id": "c8d2e4f2a75d2ff7dd8dab7dc1f50aa7816dbd24",
  "trx_in_block": 1,
  "virtual_op": 0
}
2017/11/28 08:04:18
authorcheetah
permlinkcheetah-re-ryyanlinux
voterryyan
weight10000 (100.00%)
Transaction InfoBlock #17612461/Trx 512099328ffa7756081eae092f74748d0985c6fd
View Raw JSON Data
{
  "block": 17612461,
  "op": [
    "vote",
    {
      "author": "cheetah",
      "permlink": "cheetah-re-ryyanlinux",
      "voter": "ryyan",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T08:04:18",
  "trx_id": "512099328ffa7756081eae092f74748d0985c6fd",
  "trx_in_block": 6,
  "virtual_op": 0
}
ryyanpublished a new post: linux
2017/11/28 07:59:57
authorryyan
body**本来我是决定不再写这样的文章了的。但是呢,最近连续配置了两次 `ArchLinux`,在配置这种东西的时候连续撞到了同样的坑,加上这段时间经常有人问我关于 `Linux` 下的 `shadowsocks` 的问题,所以我想了想还是写一篇记录一下吧,也免得自己以后再忘记了。** 这里有两种方案,都可以实现全局智能分流。第一种方案的思路是使用 `ipset` 载入 `chnroute` 的 `IP` 列表并使用 `iptables` 实现带自动分流国内外流量的全局代理。为什么不用 `PAC` 呢?因为 `PAC` 这种东西只对浏览器有用。难道你在浏览器之外就不需要科学上网了吗?反正我是不信的…… **本教程所用系统为 `Archlinux`,其他发型版类似,请自行参考相关资料。** ## 1. 通过 iptables 实现智能分流 ### 1.1 安装相关软件 * shadowsocks-libev * ipset ```bash $ pacman -S shadowsocks-libev ipset ``` ### 1.2 配置shadowsocks-libev(略过) 假设shadowsocks配置文件为/etc/shadowsocks.json ### 1.3 获取中国IP段 将以下命令写入脚本保存执行(假设保存在/home/yang/bin/路由表/目录下): ```bash #!/bin/sh wget -c http://ftp.apnic.net/stats/apnic/delegated-apnic-latest cat delegated-apnic-latest | awk -F '|' '/CN/&&/ipv4/ {print $4 "/" 32-log($5)/log(2)}' | cat > /home/yang/bin/路由表/cn_rules.conf ``` ### 1.4 创建启动和关闭脚本 ```bash $ vim /home/yang/bin/shadowsocks/ss-up.sh ``` ```bash #!/bin/bash SOCKS_SERVER=$SERVER_IP # SOCKS 服务器的 IP 地址 # Setup the ipset ipset -N chnroute hash:net maxelem 65536 for ip in $(cat '/home/yang/bin/路由表/cn_rules.conf'); do ipset add chnroute $ip done # 在nat表中新增一个链,名叫:SHADOWSOCKS iptables -t nat -N SHADOWSOCKS # Allow connection to the server iptables -t nat -A SHADOWSOCKS -d $SOCKS_SERVER -j RETURN # Allow connection to reserved networks iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN # Allow connection to chinese IPs iptables -t nat -A SHADOWSOCKS -p tcp -m set --match-set chnroute dst -j RETURN # 如果你想对 icmp 协议也实现智能分流,可以加上下面这一条 # iptables -t nat -A SHADOWSOCKS -p icmp -m set --match-set chnroute dst -j RETURN # Redirect to Shadowsocks # 把1081改成你的shadowsocks本地端口 iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-port 1081 # 如果你想对 icmp 协议也实现智能分流,可以加上下面这一条 # iptables -t nat -A SHADOWSOCKS -p icmp -j REDIRECT --to-port 1081 # 将SHADOWSOCKS链中所有的规则追加到OUTPUT链中 iptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS # 如果你想对 icmp 协议也实现智能分流,可以加上下面这一条 # iptables -t nat -A OUTPUT -p icmp -j SHADOWSOCKS ``` &emsp;&emsp;这是在启动 `shadowsocks` 之前执行的脚本,用来设置 `iptables` 规则,对全局应用代理并将 `chnroute` 导入 `ipset` 来实现自动分流。注意要把服务器 `IP` 和本地端口相关的代码全部替换成你自己的。 &emsp;&emsp;这里就有一个坑了,就是在把 `chnroute.txt` 加入 `ipset` 的时候。因为 `chnroute.txt` 是一个 `IP` 段列表,而中国持有的 `IP` 数量上还是比较大的,所以如果使用 `hash:ip` 来导入的话会使内存溢出。我在第二次重新配置的时候就撞进了这个大坑…… &emsp;&emsp;但是你也不能尝试把整个列表导入 `iptables`。虽然导入 `iptables` 不会导致内存溢出,但是 `iptables` 是线性查表,即使你全部导入进去,也会因为低下的性能而抓狂。 然后再创建 `/home/yang/bin/shadowsocks/ss-down.sh`, 这是用来清除上述规则的脚本,比较简单 ```bash #!/bin/bash # iptables -t nat -D OUTPUT -p icmp -j SHADOWSOCKS iptables -t nat -D OUTPUT -p tcp -j SHADOWSOCKS iptables -t nat -F SHADOWSOCKS iptables -t nat -X SHADOWSOCKS ipset destroy chnroute ``` 接着执行 ```bash $ chmod +x ss-up.sh $ chmod +x ss-down.sh ``` ### 1.5 配置ss-redir服务 首先,默认的 `ss-local` 并不能用来作为 `iptables` 流量转发的目标,因为它是 `socks5` 代理而非透明代理。我们至少要把 `systemd` 执行的程序改成 `ss-redir`。其次,上述两个脚本还不能自动执行,必须让 `systemd` 分别在启动 `shadowsocks` 之前和关闭之后将脚本执行,这样才能自动配置好 `iptables` 规则。 ```bash $ vim /usr/lib/systemd/system/[email protected] ``` ```bash [Unit] Description=Shadowsocks-Libev Client Service After=network.target [Service] User=root CapabilityBoundingSet=~CAP_SYS_ADMIN ExecStart= ExecStartPre=/home/yang/bin/shadowsocks/ss-up.sh ExecStart=/usr/bin/ss-redir -u -c /etc/%i.json ExecStopPost=/home/yang/bin/shadowsocks/ss-down.sh [Install] WantedBy=multi-user.target ``` 然后启动服务 ```bash $ systemctl start shadowsocks-libev@shadowsocks ``` 开机自启 ```bash $ systemctl enable shadowsocks-libev@shadowsocks ``` ### 1.6 配置智能 DNS 服务 完成了以上工作之后是不是就可以实现全局科学上网了呢?答案是否定的,我们还有最后一项工作需要完成,那就是解决 `DNS` 污染问题。如果你不知道什么是 `DNS` 污染,我可以简单地给你普及一下: > `DNS` 污染是一种让一般用户由于得到虚假目标主机 `IP` 而不能与其通信的方法,是一种 `DNS` 缓存投毒攻击(DNS cache poisoning)。其工作方式是:由于通常的 `DNS` 查询没有任何认证机制,而且 `DNS` 查询通常基于的 `UDP` 是无连接不可靠的协议,因此 `DNS` 的查询非常容易被篡改,通过对 `UDP` 端口 53 上的 `DNS` 查询进行入侵检测,一经发现与关键词相匹配的请求则立即伪装成目标域名的解析服务器(NS,Name Server)给查询者返回虚假结果。 `DNS` 污染症状:目前一些被禁止访问的网站很多就是通过 `DNS` 污染来实现的,例如 `YouTube`、`Facebook` 等网站。 **应对dns污染的方法** - 对于 `DNS` 污染,可以说,个人用户很难单单靠设置解决,通常可以使用 `VPN` 或者域名远程解析的方法解决,但这大多需要购买付费的 `VPN` 或 `SSH` 等 - 修改 `Hosts` 的方法,手动设置域名正确的 `IP` 地址 - `dns` 加密解析:[DNSCrypt](https://dnscrypt.org/) - 忽略 `DNS` 投毒污染小工具:[Pcap_DNSProxy](https://github.com/chengr28/Pcap_DNSProxy) 我们选择用 `Pcap_DNSProxy` 来解决这个问题,以前用的是 `Pdnsd + Dnsmasq` 组合, 后来发现 `TCP` 请求效率太低加上家里网络与那些国外的 `DNS` 丢包实在是严重, 所以打算用 `Pcap_DNSProxy` 代替 `Pdnsd`。 关于 `Pcap_DNSProxy` 的详细介绍,可以参考: [https://github.com/chengr28/Pcap_DNSProxy](https://github.com/chengr28/Pcap_DNSProxy) 安装过程可以参考: [https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe_Linux.zh-Hans.txt](https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe_Linux.zh-Hans.txt) 更详细的使用说明可以参考: [https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe.zh-Hans.txt](https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe.zh-Hans.txt) 这里主要重点强调一些需要注意的配置项: - `DNS` - 境外域名解析参数区域(这是最关键的一项配置) ```bash [DNS] # 这里一定要填 IPv4 + TCP!!!表示只使用 TCP 协议向境外远程 DNS 服务器发出请求 Outgoing Protocol = IPv4 + TCP # 建议当系统使用全局代理功能时启用,程序将除境内服务器外的所有请求直接交给系统而不作任何过滤等处理,系统会将请求自动发往远程服务器进行解析 Direct Request = IPv4 ... ... ``` - `Local DNS` - 境内域名解析参数区域 ```bash [Local DNS] # 发送请求到境内 DNS 服务器时所使用的协议 Local Protocol = IPv4 + UDP ... ... ``` - `Addresses` - 普通模式地址区域 ```bash [Addresses] ... ... # IPv4 主要境外 DNS 服务器地址 IPv4 Main DNS Address = 8.8.4.4:53 # IPv4 备用境外 DNS 服务器地址 IPv4 Alternate DNS Address = 8.8.8.8:53|208.67.220.220:443|208.67.222.222:5353 # IPv4 主要境内 DNS 服务器地址,用于境内域名解析,推荐使用 onedns IPv4 Local Main DNS Address = 112.124.47.27:53 # IPv4 备用境内 DNS 服务器地址,用于境内域名解析 IPv4 Local Alternate DNS Address = 114.215.126.16:53 ... ... ``` ### 1.7 配置系统 DNS 服务器设置 * 可参见 [https://developers.google.com/speed/public-dns/docs/using](https://developers.google.com/speed/public-dns/docs/using) 中 `Changing your DNS servers settings` 中 `Linux` 一节 * 图形界面以 `GNOME 3` 为例: * 打开所有程序列表,并 -> 设置 – 硬件分类 – 网络 * 如果要对当前的网络配置进行编辑 -&gt; 单击齿轮按钮 * 选中 `IPv4` * `DNS` 栏目中,将自动拨向关闭 * 在服务器中填入 `127.0.0.1` (或103.214.195.99:7300)并应用 * 选中 `IPv6` * `DNS` 栏目中,将自动拨向关闭 * 在服务器中填入 ::1 并应用 * 请务必确保只填入这两个地址,填入其它地址可能会导致系统选择其它 DNS 服务器绕过程序的代理 * 重启网络连接 * 直接修改系统文件修改 DNS 服务器设置: * 自动获取地址(DHCP)时: * 以 `root` 权限进入 `/etc/dhcp` 或 `/etc/dhcp3` 目录(视乎 dhclient.conf 文件位置) * 直接修改 `dhclient.conf` 文件,修改或添加 `prepend domain-name-servers` 一项即可 * 如果 `prepend domain-name-servers` 一项被 # 注释则需要把注释去掉以使配置生效,不需要添加新的条目 * `dhclient.conf` 文件可能存在多个 `prepend domain-name-servers` 项,是各个网络接口的配置项目,直接修改总的配置项目即可 * 使用 `service network(/networking) restart` 或 `ifdown/ifup` 或 `ifconfig stop/start` 重启网络服务/网络端口 * 非自动获取地址(DHCP)时: * 以 `root` 权限进入 `/etc` 目录 * 直接修改 `resolv.conf` 文件里的 `nameserver` 即可 * 如果重启后配置被覆盖,则需要修改或新建 `/etc/resolvconf/resolv.conf.d` 文件,内容和 `resolv.conf` 一样 * 使用 `service network(/networking) restart` 或 `ifdown/ifup` 或 `ifconfig stop/start` 重启网络服务/网络端口 ### 1.8 打开流量转发 ```bash $ cat /etc/sysctl.d/30-ipforward.conf ``` ```bash net.ipv4.ip_forward=1 net.ipv6.conf.all.forwarding = 1 net.ipv4.tcp_congestion_control=westwood net.ipv4.tcp_syn_retries = 5 net.ipv4.tcp_synack_retries = 5 ``` 编辑完成后,执行以下命令使变动立即生效 ```bash $ sysctl -p ``` 方案一固然可以实现全局智能分流,可这里有一个问题,它并不能让连接到此电脑上的设备也实现智能分流,也就是说,它还不能当成一个翻墙路由器使用,下面我们介绍的方案二便可以解决这个问题。前面的步骤大致相似,到后面略有不同。 ## 2. 通过策略路由实现智能分流 ### 2.1 安装相关软件 * badvpn * pdnsd * shadowsocks ```bash $ pacman -S badvpn pdnsd shadowsocks ``` ### 2.2 配置shadowsocks(略过) 假设shadowsocks配置文件为/etc/shadowsocks.json ### 2.3 获取中国IP段 将以下命令写入脚本保存执行(假设保存在/home/yang/bin/路由表/目录下): ```bash #!/bin/sh wget -c http://ftp.apnic.net/stats/apnic/delegated-apnic-latest cat delegated-apnic-latest | awk -F '|' '/CN/&&/ipv4/ {print $4 "/" 32-log($5)/log(2)}' | cat > /home/yang/bin/路由表/cn_rules.conf ``` ### 2.4 配置智能 DNS 服务 同上 ### 2.5 配置系统 DNS 服务器设置 同上 ### 2.6 写路由表启动和终止脚本 ```bash $ vim /usr/local/bin/socksfwd ``` ```bash #!/bin/bash SOCKS_SERVER=$SERVER_IP # SOCKS 服务器的 IP 地址 SOCKS_PORT=1081 # 本地SOCKS 服务器的端口 GATEWAY_IP=$(ip route|grep "default"|awk '{print $3}') # 家用网关(路由器)的 IP 地址,你也可以手动指定 TUN_NETWORK_DEV=tun0 # 选一个不冲突的 tun 设备号 TUN_NETWORK_PREFIX=10.0.0 # 选一个不冲突的内网 IP 段的前缀 start_fwd() { ip tuntap del dev "$TUN_NETWORK_DEV" mode tun # 添加虚拟网卡 ip tuntap add dev "$TUN_NETWORK_DEV" mode tun # 给虚拟网卡绑定IP地址 ip addr add "$TUN_NETWORK_PREFIX.1/24" dev "$TUN_NETWORK_DEV" # 启动虚拟网卡 ip link set "$TUN_NETWORK_DEV" up ip route del default via "$GATEWAY_IP" ip route add "$SOCKS_SERVER" via "$GATEWAY_IP" # 特殊ip段走家用网关(路由器)的 IP 地址(如局域网联机) # ip route add "172.16.39.0/24" via "$GATEWAY_IP" # 国内网段走家用网关(路由器)的 IP 地址 for i in $(cat /home/yang/bin/路由表/cn_rules.conf) do ip route add "$i" via "$GATEWAY_IP" done # 将默认网关设为虚拟网卡的IP地址 ip route add 0.0.0.0/1 via "$TUN_NETWORK_PREFIX.1" ip route add 128.0.0.0/1 via "$TUN_NETWORK_PREFIX.1" # 将socks5转为vpn badvpn-tun2socks --tundev "$TUN_NETWORK_DEV" --netif-ipaddr "$TUN_NETWORK_PREFIX.2" --netif-netmask 255.255.255.0 --socks-server-addr "127.0.0.1:$SOCKS_PORT" TUN2SOCKS_PID="$!" } stop_fwd() { ip route del 128.0.0.0/1 via "$TUN_NETWORK_PREFIX.1" ip route del 0.0.0.0/1 via "$TUN_NETWORK_PREFIX.1" for i in $(cat /home/yang/bin/路由表/cn_rules.conf) do ip route del "$i" via "$GATEWAY_IP" done ip route del "172.16.39.0/24" via "$GATEWAY_IP" ip route del "$SOCKS_SERVER" via "$GATEWAY_IP" ip route add default via "$GATEWAY_IP" ip link set "$TUN_NETWORK_DEV" down ip addr del "$TUN_NETWORK_PREFIX.1/24" dev "$TUN_NETWORK_DEV" ip tuntap del dev "$TUN_NETWORK_DEV" mode tun } start_fwd trap stop_fwd INT TERM wait "$TUN2SOCKS_PID" ``` ```bash $ vim /etc/systemd/system/socksfwd.service ``` ```bash [Unit] Description=Transparent SOCKS5 forwarding After=network-online.target [Service] Type=simple ExecStart=/usr/local/bin/socksfwd LimitNOFILE=1048576 [Install] WantedBy=multi-user.target ``` 启动服务 ```bash $ systemctl start socksfwd ``` 开机自启 ```bash $ systemctl enable socksfwd ``` ### 2.7 打开流量转发 ```bash $ cat /etc/sysctl.d/30-ipforward.conf ``` ```bash net.ipv4.ip_forward=1 net.ipv6.conf.all.forwarding = 1 net.ipv4.tcp_congestion_control=westwood net.ipv4.tcp_syn_retries = 5 net.ipv4.tcp_synack_retries = 5 ``` 编辑完成后,执行以下命令使变动立即生效 ```bash $ sysctl -p ```
json metadata{"tags":["cn","circumvention"],"links":["https://dnscrypt.org/","https://github.com/chengr28/Pcap_DNSProxy","https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe_Linux.zh-Hans.txt","https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe.zh-Hans.txt","https://developers.google.com/speed/public-dns/docs/using"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinkcircumvention
permlinklinux
titlelinux全局智能分流方案
Transaction InfoBlock #17612374/Trx 88ff26622cc34850d1f71d724214e3c7f6f572bb
View Raw JSON Data
{
  "block": 17612374,
  "op": [
    "comment",
    {
      "author": "ryyan",
      "body": "**本来我是决定不再写这样的文章了的。但是呢,最近连续配置了两次 `ArchLinux`,在配置这种东西的时候连续撞到了同样的坑,加上这段时间经常有人问我关于 `Linux` 下的 `shadowsocks` 的问题,所以我想了想还是写一篇记录一下吧,也免得自己以后再忘记了。**\n\n这里有两种方案,都可以实现全局智能分流。第一种方案的思路是使用 `ipset` 载入 `chnroute` 的 `IP` 列表并使用 `iptables` 实现带自动分流国内外流量的全局代理。为什么不用 `PAC` 呢?因为 `PAC` 这种东西只对浏览器有用。难道你在浏览器之外就不需要科学上网了吗?反正我是不信的……\n\n**本教程所用系统为 `Archlinux`,其他发型版类似,请自行参考相关资料。**\n\n## 1. 通过 iptables 实现智能分流\n\n### 1.1 安装相关软件\n\n* shadowsocks-libev\n* ipset\n\n```bash\n$ pacman -S shadowsocks-libev ipset\n```\n\n### 1.2 配置shadowsocks-libev(略过)\n\n假设shadowsocks配置文件为/etc/shadowsocks.json\n\n### 1.3 获取中国IP段\n\n将以下命令写入脚本保存执行(假设保存在/home/yang/bin/路由表/目录下):\n\n```bash\n#!/bin/sh\nwget -c http://ftp.apnic.net/stats/apnic/delegated-apnic-latest\ncat delegated-apnic-latest | awk -F '|' '/CN/&&/ipv4/ {print $4 \"/\" 32-log($5)/log(2)}' | cat > /home/yang/bin/路由表/cn_rules.conf\n```\n\n### 1.4 创建启动和关闭脚本\n\n```bash\n$ vim /home/yang/bin/shadowsocks/ss-up.sh\n```\n\n```bash\n#!/bin/bash\n\nSOCKS_SERVER=$SERVER_IP # SOCKS 服务器的 IP 地址\n# Setup the ipset\nipset -N chnroute hash:net maxelem 65536\n\nfor ip in $(cat '/home/yang/bin/路由表/cn_rules.conf'); do\n  ipset add chnroute $ip\ndone\n\n# 在nat表中新增一个链,名叫:SHADOWSOCKS\niptables -t nat -N SHADOWSOCKS\n\n# Allow connection to the server\niptables -t nat -A SHADOWSOCKS -d $SOCKS_SERVER -j RETURN\n\n# Allow connection to reserved networks\niptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN\n\n# Allow connection to chinese IPs\niptables -t nat -A SHADOWSOCKS -p tcp -m set --match-set chnroute dst -j RETURN\n# 如果你想对 icmp 协议也实现智能分流,可以加上下面这一条\n# iptables -t nat -A SHADOWSOCKS -p icmp -m set --match-set chnroute dst -j RETURN\n\n# Redirect to Shadowsocks\n# 把1081改成你的shadowsocks本地端口\niptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-port 1081\n# 如果你想对 icmp 协议也实现智能分流,可以加上下面这一条\n# iptables -t nat -A SHADOWSOCKS -p icmp -j REDIRECT --to-port 1081\n\n# 将SHADOWSOCKS链中所有的规则追加到OUTPUT链中\niptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS\n# 如果你想对 icmp 协议也实现智能分流,可以加上下面这一条\n# iptables -t nat -A OUTPUT -p icmp -j SHADOWSOCKS\n```\n&emsp;&emsp;这是在启动 `shadowsocks` 之前执行的脚本,用来设置 `iptables` 规则,对全局应用代理并将 `chnroute` 导入 `ipset` 来实现自动分流。注意要把服务器 `IP` 和本地端口相关的代码全部替换成你自己的。\n&emsp;&emsp;这里就有一个坑了,就是在把 `chnroute.txt` 加入 `ipset` 的时候。因为 `chnroute.txt` 是一个 `IP` 段列表,而中国持有的 `IP` 数量上还是比较大的,所以如果使用 `hash:ip` 来导入的话会使内存溢出。我在第二次重新配置的时候就撞进了这个大坑……\n&emsp;&emsp;但是你也不能尝试把整个列表导入 `iptables`。虽然导入 `iptables` 不会导致内存溢出,但是 `iptables` 是线性查表,即使你全部导入进去,也会因为低下的性能而抓狂。\n\n然后再创建 `/home/yang/bin/shadowsocks/ss-down.sh`, 这是用来清除上述规则的脚本,比较简单\n\n```bash\n#!/bin/bash\n\n# iptables -t nat -D OUTPUT -p icmp -j SHADOWSOCKS\niptables -t nat -D OUTPUT -p tcp -j SHADOWSOCKS\niptables -t nat -F SHADOWSOCKS\niptables -t nat -X SHADOWSOCKS\nipset destroy chnroute\n```\n\n接着执行\n\n```bash\n$ chmod +x ss-up.sh\n$ chmod +x ss-down.sh\n```\n\n### 1.5 配置ss-redir服务\n\n首先,默认的 `ss-local` 并不能用来作为 `iptables` 流量转发的目标,因为它是 `socks5` 代理而非透明代理。我们至少要把 `systemd` 执行的程序改成 `ss-redir`。其次,上述两个脚本还不能自动执行,必须让 `systemd` 分别在启动 `shadowsocks` 之前和关闭之后将脚本执行,这样才能自动配置好 `iptables` 规则。\n\n```bash\n$ vim /usr/lib/systemd/system/[email protected]\n```\n\n```bash\n[Unit]\nDescription=Shadowsocks-Libev Client Service\nAfter=network.target\n\n[Service]\nUser=root\nCapabilityBoundingSet=~CAP_SYS_ADMIN\nExecStart=\nExecStartPre=/home/yang/bin/shadowsocks/ss-up.sh\nExecStart=/usr/bin/ss-redir -u -c /etc/%i.json\nExecStopPost=/home/yang/bin/shadowsocks/ss-down.sh\n\n[Install]\nWantedBy=multi-user.target\n```\n然后启动服务\n```bash\n$ systemctl start shadowsocks-libev@shadowsocks\n```\n\n开机自启\n\n```bash\n$ systemctl enable shadowsocks-libev@shadowsocks\n```\n\n### 1.6 配置智能 DNS 服务\n\n完成了以上工作之后是不是就可以实现全局科学上网了呢?答案是否定的,我们还有最后一项工作需要完成,那就是解决 `DNS` 污染问题。如果你不知道什么是 `DNS` 污染,我可以简单地给你普及一下:\n\n> `DNS` 污染是一种让一般用户由于得到虚假目标主机 `IP` 而不能与其通信的方法,是一种 `DNS` 缓存投毒攻击(DNS cache poisoning)。其工作方式是:由于通常的 `DNS` 查询没有任何认证机制,而且 `DNS` 查询通常基于的 `UDP` 是无连接不可靠的协议,因此 `DNS` 的查询非常容易被篡改,通过对 `UDP` 端口 53 上的 `DNS` 查询进行入侵检测,一经发现与关键词相匹配的请求则立即伪装成目标域名的解析服务器(NS,Name Server)给查询者返回虚假结果。\n\n`DNS` 污染症状:目前一些被禁止访问的网站很多就是通过 `DNS` 污染来实现的,例如 `YouTube`、`Facebook` 等网站。\n\n**应对dns污染的方法**\n\n- 对于 `DNS` 污染,可以说,个人用户很难单单靠设置解决,通常可以使用 `VPN` 或者域名远程解析的方法解决,但这大多需要购买付费的 `VPN` 或 `SSH` 等\n- 修改 `Hosts` 的方法,手动设置域名正确的 `IP` 地址\n- `dns` 加密解析:[DNSCrypt](https://dnscrypt.org/)\n- 忽略 `DNS` 投毒污染小工具:[Pcap_DNSProxy](https://github.com/chengr28/Pcap_DNSProxy)\n\n我们选择用 `Pcap_DNSProxy` 来解决这个问题,以前用的是 `Pdnsd + Dnsmasq` 组合, 后来发现 `TCP` 请求效率太低加上家里网络与那些国外的 `DNS` 丢包实在是严重, 所以打算用 `Pcap_DNSProxy` 代替 `Pdnsd`。\n\n关于 `Pcap_DNSProxy` 的详细介绍,可以参考:\n[https://github.com/chengr28/Pcap_DNSProxy](https://github.com/chengr28/Pcap_DNSProxy)\n安装过程可以参考:\n[https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe_Linux.zh-Hans.txt](https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe_Linux.zh-Hans.txt)\n更详细的使用说明可以参考:\n[https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe.zh-Hans.txt](https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe.zh-Hans.txt)\n\n这里主要重点强调一些需要注意的配置项:\n\n- `DNS` - 境外域名解析参数区域(这是最关键的一项配置)\n\n```bash\n[DNS]\n# 这里一定要填 IPv4 + TCP!!!表示只使用 TCP 协议向境外远程 DNS 服务器发出请求\nOutgoing Protocol = IPv4 + TCP\n# 建议当系统使用全局代理功能时启用,程序将除境内服务器外的所有请求直接交给系统而不作任何过滤等处理,系统会将请求自动发往远程服务器进行解析\nDirect Request = IPv4\n...\n...\n```\n\n- `Local DNS` - 境内域名解析参数区域\n\n```bash\n[Local DNS]\n# 发送请求到境内 DNS 服务器时所使用的协议\nLocal Protocol = IPv4 + UDP\n...\n...\n```\n\n- `Addresses` - 普通模式地址区域\n\n```bash\n[Addresses]\n...\n...\n# IPv4 主要境外 DNS 服务器地址\nIPv4 Main DNS Address = 8.8.4.4:53\n# IPv4 备用境外 DNS 服务器地址\nIPv4 Alternate DNS Address = 8.8.8.8:53|208.67.220.220:443|208.67.222.222:5353\n# IPv4 主要境内 DNS 服务器地址,用于境内域名解析,推荐使用 onedns\nIPv4 Local Main DNS Address = 112.124.47.27:53\n# IPv4 备用境内 DNS 服务器地址,用于境内域名解析\nIPv4 Local Alternate DNS Address = 114.215.126.16:53\n...\n...\n```\n\n### 1.7 配置系统 DNS 服务器设置\n\n* 可参见 [https://developers.google.com/speed/public-dns/docs/using](https://developers.google.com/speed/public-dns/docs/using) 中 `Changing your DNS servers settings` 中 `Linux` 一节\n\n* 图形界面以 `GNOME 3` 为例:\n\n* 打开所有程序列表,并 -> 设置 – 硬件分类 – 网络\n\n* 如果要对当前的网络配置进行编辑 -&gt; 单击齿轮按钮\n\n* 选中 `IPv4`\n\n* `DNS` 栏目中,将自动拨向关闭\n\n* 在服务器中填入 `127.0.0.1` (或103.214.195.99:7300)并应用\n\n* 选中 `IPv6`\n\n* `DNS` 栏目中,将自动拨向关闭\n\n* 在服务器中填入 ::1 并应用\n\n* 请务必确保只填入这两个地址,填入其它地址可能会导致系统选择其它 DNS 服务器绕过程序的代理\n\n* 重启网络连接\n\n* 直接修改系统文件修改 DNS 服务器设置:\n\n* 自动获取地址(DHCP)时:\n\n* 以 `root` 权限进入 `/etc/dhcp` 或 `/etc/dhcp3` 目录(视乎 dhclient.conf 文件位置)\n\n* 直接修改 `dhclient.conf` 文件,修改或添加 `prepend domain-name-servers` 一项即可\n\n* 如果 `prepend domain-name-servers` 一项被 # 注释则需要把注释去掉以使配置生效,不需要添加新的条目\n\n* `dhclient.conf` 文件可能存在多个 `prepend domain-name-servers` 项,是各个网络接口的配置项目,直接修改总的配置项目即可\n\n* 使用 `service network(/networking) restart` 或 `ifdown/ifup` 或 `ifconfig stop/start` 重启网络服务/网络端口\n\n* 非自动获取地址(DHCP)时:\n\n* 以 `root` 权限进入 `/etc` 目录\n\n* 直接修改 `resolv.conf` 文件里的 `nameserver` 即可\n\n* 如果重启后配置被覆盖,则需要修改或新建 `/etc/resolvconf/resolv.conf.d` 文件,内容和 `resolv.conf` 一样\n\n* 使用 `service network(/networking) restart` 或 `ifdown/ifup` 或 `ifconfig stop/start` 重启网络服务/网络端口\n\n### 1.8 打开流量转发\n\n```bash\n$ cat /etc/sysctl.d/30-ipforward.conf\n```\n\n```bash\nnet.ipv4.ip_forward=1\n\nnet.ipv6.conf.all.forwarding = 1\n\nnet.ipv4.tcp_congestion_control=westwood\n\nnet.ipv4.tcp_syn_retries = 5\n\nnet.ipv4.tcp_synack_retries = 5\n```\n编辑完成后,执行以下命令使变动立即生效\n\n```bash\n$ sysctl -p\n```\n\n方案一固然可以实现全局智能分流,可这里有一个问题,它并不能让连接到此电脑上的设备也实现智能分流,也就是说,它还不能当成一个翻墙路由器使用,下面我们介绍的方案二便可以解决这个问题。前面的步骤大致相似,到后面略有不同。\n\n## 2. 通过策略路由实现智能分流\n\n### 2.1 安装相关软件\n\n* badvpn\n* pdnsd\n* shadowsocks\n\n```bash\n$ pacman -S badvpn pdnsd shadowsocks\n```\n\n### 2.2 配置shadowsocks(略过)\n假设shadowsocks配置文件为/etc/shadowsocks.json\n\n### 2.3 获取中国IP段\n\n将以下命令写入脚本保存执行(假设保存在/home/yang/bin/路由表/目录下):\n\n```bash\n#!/bin/sh\nwget -c http://ftp.apnic.net/stats/apnic/delegated-apnic-latest\ncat delegated-apnic-latest | awk -F '|' '/CN/&&/ipv4/ {print $4 \"/\" 32-log($5)/log(2)}' | cat > /home/yang/bin/路由表/cn_rules.conf\n```\n\n### 2.4 配置智能 DNS 服务\n\n同上\n\n### 2.5 配置系统 DNS 服务器设置\n\n同上\n\n### 2.6 写路由表启动和终止脚本\n\n```bash\n$ vim /usr/local/bin/socksfwd\n```\n\n```bash\n#!/bin/bash\nSOCKS_SERVER=$SERVER_IP # SOCKS 服务器的 IP 地址\nSOCKS_PORT=1081 # 本地SOCKS 服务器的端口\nGATEWAY_IP=$(ip route|grep \"default\"|awk '{print $3}') # 家用网关(路由器)的 IP 地址,你也可以手动指定\nTUN_NETWORK_DEV=tun0 # 选一个不冲突的 tun 设备号\nTUN_NETWORK_PREFIX=10.0.0 # 选一个不冲突的内网 IP 段的前缀\n\n\nstart_fwd() {\nip tuntap del dev \"$TUN_NETWORK_DEV\" mode tun\n# 添加虚拟网卡\nip tuntap add dev \"$TUN_NETWORK_DEV\" mode tun\n# 给虚拟网卡绑定IP地址\nip addr add \"$TUN_NETWORK_PREFIX.1/24\" dev \"$TUN_NETWORK_DEV\"\n# 启动虚拟网卡\nip link set \"$TUN_NETWORK_DEV\" up\nip route del default via \"$GATEWAY_IP\"\nip route add \"$SOCKS_SERVER\" via \"$GATEWAY_IP\"\n# 特殊ip段走家用网关(路由器)的 IP 地址(如局域网联机)\n# ip route add \"172.16.39.0/24\" via \"$GATEWAY_IP\"\n# 国内网段走家用网关(路由器)的 IP 地址\nfor i in $(cat /home/yang/bin/路由表/cn_rules.conf)\ndo\nip route add \"$i\" via \"$GATEWAY_IP\"\ndone\n# 将默认网关设为虚拟网卡的IP地址\nip route add 0.0.0.0/1 via \"$TUN_NETWORK_PREFIX.1\"\nip route add 128.0.0.0/1 via \"$TUN_NETWORK_PREFIX.1\"\n# 将socks5转为vpn\nbadvpn-tun2socks --tundev \"$TUN_NETWORK_DEV\" --netif-ipaddr \"$TUN_NETWORK_PREFIX.2\" --netif-netmask 255.255.255.0 --socks-server-addr \"127.0.0.1:$SOCKS_PORT\"\nTUN2SOCKS_PID=\"$!\"\n}\n\n\nstop_fwd() {\nip route del 128.0.0.0/1 via \"$TUN_NETWORK_PREFIX.1\"\nip route del 0.0.0.0/1 via \"$TUN_NETWORK_PREFIX.1\"\nfor i in $(cat /home/yang/bin/路由表/cn_rules.conf)\ndo\nip route del \"$i\" via \"$GATEWAY_IP\"\ndone\nip route del \"172.16.39.0/24\" via \"$GATEWAY_IP\"\nip route del \"$SOCKS_SERVER\" via \"$GATEWAY_IP\"\nip route add default via \"$GATEWAY_IP\"\nip link set \"$TUN_NETWORK_DEV\" down\nip addr del \"$TUN_NETWORK_PREFIX.1/24\" dev \"$TUN_NETWORK_DEV\"\nip tuntap del dev \"$TUN_NETWORK_DEV\" mode tun\n}\n\n\n\nstart_fwd\ntrap stop_fwd INT TERM\nwait \"$TUN2SOCKS_PID\"\n```\n\n```bash\n$ vim /etc/systemd/system/socksfwd.service\n```\n\n```bash\n[Unit]\n\nDescription=Transparent SOCKS5 forwarding\n\nAfter=network-online.target\n\n[Service]\n\nType=simple\n\nExecStart=/usr/local/bin/socksfwd\n\nLimitNOFILE=1048576\n\n\n[Install]\n\nWantedBy=multi-user.target\n```\n\n启动服务\n\n```bash\n$ systemctl start socksfwd\n```\n\n开机自启\n\n```bash\n$ systemctl enable socksfwd\n```\n\n### 2.7 打开流量转发\n\n```bash\n$ cat /etc/sysctl.d/30-ipforward.conf\n```\n\n```bash\nnet.ipv4.ip_forward=1\n\nnet.ipv6.conf.all.forwarding = 1\n\nnet.ipv4.tcp_congestion_control=westwood\n\nnet.ipv4.tcp_syn_retries = 5\n\nnet.ipv4.tcp_synack_retries = 5\n```\n\n编辑完成后,执行以下命令使变动立即生效\n\n```bash\n$ sysctl -p\n```",
      "json_metadata": "{\"tags\":[\"cn\",\"circumvention\"],\"links\":[\"https://dnscrypt.org/\",\"https://github.com/chengr28/Pcap_DNSProxy\",\"https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe_Linux.zh-Hans.txt\",\"https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe.zh-Hans.txt\",\"https://developers.google.com/speed/public-dns/docs/using\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "circumvention",
      "permlink": "linux",
      "title": "linux全局智能分流方案"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T07:59:57",
  "trx_id": "88ff26622cc34850d1f71d724214e3c7f6f572bb",
  "trx_in_block": 27,
  "virtual_op": 0
}
ryyanupdated their account properties
2017/11/28 07:56:45
accountryyan
json metadata{"profile":{"name":"Ryan","about":"云计算工程师,不务正业,随心所欲","profile_image":"http://o7z41ciog.bkt.clouddn.com/05ba932c.jpg"}}
memo keySTM824xHURUciC4qWdkset97fQnueFnD8Qx1VcUAqkJmtFzzp4hzo
Transaction InfoBlock #17612310/Trx 225a9d127a209dca94b38232bc93c552bb893564
View Raw JSON Data
{
  "block": 17612310,
  "op": [
    "account_update",
    {
      "account": "ryyan",
      "json_metadata": "{\"profile\":{\"name\":\"Ryan\",\"about\":\"云计算工程师,不务正业,随心所欲\",\"profile_image\":\"http://o7z41ciog.bkt.clouddn.com/05ba932c.jpg\"}}",
      "memo_key": "STM824xHURUciC4qWdkset97fQnueFnD8Qx1VcUAqkJmtFzzp4hzo"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T07:56:45",
  "trx_id": "225a9d127a209dca94b38232bc93c552bb893564",
  "trx_in_block": 29,
  "virtual_op": 0
}
ryyanflagged (-100.00%) @ryyan / 5bpjqs-linux
2017/11/28 07:47:51
authorryyan
permlink5bpjqs-linux
voterryyan
weight-10000 (-100.00%)
Transaction InfoBlock #17612133/Trx b1752c0e0ac2c3f1622311d8027c2441e67a48e8
View Raw JSON Data
{
  "block": 17612133,
  "op": [
    "vote",
    {
      "author": "ryyan",
      "permlink": "5bpjqs-linux",
      "voter": "ryyan",
      "weight": -10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T07:47:51",
  "trx_id": "b1752c0e0ac2c3f1622311d8027c2441e67a48e8",
  "trx_in_block": 11,
  "virtual_op": 0
}
anomalyupvoted (1.00%) @ryyan / 5bpjqs-linux
2017/11/28 07:46:09
authorryyan
permlink5bpjqs-linux
voteranomaly
weight100 (1.00%)
Transaction InfoBlock #17612099/Trx 2da7f7a6f6570ec401d3ef8de2f3e6172b21317f
View Raw JSON Data
{
  "block": 17612099,
  "op": [
    "vote",
    {
      "author": "ryyan",
      "permlink": "5bpjqs-linux",
      "voter": "anomaly",
      "weight": 100
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T07:46:09",
  "trx_id": "2da7f7a6f6570ec401d3ef8de2f3e6172b21317f",
  "trx_in_block": 11,
  "virtual_op": 0
}
2017/11/28 07:44:57
authorcheetah
bodyHi! I am a robot. I just upvoted you! I found similar content that readers might be interested in: https://www.yangcs.net/posts/11b0e2ac/
json metadata
parent authorryyan
parent permlink5bpjqs-linux
permlinkcheetah-re-ryyan5bpjqs-linux
title
Transaction InfoBlock #17612075/Trx 6201e366179b366a7656ff5451dcc27e56d812b1
View Raw JSON Data
{
  "block": 17612075,
  "op": [
    "comment",
    {
      "author": "cheetah",
      "body": "Hi! I am a robot. I just upvoted you! I found similar content that readers might be interested in:\nhttps://www.yangcs.net/posts/11b0e2ac/",
      "json_metadata": "",
      "parent_author": "ryyan",
      "parent_permlink": "5bpjqs-linux",
      "permlink": "cheetah-re-ryyan5bpjqs-linux",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T07:44:57",
  "trx_id": "6201e366179b366a7656ff5451dcc27e56d812b1",
  "trx_in_block": 11,
  "virtual_op": 0
}
cheetahupvoted (0.08%) @ryyan / 5bpjqs-linux
2017/11/28 07:44:54
authorryyan
permlink5bpjqs-linux
votercheetah
weight8 (0.08%)
Transaction InfoBlock #17612074/Trx 0413380eca0ed3216836c0fb11c76098d8eba03c
View Raw JSON Data
{
  "block": 17612074,
  "op": [
    "vote",
    {
      "author": "ryyan",
      "permlink": "5bpjqs-linux",
      "voter": "cheetah",
      "weight": 8
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T07:44:54",
  "trx_id": "0413380eca0ed3216836c0fb11c76098d8eba03c",
  "trx_in_block": 6,
  "virtual_op": 0
}
ryyanupvoted (100.00%) @ryyan / 5bpjqs-linux
2017/11/28 07:44:33
authorryyan
permlink5bpjqs-linux
voterryyan
weight10000 (100.00%)
Transaction InfoBlock #17612067/Trx 99d045dfdc61b8ffdfca145cfc21fb648c9ffa60
View Raw JSON Data
{
  "block": 17612067,
  "op": [
    "vote",
    {
      "author": "ryyan",
      "permlink": "5bpjqs-linux",
      "voter": "ryyan",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T07:44:33",
  "trx_id": "99d045dfdc61b8ffdfca145cfc21fb648c9ffa60",
  "trx_in_block": 8,
  "virtual_op": 0
}
ryyanpublished a new post: 5bpjqs-linux
2017/11/28 07:44:33
authorryyan
body**本来我是决定不再写这样的文章了的。但是呢,最近连续配置了两次 `ArchLinux`,在配置这种东西的时候连续撞到了同样的坑,加上这段时间经常有人问我关于 `Linux` 下的 `shadowsocks` 的问题,所以我想了想还是写一篇记录一下吧,也免得自己以后再忘记了。** 这里有两种方案,都可以实现全局智能分流。第一种方案的思路是使用 `ipset` 载入 `chnroute` 的 `IP` 列表并使用 `iptables` 实现带自动分流国内外流量的全局代理。为什么不用 `PAC` 呢?因为 `PAC` 这种东西只对浏览器有用。难道你在浏览器之外就不需要科学上网了吗?反正我是不信的…… **本教程所用系统为 `Archlinux`,其他发型版类似,请自行参考相关资料。** ## 1. 通过 iptables 实现智能分流 ### 1.1 安装相关软件 * shadowsocks-libev * ipset ```bash $ pacman -S shadowsocks-libev ipset ``` ### 1.2 配置shadowsocks-libev(略过) 假设shadowsocks配置文件为/etc/shadowsocks.json ### 1.3 获取中国IP段 将以下命令写入脚本保存执行(假设保存在/home/yang/bin/路由表/目录下): ```bash #!/bin/sh wget -c http://ftp.apnic.net/stats/apnic/delegated-apnic-latest cat delegated-apnic-latest | awk -F '|' '/CN/&&/ipv4/ {print $4 "/" 32-log($5)/log(2)}' | cat > /home/yang/bin/路由表/cn_rules.conf ``` ### 1.4 创建启动和关闭脚本 ```bash $ vim /home/yang/bin/shadowsocks/ss-up.sh ``` ```bash #!/bin/bash SOCKS_SERVER=$SERVER_IP # SOCKS 服务器的 IP 地址 # Setup the ipset ipset -N chnroute hash:net maxelem 65536 for ip in $(cat '/home/yang/bin/路由表/cn_rules.conf'); do ipset add chnroute $ip done # 在nat表中新增一个链,名叫:SHADOWSOCKS iptables -t nat -N SHADOWSOCKS # Allow connection to the server iptables -t nat -A SHADOWSOCKS -d $SOCKS_SERVER -j RETURN # Allow connection to reserved networks iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN # Allow connection to chinese IPs iptables -t nat -A SHADOWSOCKS -p tcp -m set --match-set chnroute dst -j RETURN # 如果你想对 icmp 协议也实现智能分流,可以加上下面这一条 # iptables -t nat -A SHADOWSOCKS -p icmp -m set --match-set chnroute dst -j RETURN # Redirect to Shadowsocks # 把1081改成你的shadowsocks本地端口 iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-port 1081 # 如果你想对 icmp 协议也实现智能分流,可以加上下面这一条 # iptables -t nat -A SHADOWSOCKS -p icmp -j REDIRECT --to-port 1081 # 将SHADOWSOCKS链中所有的规则追加到OUTPUT链中 iptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS # 如果你想对 icmp 协议也实现智能分流,可以加上下面这一条 # iptables -t nat -A OUTPUT -p icmp -j SHADOWSOCKS ``` &emsp;&emsp;这是在启动 `shadowsocks` 之前执行的脚本,用来设置 `iptables` 规则,对全局应用代理并将 `chnroute` 导入 `ipset` 来实现自动分流。注意要把服务器 `IP` 和本地端口相关的代码全部替换成你自己的。 &emsp;&emsp;这里就有一个坑了,就是在把 `chnroute.txt` 加入 `ipset` 的时候。因为 `chnroute.txt` 是一个 `IP` 段列表,而中国持有的 `IP` 数量上还是比较大的,所以如果使用 `hash:ip` 来导入的话会使内存溢出。我在第二次重新配置的时候就撞进了这个大坑…… &emsp;&emsp;但是你也不能尝试把整个列表导入 `iptables`。虽然导入 `iptables` 不会导致内存溢出,但是 `iptables` 是线性查表,即使你全部导入进去,也会因为低下的性能而抓狂。 然后再创建 `/home/yang/bin/shadowsocks/ss-down.sh`, 这是用来清除上述规则的脚本,比较简单 ```bash #!/bin/bash # iptables -t nat -D OUTPUT -p icmp -j SHADOWSOCKS iptables -t nat -D OUTPUT -p tcp -j SHADOWSOCKS iptables -t nat -F SHADOWSOCKS iptables -t nat -X SHADOWSOCKS ipset destroy chnroute ``` 接着执行 ```bash $ chmod +x ss-up.sh $ chmod +x ss-down.sh ``` ### 1.5 配置ss-redir服务 首先,默认的 `ss-local` 并不能用来作为 `iptables` 流量转发的目标,因为它是 `socks5` 代理而非透明代理。我们至少要把 `systemd` 执行的程序改成 `ss-redir`。其次,上述两个脚本还不能自动执行,必须让 `systemd` 分别在启动 `shadowsocks` 之前和关闭之后将脚本执行,这样才能自动配置好 `iptables` 规则。 ```bash $ vim /usr/lib/systemd/system/[email protected] ``` ```bash [Unit] Description=Shadowsocks-Libev Client Service After=network.target [Service] User=root CapabilityBoundingSet=~CAP_SYS_ADMIN ExecStart= ExecStartPre=/home/yang/bin/shadowsocks/ss-up.sh ExecStart=/usr/bin/ss-redir -u -c /etc/%i.json ExecStopPost=/home/yang/bin/shadowsocks/ss-down.sh [Install] WantedBy=multi-user.target ``` 然后启动服务 ```bash $ systemctl start shadowsocks-libev@shadowsocks ``` 开机自启 ```bash $ systemctl enable shadowsocks-libev@shadowsocks ``` ### 1.6 配置智能 DNS 服务 完成了以上工作之后是不是就可以实现全局科学上网了呢?答案是否定的,我们还有最后一项工作需要完成,那就是解决 `DNS` 污染问题。如果你不知道什么是 `DNS` 污染,我可以简单地给你普及一下: > `DNS` 污染是一种让一般用户由于得到虚假目标主机 `IP` 而不能与其通信的方法,是一种 `DNS` 缓存投毒攻击(DNS cache poisoning)。其工作方式是:由于通常的 `DNS` 查询没有任何认证机制,而且 `DNS` 查询通常基于的 `UDP` 是无连接不可靠的协议,因此 `DNS` 的查询非常容易被篡改,通过对 `UDP` 端口 53 上的 `DNS` 查询进行入侵检测,一经发现与关键词相匹配的请求则立即伪装成目标域名的解析服务器(NS,Name Server)给查询者返回虚假结果。 `DNS` 污染症状:目前一些被禁止访问的网站很多就是通过 `DNS` 污染来实现的,例如 `YouTube`、`Facebook` 等网站。 **应对dns污染的方法** - 对于 `DNS` 污染,可以说,个人用户很难单单靠设置解决,通常可以使用 `VPN` 或者域名远程解析的方法解决,但这大多需要购买付费的 `VPN` 或 `SSH` 等 - 修改 `Hosts` 的方法,手动设置域名正确的 `IP` 地址 - `dns` 加密解析:[DNSCrypt](https://dnscrypt.org/) - 忽略 `DNS` 投毒污染小工具:[Pcap_DNSProxy](https://github.com/chengr28/Pcap_DNSProxy) 我们选择用 `Pcap_DNSProxy` 来解决这个问题,以前用的是 `Pdnsd + Dnsmasq` 组合, 后来发现 `TCP` 请求效率太低加上家里网络与那些国外的 `DNS` 丢包实在是严重, 所以打算用 `Pcap_DNSProxy` 代替 `Pdnsd`。 关于 `Pcap_DNSProxy` 的详细介绍,可以参考: [https://github.com/chengr28/Pcap_DNSProxy](https://github.com/chengr28/Pcap_DNSProxy) 安装过程可以参考: [https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe_Linux.zh-Hans.txt](https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe_Linux.zh-Hans.txt) 更详细的使用说明可以参考: [https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe.zh-Hans.txt](https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe.zh-Hans.txt) 这里主要重点强调一些需要注意的配置项: - `DNS` - 境外域名解析参数区域(这是最关键的一项配置) ```bash [DNS] # 这里一定要填 IPv4 + TCP!!!表示只使用 TCP 协议向境外远程 DNS 服务器发出请求 Outgoing Protocol = IPv4 + TCP # 建议当系统使用全局代理功能时启用,程序将除境内服务器外的所有请求直接交给系统而不作任何过滤等处理,系统会将请求自动发往远程服务器进行解析 Direct Request = IPv4 ... ... ``` - `Local DNS` - 境内域名解析参数区域 ```bash [Local DNS] # 发送请求到境内 DNS 服务器时所使用的协议 Local Protocol = IPv4 + UDP ... ... ``` - `Addresses` - 普通模式地址区域 ```bash [Addresses] ... ... # IPv4 主要境外 DNS 服务器地址 IPv4 Main DNS Address = 8.8.4.4:53 # IPv4 备用境外 DNS 服务器地址 IPv4 Alternate DNS Address = 8.8.8.8:53|208.67.220.220:443|208.67.222.222:5353 # IPv4 主要境内 DNS 服务器地址,用于境内域名解析,推荐使用 onedns IPv4 Local Main DNS Address = 112.124.47.27:53 # IPv4 备用境内 DNS 服务器地址,用于境内域名解析 IPv4 Local Alternate DNS Address = 114.215.126.16:53 ... ... ``` ### 1.7 配置系统 DNS 服务器设置 * 可参见 [https://developers.google.com/speed/public-dns/docs/using](https://developers.google.com/speed/public-dns/docs/using) 中 `Changing your DNS servers settings` 中 `Linux` 一节 * 图形界面以 `GNOME 3` 为例: * 打开所有程序列表,并 -> 设置 – 硬件分类 – 网络 * 如果要对当前的网络配置进行编辑 -&gt; 单击齿轮按钮 * 选中 `IPv4` * `DNS` 栏目中,将自动拨向关闭 * 在服务器中填入 `127.0.0.1` (或103.214.195.99:7300)并应用 * 选中 `IPv6` * `DNS` 栏目中,将自动拨向关闭 * 在服务器中填入 ::1 并应用 * 请务必确保只填入这两个地址,填入其它地址可能会导致系统选择其它 DNS 服务器绕过程序的代理 * 重启网络连接 * 直接修改系统文件修改 DNS 服务器设置: * 自动获取地址(DHCP)时: * 以 `root` 权限进入 `/etc/dhcp` 或 `/etc/dhcp3` 目录(视乎 dhclient.conf 文件位置) * 直接修改 `dhclient.conf` 文件,修改或添加 `prepend domain-name-servers` 一项即可 * 如果 `prepend domain-name-servers` 一项被 # 注释则需要把注释去掉以使配置生效,不需要添加新的条目 * `dhclient.conf` 文件可能存在多个 `prepend domain-name-servers` 项,是各个网络接口的配置项目,直接修改总的配置项目即可 * 使用 `service network(/networking) restart` 或 `ifdown/ifup` 或 `ifconfig stop/start` 重启网络服务/网络端口 * 非自动获取地址(DHCP)时: * 以 `root` 权限进入 `/etc` 目录 * 直接修改 `resolv.conf` 文件里的 `nameserver` 即可 * 如果重启后配置被覆盖,则需要修改或新建 `/etc/resolvconf/resolv.conf.d` 文件,内容和 `resolv.conf` 一样 * 使用 `service network(/networking) restart` 或 `ifdown/ifup` 或 `ifconfig stop/start` 重启网络服务/网络端口 ### 1.8 打开流量转发 ```bash $ cat /etc/sysctl.d/30-ipforward.conf ``` ```bash net.ipv4.ip_forward=1 net.ipv6.conf.all.forwarding = 1 net.ipv4.tcp_congestion_control=westwood net.ipv4.tcp_syn_retries = 5 net.ipv4.tcp_synack_retries = 5 ``` 编辑完成后,执行以下命令使变动立即生效 ```bash $ sysctl -p ``` 方案一固然可以实现全局智能分流,可这里有一个问题,它并不能让连接到此电脑上的设备也实现智能分流,也就是说,它还不能当成一个翻墙路由器使用,下面我们介绍的方案二便可以解决这个问题。前面的步骤大致相似,到后面略有不同。 ## 2. 通过策略路由实现智能分流 ### 2.1 安装相关软件 * badvpn * pdnsd * shadowsocks ```bash $ pacman -S badvpn pdnsd shadowsocks ``` ### 2.2 配置shadowsocks(略过) 假设shadowsocks配置文件为/etc/shadowsocks.json ### 2.3 获取中国IP段 将以下命令写入脚本保存执行(假设保存在/home/yang/bin/路由表/目录下): ```bash #!/bin/sh wget -c http://ftp.apnic.net/stats/apnic/delegated-apnic-latest cat delegated-apnic-latest | awk -F '|' '/CN/&&/ipv4/ {print $4 "/" 32-log($5)/log(2)}' | cat > /home/yang/bin/路由表/cn_rules.conf ``` ### 2.4 配置智能 DNS 服务 同上 ### 2.5 配置系统 DNS 服务器设置 同上 ### 2.6 写路由表启动和终止脚本 ```bash $ vim /usr/local/bin/socksfwd ``` ```bash #!/bin/bash SOCKS_SERVER=$SERVER_IP # SOCKS 服务器的 IP 地址 SOCKS_PORT=1081 # 本地SOCKS 服务器的端口 GATEWAY_IP=$(ip route|grep "default"|awk '{print $3}') # 家用网关(路由器)的 IP 地址,你也可以手动指定 TUN_NETWORK_DEV=tun0 # 选一个不冲突的 tun 设备号 TUN_NETWORK_PREFIX=10.0.0 # 选一个不冲突的内网 IP 段的前缀 start_fwd() { ip tuntap del dev "$TUN_NETWORK_DEV" mode tun # 添加虚拟网卡 ip tuntap add dev "$TUN_NETWORK_DEV" mode tun # 给虚拟网卡绑定IP地址 ip addr add "$TUN_NETWORK_PREFIX.1/24" dev "$TUN_NETWORK_DEV" # 启动虚拟网卡 ip link set "$TUN_NETWORK_DEV" up ip route del default via "$GATEWAY_IP" ip route add "$SOCKS_SERVER" via "$GATEWAY_IP" # 特殊ip段走家用网关(路由器)的 IP 地址(如局域网联机) # ip route add "172.16.39.0/24" via "$GATEWAY_IP" # 国内网段走家用网关(路由器)的 IP 地址 for i in $(cat /home/yang/bin/路由表/cn_rules.conf) do ip route add "$i" via "$GATEWAY_IP" done # 将默认网关设为虚拟网卡的IP地址 ip route add 0.0.0.0/1 via "$TUN_NETWORK_PREFIX.1" ip route add 128.0.0.0/1 via "$TUN_NETWORK_PREFIX.1" # 将socks5转为vpn badvpn-tun2socks --tundev "$TUN_NETWORK_DEV" --netif-ipaddr "$TUN_NETWORK_PREFIX.2" --netif-netmask 255.255.255.0 --socks-server-addr "127.0.0.1:$SOCKS_PORT" TUN2SOCKS_PID="$!" } stop_fwd() { ip route del 128.0.0.0/1 via "$TUN_NETWORK_PREFIX.1" ip route del 0.0.0.0/1 via "$TUN_NETWORK_PREFIX.1" for i in $(cat /home/yang/bin/路由表/cn_rules.conf) do ip route del "$i" via "$GATEWAY_IP" done ip route del "172.16.39.0/24" via "$GATEWAY_IP" ip route del "$SOCKS_SERVER" via "$GATEWAY_IP" ip route add default via "$GATEWAY_IP" ip link set "$TUN_NETWORK_DEV" down ip addr del "$TUN_NETWORK_PREFIX.1/24" dev "$TUN_NETWORK_DEV" ip tuntap del dev "$TUN_NETWORK_DEV" mode tun } start_fwd trap stop_fwd INT TERM wait "$TUN2SOCKS_PID" ``` ```bash $ vim /etc/systemd/system/socksfwd.service ``` ```bash [Unit] Description=Transparent SOCKS5 forwarding After=network-online.target [Service] Type=simple ExecStart=/usr/local/bin/socksfwd LimitNOFILE=1048576 [Install] WantedBy=multi-user.target ``` 启动服务 ```bash $ systemctl start socksfwd ``` 开机自启 ```bash $ systemctl enable socksfwd ``` ### 2.7 打开流量转发 ```bash $ cat /etc/sysctl.d/30-ipforward.conf ``` ```bash net.ipv4.ip_forward=1 net.ipv6.conf.all.forwarding = 1 net.ipv4.tcp_congestion_control=westwood net.ipv4.tcp_syn_retries = 5 net.ipv4.tcp_synack_retries = 5 ``` 编辑完成后,执行以下命令使变动立即生效 ```bash $ sysctl -p ```
json metadata{"tags":["circumvention"],"links":["https://dnscrypt.org/","https://github.com/chengr28/Pcap_DNSProxy","https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe_Linux.zh-Hans.txt","https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe.zh-Hans.txt","https://developers.google.com/speed/public-dns/docs/using"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinkcircumvention
permlink5bpjqs-linux
titlelinux全局智能分流方案
Transaction InfoBlock #17612067/Trx 99d045dfdc61b8ffdfca145cfc21fb648c9ffa60
View Raw JSON Data
{
  "block": 17612067,
  "op": [
    "comment",
    {
      "author": "ryyan",
      "body": "**本来我是决定不再写这样的文章了的。但是呢,最近连续配置了两次 `ArchLinux`,在配置这种东西的时候连续撞到了同样的坑,加上这段时间经常有人问我关于 `Linux` 下的 `shadowsocks` 的问题,所以我想了想还是写一篇记录一下吧,也免得自己以后再忘记了。**\n\n这里有两种方案,都可以实现全局智能分流。第一种方案的思路是使用 `ipset` 载入 `chnroute` 的 `IP` 列表并使用 `iptables` 实现带自动分流国内外流量的全局代理。为什么不用 `PAC` 呢?因为 `PAC` 这种东西只对浏览器有用。难道你在浏览器之外就不需要科学上网了吗?反正我是不信的……\n\n**本教程所用系统为 `Archlinux`,其他发型版类似,请自行参考相关资料。**\n\n## 1. 通过 iptables 实现智能分流\n\n### 1.1 安装相关软件\n\n* shadowsocks-libev\n* ipset\n\n```bash\n$ pacman -S shadowsocks-libev ipset\n```\n\n### 1.2 配置shadowsocks-libev(略过)\n\n假设shadowsocks配置文件为/etc/shadowsocks.json\n\n### 1.3 获取中国IP段\n\n将以下命令写入脚本保存执行(假设保存在/home/yang/bin/路由表/目录下):\n\n```bash\n#!/bin/sh\nwget -c http://ftp.apnic.net/stats/apnic/delegated-apnic-latest\ncat delegated-apnic-latest | awk -F '|' '/CN/&&/ipv4/ {print $4 \"/\" 32-log($5)/log(2)}' | cat > /home/yang/bin/路由表/cn_rules.conf\n```\n\n### 1.4 创建启动和关闭脚本\n\n```bash\n$ vim /home/yang/bin/shadowsocks/ss-up.sh\n```\n\n```bash\n#!/bin/bash\n\nSOCKS_SERVER=$SERVER_IP # SOCKS 服务器的 IP 地址\n# Setup the ipset\nipset -N chnroute hash:net maxelem 65536\n\nfor ip in $(cat '/home/yang/bin/路由表/cn_rules.conf'); do\n  ipset add chnroute $ip\ndone\n\n# 在nat表中新增一个链,名叫:SHADOWSOCKS\niptables -t nat -N SHADOWSOCKS\n\n# Allow connection to the server\niptables -t nat -A SHADOWSOCKS -d $SOCKS_SERVER -j RETURN\n\n# Allow connection to reserved networks\niptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN\n\n# Allow connection to chinese IPs\niptables -t nat -A SHADOWSOCKS -p tcp -m set --match-set chnroute dst -j RETURN\n# 如果你想对 icmp 协议也实现智能分流,可以加上下面这一条\n# iptables -t nat -A SHADOWSOCKS -p icmp -m set --match-set chnroute dst -j RETURN\n\n# Redirect to Shadowsocks\n# 把1081改成你的shadowsocks本地端口\niptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-port 1081\n# 如果你想对 icmp 协议也实现智能分流,可以加上下面这一条\n# iptables -t nat -A SHADOWSOCKS -p icmp -j REDIRECT --to-port 1081\n\n# 将SHADOWSOCKS链中所有的规则追加到OUTPUT链中\niptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS\n# 如果你想对 icmp 协议也实现智能分流,可以加上下面这一条\n# iptables -t nat -A OUTPUT -p icmp -j SHADOWSOCKS\n```\n&emsp;&emsp;这是在启动 `shadowsocks` 之前执行的脚本,用来设置 `iptables` 规则,对全局应用代理并将 `chnroute` 导入 `ipset` 来实现自动分流。注意要把服务器 `IP` 和本地端口相关的代码全部替换成你自己的。\n&emsp;&emsp;这里就有一个坑了,就是在把 `chnroute.txt` 加入 `ipset` 的时候。因为 `chnroute.txt` 是一个 `IP` 段列表,而中国持有的 `IP` 数量上还是比较大的,所以如果使用 `hash:ip` 来导入的话会使内存溢出。我在第二次重新配置的时候就撞进了这个大坑……\n&emsp;&emsp;但是你也不能尝试把整个列表导入 `iptables`。虽然导入 `iptables` 不会导致内存溢出,但是 `iptables` 是线性查表,即使你全部导入进去,也会因为低下的性能而抓狂。\n\n然后再创建 `/home/yang/bin/shadowsocks/ss-down.sh`, 这是用来清除上述规则的脚本,比较简单\n\n```bash\n#!/bin/bash\n\n# iptables -t nat -D OUTPUT -p icmp -j SHADOWSOCKS\niptables -t nat -D OUTPUT -p tcp -j SHADOWSOCKS\niptables -t nat -F SHADOWSOCKS\niptables -t nat -X SHADOWSOCKS\nipset destroy chnroute\n```\n\n接着执行\n\n```bash\n$ chmod +x ss-up.sh\n$ chmod +x ss-down.sh\n```\n\n### 1.5 配置ss-redir服务\n\n首先,默认的 `ss-local` 并不能用来作为 `iptables` 流量转发的目标,因为它是 `socks5` 代理而非透明代理。我们至少要把 `systemd` 执行的程序改成 `ss-redir`。其次,上述两个脚本还不能自动执行,必须让 `systemd` 分别在启动 `shadowsocks` 之前和关闭之后将脚本执行,这样才能自动配置好 `iptables` 规则。\n\n```bash\n$ vim /usr/lib/systemd/system/[email protected]\n```\n\n```bash\n[Unit]\nDescription=Shadowsocks-Libev Client Service\nAfter=network.target\n\n[Service]\nUser=root\nCapabilityBoundingSet=~CAP_SYS_ADMIN\nExecStart=\nExecStartPre=/home/yang/bin/shadowsocks/ss-up.sh\nExecStart=/usr/bin/ss-redir -u -c /etc/%i.json\nExecStopPost=/home/yang/bin/shadowsocks/ss-down.sh\n\n[Install]\nWantedBy=multi-user.target\n```\n然后启动服务\n```bash\n$ systemctl start shadowsocks-libev@shadowsocks\n```\n\n开机自启\n\n```bash\n$ systemctl enable shadowsocks-libev@shadowsocks\n```\n\n### 1.6 配置智能 DNS 服务\n\n完成了以上工作之后是不是就可以实现全局科学上网了呢?答案是否定的,我们还有最后一项工作需要完成,那就是解决 `DNS` 污染问题。如果你不知道什么是 `DNS` 污染,我可以简单地给你普及一下:\n\n> `DNS` 污染是一种让一般用户由于得到虚假目标主机 `IP` 而不能与其通信的方法,是一种 `DNS` 缓存投毒攻击(DNS cache poisoning)。其工作方式是:由于通常的 `DNS` 查询没有任何认证机制,而且 `DNS` 查询通常基于的 `UDP` 是无连接不可靠的协议,因此 `DNS` 的查询非常容易被篡改,通过对 `UDP` 端口 53 上的 `DNS` 查询进行入侵检测,一经发现与关键词相匹配的请求则立即伪装成目标域名的解析服务器(NS,Name Server)给查询者返回虚假结果。\n\n`DNS` 污染症状:目前一些被禁止访问的网站很多就是通过 `DNS` 污染来实现的,例如 `YouTube`、`Facebook` 等网站。\n\n**应对dns污染的方法**\n\n- 对于 `DNS` 污染,可以说,个人用户很难单单靠设置解决,通常可以使用 `VPN` 或者域名远程解析的方法解决,但这大多需要购买付费的 `VPN` 或 `SSH` 等\n- 修改 `Hosts` 的方法,手动设置域名正确的 `IP` 地址\n- `dns` 加密解析:[DNSCrypt](https://dnscrypt.org/)\n- 忽略 `DNS` 投毒污染小工具:[Pcap_DNSProxy](https://github.com/chengr28/Pcap_DNSProxy)\n\n我们选择用 `Pcap_DNSProxy` 来解决这个问题,以前用的是 `Pdnsd + Dnsmasq` 组合, 后来发现 `TCP` 请求效率太低加上家里网络与那些国外的 `DNS` 丢包实在是严重, 所以打算用 `Pcap_DNSProxy` 代替 `Pdnsd`。\n\n关于 `Pcap_DNSProxy` 的详细介绍,可以参考:\n[https://github.com/chengr28/Pcap_DNSProxy](https://github.com/chengr28/Pcap_DNSProxy)\n安装过程可以参考:\n[https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe_Linux.zh-Hans.txt](https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe_Linux.zh-Hans.txt)\n更详细的使用说明可以参考:\n[https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe.zh-Hans.txt](https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe.zh-Hans.txt)\n\n这里主要重点强调一些需要注意的配置项:\n\n- `DNS` - 境外域名解析参数区域(这是最关键的一项配置)\n\n```bash\n[DNS]\n# 这里一定要填 IPv4 + TCP!!!表示只使用 TCP 协议向境外远程 DNS 服务器发出请求\nOutgoing Protocol = IPv4 + TCP\n# 建议当系统使用全局代理功能时启用,程序将除境内服务器外的所有请求直接交给系统而不作任何过滤等处理,系统会将请求自动发往远程服务器进行解析\nDirect Request = IPv4\n...\n...\n```\n\n- `Local DNS` - 境内域名解析参数区域\n\n```bash\n[Local DNS]\n# 发送请求到境内 DNS 服务器时所使用的协议\nLocal Protocol = IPv4 + UDP\n...\n...\n```\n\n- `Addresses` - 普通模式地址区域\n\n```bash\n[Addresses]\n...\n...\n# IPv4 主要境外 DNS 服务器地址\nIPv4 Main DNS Address = 8.8.4.4:53\n# IPv4 备用境外 DNS 服务器地址\nIPv4 Alternate DNS Address = 8.8.8.8:53|208.67.220.220:443|208.67.222.222:5353\n# IPv4 主要境内 DNS 服务器地址,用于境内域名解析,推荐使用 onedns\nIPv4 Local Main DNS Address = 112.124.47.27:53\n# IPv4 备用境内 DNS 服务器地址,用于境内域名解析\nIPv4 Local Alternate DNS Address = 114.215.126.16:53\n...\n...\n```\n\n### 1.7 配置系统 DNS 服务器设置\n\n* 可参见 [https://developers.google.com/speed/public-dns/docs/using](https://developers.google.com/speed/public-dns/docs/using) 中 `Changing your DNS servers settings` 中 `Linux` 一节\n\n* 图形界面以 `GNOME 3` 为例:\n\n* 打开所有程序列表,并 -> 设置 – 硬件分类 – 网络\n\n* 如果要对当前的网络配置进行编辑 -&gt; 单击齿轮按钮\n\n* 选中 `IPv4`\n\n* `DNS` 栏目中,将自动拨向关闭\n\n* 在服务器中填入 `127.0.0.1` (或103.214.195.99:7300)并应用\n\n* 选中 `IPv6`\n\n* `DNS` 栏目中,将自动拨向关闭\n\n* 在服务器中填入 ::1 并应用\n\n* 请务必确保只填入这两个地址,填入其它地址可能会导致系统选择其它 DNS 服务器绕过程序的代理\n\n* 重启网络连接\n\n* 直接修改系统文件修改 DNS 服务器设置:\n\n* 自动获取地址(DHCP)时:\n\n* 以 `root` 权限进入 `/etc/dhcp` 或 `/etc/dhcp3` 目录(视乎 dhclient.conf 文件位置)\n\n* 直接修改 `dhclient.conf` 文件,修改或添加 `prepend domain-name-servers` 一项即可\n\n* 如果 `prepend domain-name-servers` 一项被 # 注释则需要把注释去掉以使配置生效,不需要添加新的条目\n\n* `dhclient.conf` 文件可能存在多个 `prepend domain-name-servers` 项,是各个网络接口的配置项目,直接修改总的配置项目即可\n\n* 使用 `service network(/networking) restart` 或 `ifdown/ifup` 或 `ifconfig stop/start` 重启网络服务/网络端口\n\n* 非自动获取地址(DHCP)时:\n\n* 以 `root` 权限进入 `/etc` 目录\n\n* 直接修改 `resolv.conf` 文件里的 `nameserver` 即可\n\n* 如果重启后配置被覆盖,则需要修改或新建 `/etc/resolvconf/resolv.conf.d` 文件,内容和 `resolv.conf` 一样\n\n* 使用 `service network(/networking) restart` 或 `ifdown/ifup` 或 `ifconfig stop/start` 重启网络服务/网络端口\n\n### 1.8 打开流量转发\n\n```bash\n$ cat /etc/sysctl.d/30-ipforward.conf\n```\n\n```bash\nnet.ipv4.ip_forward=1\n\nnet.ipv6.conf.all.forwarding = 1\n\nnet.ipv4.tcp_congestion_control=westwood\n\nnet.ipv4.tcp_syn_retries = 5\n\nnet.ipv4.tcp_synack_retries = 5\n```\n编辑完成后,执行以下命令使变动立即生效\n\n```bash\n$ sysctl -p\n```\n\n方案一固然可以实现全局智能分流,可这里有一个问题,它并不能让连接到此电脑上的设备也实现智能分流,也就是说,它还不能当成一个翻墙路由器使用,下面我们介绍的方案二便可以解决这个问题。前面的步骤大致相似,到后面略有不同。\n\n## 2. 通过策略路由实现智能分流\n\n### 2.1 安装相关软件\n\n* badvpn\n* pdnsd\n* shadowsocks\n\n```bash\n$ pacman -S badvpn pdnsd shadowsocks\n```\n\n### 2.2 配置shadowsocks(略过)\n假设shadowsocks配置文件为/etc/shadowsocks.json\n\n### 2.3 获取中国IP段\n\n将以下命令写入脚本保存执行(假设保存在/home/yang/bin/路由表/目录下):\n\n```bash\n#!/bin/sh\nwget -c http://ftp.apnic.net/stats/apnic/delegated-apnic-latest\ncat delegated-apnic-latest | awk -F '|' '/CN/&&/ipv4/ {print $4 \"/\" 32-log($5)/log(2)}' | cat > /home/yang/bin/路由表/cn_rules.conf\n```\n\n### 2.4 配置智能 DNS 服务\n\n同上\n\n### 2.5 配置系统 DNS 服务器设置\n\n同上\n\n### 2.6 写路由表启动和终止脚本\n\n```bash\n$ vim /usr/local/bin/socksfwd\n```\n\n```bash\n#!/bin/bash\nSOCKS_SERVER=$SERVER_IP # SOCKS 服务器的 IP 地址\nSOCKS_PORT=1081 # 本地SOCKS 服务器的端口\nGATEWAY_IP=$(ip route|grep \"default\"|awk '{print $3}') # 家用网关(路由器)的 IP 地址,你也可以手动指定\nTUN_NETWORK_DEV=tun0 # 选一个不冲突的 tun 设备号\nTUN_NETWORK_PREFIX=10.0.0 # 选一个不冲突的内网 IP 段的前缀\n\n\nstart_fwd() {\nip tuntap del dev \"$TUN_NETWORK_DEV\" mode tun\n# 添加虚拟网卡\nip tuntap add dev \"$TUN_NETWORK_DEV\" mode tun\n# 给虚拟网卡绑定IP地址\nip addr add \"$TUN_NETWORK_PREFIX.1/24\" dev \"$TUN_NETWORK_DEV\"\n# 启动虚拟网卡\nip link set \"$TUN_NETWORK_DEV\" up\nip route del default via \"$GATEWAY_IP\"\nip route add \"$SOCKS_SERVER\" via \"$GATEWAY_IP\"\n# 特殊ip段走家用网关(路由器)的 IP 地址(如局域网联机)\n# ip route add \"172.16.39.0/24\" via \"$GATEWAY_IP\"\n# 国内网段走家用网关(路由器)的 IP 地址\nfor i in $(cat /home/yang/bin/路由表/cn_rules.conf)\ndo\nip route add \"$i\" via \"$GATEWAY_IP\"\ndone\n# 将默认网关设为虚拟网卡的IP地址\nip route add 0.0.0.0/1 via \"$TUN_NETWORK_PREFIX.1\"\nip route add 128.0.0.0/1 via \"$TUN_NETWORK_PREFIX.1\"\n# 将socks5转为vpn\nbadvpn-tun2socks --tundev \"$TUN_NETWORK_DEV\" --netif-ipaddr \"$TUN_NETWORK_PREFIX.2\" --netif-netmask 255.255.255.0 --socks-server-addr \"127.0.0.1:$SOCKS_PORT\"\nTUN2SOCKS_PID=\"$!\"\n}\n\n\nstop_fwd() {\nip route del 128.0.0.0/1 via \"$TUN_NETWORK_PREFIX.1\"\nip route del 0.0.0.0/1 via \"$TUN_NETWORK_PREFIX.1\"\nfor i in $(cat /home/yang/bin/路由表/cn_rules.conf)\ndo\nip route del \"$i\" via \"$GATEWAY_IP\"\ndone\nip route del \"172.16.39.0/24\" via \"$GATEWAY_IP\"\nip route del \"$SOCKS_SERVER\" via \"$GATEWAY_IP\"\nip route add default via \"$GATEWAY_IP\"\nip link set \"$TUN_NETWORK_DEV\" down\nip addr del \"$TUN_NETWORK_PREFIX.1/24\" dev \"$TUN_NETWORK_DEV\"\nip tuntap del dev \"$TUN_NETWORK_DEV\" mode tun\n}\n\n\n\nstart_fwd\ntrap stop_fwd INT TERM\nwait \"$TUN2SOCKS_PID\"\n```\n\n```bash\n$ vim /etc/systemd/system/socksfwd.service\n```\n\n```bash\n[Unit]\n\nDescription=Transparent SOCKS5 forwarding\n\nAfter=network-online.target\n\n[Service]\n\nType=simple\n\nExecStart=/usr/local/bin/socksfwd\n\nLimitNOFILE=1048576\n\n\n[Install]\n\nWantedBy=multi-user.target\n```\n\n启动服务\n\n```bash\n$ systemctl start socksfwd\n```\n\n开机自启\n\n```bash\n$ systemctl enable socksfwd\n```\n\n### 2.7 打开流量转发\n\n```bash\n$ cat /etc/sysctl.d/30-ipforward.conf\n```\n\n```bash\nnet.ipv4.ip_forward=1\n\nnet.ipv6.conf.all.forwarding = 1\n\nnet.ipv4.tcp_congestion_control=westwood\n\nnet.ipv4.tcp_syn_retries = 5\n\nnet.ipv4.tcp_synack_retries = 5\n```\n\n编辑完成后,执行以下命令使变动立即生效\n\n```bash\n$ sysctl -p\n```",
      "json_metadata": "{\"tags\":[\"circumvention\"],\"links\":[\"https://dnscrypt.org/\",\"https://github.com/chengr28/Pcap_DNSProxy\",\"https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe_Linux.zh-Hans.txt\",\"https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe.zh-Hans.txt\",\"https://developers.google.com/speed/public-dns/docs/using\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "circumvention",
      "permlink": "5bpjqs-linux",
      "title": "linux全局智能分流方案"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T07:44:33",
  "trx_id": "99d045dfdc61b8ffdfca145cfc21fb648c9ffa60",
  "trx_in_block": 8,
  "virtual_op": 0
}
ryyanupdated their account properties
2017/11/28 07:43:57
accountryyan
json metadata{"profile":{"name":"ryan","about":"云计算工程师,不务正业,随心所欲","profile_image":"http://o7z41ciog.bkt.clouddn.com/05ba932c.jpg"}}
memo keySTM824xHURUciC4qWdkset97fQnueFnD8Qx1VcUAqkJmtFzzp4hzo
Transaction InfoBlock #17612055/Trx 61ea6313042def309058872264d6e1ac01114a9a
View Raw JSON Data
{
  "block": 17612055,
  "op": [
    "account_update",
    {
      "account": "ryyan",
      "json_metadata": "{\"profile\":{\"name\":\"ryan\",\"about\":\"云计算工程师,不务正业,随心所欲\",\"profile_image\":\"http://o7z41ciog.bkt.clouddn.com/05ba932c.jpg\"}}",
      "memo_key": "STM824xHURUciC4qWdkset97fQnueFnD8Qx1VcUAqkJmtFzzp4hzo"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T07:43:57",
  "trx_id": "61ea6313042def309058872264d6e1ac01114a9a",
  "trx_in_block": 6,
  "virtual_op": 0
}
ryyanpublished a new post: linux
2017/11/28 07:29:36
authorryyan
body**本来我是决定不再写这样的文章了的。但是呢,最近连续配置了两次 `ArchLinux`,在配置这种东西的时候连续撞到了同样的坑,加上这段时间经常有人问我关于 `Linux` 下的 `shadowsocks` 的问题,所以我想了想还是写一篇记录一下吧,也免得自己以后再忘记了。** 这里有两种方案,都可以实现全局智能分流。第一种方案的思路是使用 `ipset` 载入 `chnroute` 的 `IP` 列表并使用 `iptables` 实现带自动分流国内外流量的全局代理。为什么不用 `PAC` 呢?因为 `PAC` 这种东西只对浏览器有用。难道你在浏览器之外就不需要科学上网了吗?反正我是不信的…… **本教程所用系统为 `Archlinux`,其他发型版类似,请自行参考相关资料。** ## 1. 通过 iptables 实现智能分流 ### 1.1 安装相关软件 * shadowsocks-libev * ipset ```bash $ pacman -S shadowsocks-libev ipset ``` ### 1.2 配置shadowsocks-libev(略过) 假设shadowsocks配置文件为/etc/shadowsocks.json ### 1.3 获取中国IP段 将以下命令写入脚本保存执行(假设保存在/home/yang/bin/路由表/目录下): ```bash #!/bin/sh wget -c http://ftp.apnic.net/stats/apnic/delegated-apnic-latest cat delegated-apnic-latest | awk -F '|' '/CN/&&/ipv4/ {print $4 "/" 32-log($5)/log(2)}' | cat > /home/yang/bin/路由表/cn_rules.conf ``` ### 1.4 创建启动和关闭脚本 ```bash $ vim /home/yang/bin/shadowsocks/ss-up.sh ``` ```bash #!/bin/bash SOCKS_SERVER=$SERVER_IP # SOCKS 服务器的 IP 地址 # Setup the ipset ipset -N chnroute hash:net maxelem 65536 for ip in $(cat '/home/yang/bin/路由表/cn_rules.conf'); do ipset add chnroute $ip done # 在nat表中新增一个链,名叫:SHADOWSOCKS iptables -t nat -N SHADOWSOCKS # Allow connection to the server iptables -t nat -A SHADOWSOCKS -d $SOCKS_SERVER -j RETURN # Allow connection to reserved networks iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN # Allow connection to chinese IPs iptables -t nat -A SHADOWSOCKS -p tcp -m set --match-set chnroute dst -j RETURN # 如果你想对 icmp 协议也实现智能分流,可以加上下面这一条 # iptables -t nat -A SHADOWSOCKS -p icmp -m set --match-set chnroute dst -j RETURN # Redirect to Shadowsocks # 把1081改成你的shadowsocks本地端口 iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-port 1081 # 如果你想对 icmp 协议也实现智能分流,可以加上下面这一条 # iptables -t nat -A SHADOWSOCKS -p icmp -j REDIRECT --to-port 1081 # 将SHADOWSOCKS链中所有的规则追加到OUTPUT链中 iptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS # 如果你想对 icmp 协议也实现智能分流,可以加上下面这一条 # iptables -t nat -A OUTPUT -p icmp -j SHADOWSOCKS ``` &emsp;&emsp;这是在启动 `shadowsocks` 之前执行的脚本,用来设置 `iptables` 规则,对全局应用代理并将 `chnroute` 导入 `ipset` 来实现自动分流。注意要把服务器 `IP` 和本地端口相关的代码全部替换成你自己的。 &emsp;&emsp;这里就有一个坑了,就是在把 `chnroute.txt` 加入 `ipset` 的时候。因为 `chnroute.txt` 是一个 `IP` 段列表,而中国持有的 `IP` 数量上还是比较大的,所以如果使用 `hash:ip` 来导入的话会使内存溢出。我在第二次重新配置的时候就撞进了这个大坑…… &emsp;&emsp;但是你也不能尝试把整个列表导入 `iptables`。虽然导入 `iptables` 不会导致内存溢出,但是 `iptables` 是线性查表,即使你全部导入进去,也会因为低下的性能而抓狂。 然后再创建 `/home/yang/bin/shadowsocks/ss-down.sh`, 这是用来清除上述规则的脚本,比较简单 ```bash #!/bin/bash # iptables -t nat -D OUTPUT -p icmp -j SHADOWSOCKS iptables -t nat -D OUTPUT -p tcp -j SHADOWSOCKS iptables -t nat -F SHADOWSOCKS iptables -t nat -X SHADOWSOCKS ipset destroy chnroute ``` 接着执行 ```bash $ chmod +x ss-up.sh $ chmod +x ss-down.sh ``` ### 1.5 配置ss-redir服务 首先,默认的 `ss-local` 并不能用来作为 `iptables` 流量转发的目标,因为它是 `socks5` 代理而非透明代理。我们至少要把 `systemd` 执行的程序改成 `ss-redir`。其次,上述两个脚本还不能自动执行,必须让 `systemd` 分别在启动 `shadowsocks` 之前和关闭之后将脚本执行,这样才能自动配置好 `iptables` 规则。 ```bash $ vim /usr/lib/systemd/system/[email protected] ``` ```bash [Unit] Description=Shadowsocks-Libev Client Service After=network.target [Service] User=root CapabilityBoundingSet=~CAP_SYS_ADMIN ExecStart= ExecStartPre=/home/yang/bin/shadowsocks/ss-up.sh ExecStart=/usr/bin/ss-redir -u -c /etc/%i.json ExecStopPost=/home/yang/bin/shadowsocks/ss-down.sh [Install] WantedBy=multi-user.target ``` 然后启动服务 ```bash $ systemctl start shadowsocks-libev@shadowsocks ``` 开机自启 ```bash $ systemctl enable shadowsocks-libev@shadowsocks ``` ### 1.6 配置智能 DNS 服务 完成了以上工作之后是不是就可以实现全局科学上网了呢?答案是否定的,我们还有最后一项工作需要完成,那就是解决 `DNS` 污染问题。如果你不知道什么是 `DNS` 污染,我可以简单地给你普及一下: > `DNS` 污染是一种让一般用户由于得到虚假目标主机 `IP` 而不能与其通信的方法,是一种 `DNS` 缓存投毒攻击(DNS cache poisoning)。其工作方式是:由于通常的 `DNS` 查询没有任何认证机制,而且 `DNS` 查询通常基于的 `UDP` 是无连接不可靠的协议,因此 `DNS` 的查询非常容易被篡改,通过对 `UDP` 端口 53 上的 `DNS` 查询进行入侵检测,一经发现与关键词相匹配的请求则立即伪装成目标域名的解析服务器(NS,Name Server)给查询者返回虚假结果。 `DNS` 污染症状:目前一些被禁止访问的网站很多就是通过 `DNS` 污染来实现的,例如 `YouTube`、`Facebook` 等网站。 **应对dns污染的方法** - 对于 `DNS` 污染,可以说,个人用户很难单单靠设置解决,通常可以使用 `VPN` 或者域名远程解析的方法解决,但这大多需要购买付费的 `VPN` 或 `SSH` 等 - 修改 `Hosts` 的方法,手动设置域名正确的 `IP` 地址 - `dns` 加密解析:[DNSCrypt](https://dnscrypt.org/) - 忽略 `DNS` 投毒污染小工具:[Pcap_DNSProxy](https://github.com/chengr28/Pcap_DNSProxy) 我们选择用 `Pcap_DNSProxy` 来解决这个问题,以前用的是 `Pdnsd + Dnsmasq` 组合, 后来发现 `TCP` 请求效率太低加上家里网络与那些国外的 `DNS` 丢包实在是严重, 所以打算用 `Pcap_DNSProxy` 代替 `Pdnsd`。 关于 `Pcap_DNSProxy` 的详细介绍,可以参考: [https://github.com/chengr28/Pcap_DNSProxy](https://github.com/chengr28/Pcap_DNSProxy) 安装过程可以参考: [https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe_Linux.zh-Hans.txt](https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe_Linux.zh-Hans.txt) 更详细的使用说明可以参考: [https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe.zh-Hans.txt](https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe.zh-Hans.txt) 这里主要重点强调一些需要注意的配置项: - `DNS` - 境外域名解析参数区域(这是最关键的一项配置) ```bash [DNS] # 这里一定要填 IPv4 + TCP!!!表示只使用 TCP 协议向境外远程 DNS 服务器发出请求 Outgoing Protocol = IPv4 + TCP # 建议当系统使用全局代理功能时启用,程序将除境内服务器外的所有请求直接交给系统而不作任何过滤等处理,系统会将请求自动发往远程服务器进行解析 Direct Request = IPv4 ... ... ``` - `Local DNS` - 境内域名解析参数区域 ```bash [Local DNS] # 发送请求到境内 DNS 服务器时所使用的协议 Local Protocol = IPv4 + UDP ... ... ``` - `Addresses` - 普通模式地址区域 ```bash [Addresses] ... ... # IPv4 主要境外 DNS 服务器地址 IPv4 Main DNS Address = 8.8.4.4:53 # IPv4 备用境外 DNS 服务器地址 IPv4 Alternate DNS Address = 8.8.8.8:53|208.67.220.220:443|208.67.222.222:5353 # IPv4 主要境内 DNS 服务器地址,用于境内域名解析,推荐使用 onedns IPv4 Local Main DNS Address = 112.124.47.27:53 # IPv4 备用境内 DNS 服务器地址,用于境内域名解析 IPv4 Local Alternate DNS Address = 114.215.126.16:53 ... ... ``` ### 1.7 配置系统 DNS 服务器设置 * 可参见 [https://developers.google.com/speed/public-dns/docs/using](https://developers.google.com/speed/public-dns/docs/using) 中 `Changing your DNS servers settings` 中 `Linux` 一节 * 图形界面以 `GNOME 3` 为例: * 打开所有程序列表,并 -> 设置 – 硬件分类 – 网络 * 如果要对当前的网络配置进行编辑 -&gt; 单击齿轮按钮 * 选中 `IPv4` * `DNS` 栏目中,将自动拨向关闭 * 在服务器中填入 `127.0.0.1` (或103.214.195.99:7300)并应用 * 选中 `IPv6` * `DNS` 栏目中,将自动拨向关闭 * 在服务器中填入 ::1 并应用 * 请务必确保只填入这两个地址,填入其它地址可能会导致系统选择其它 DNS 服务器绕过程序的代理 * 重启网络连接 * 直接修改系统文件修改 DNS 服务器设置: * 自动获取地址(DHCP)时: * 以 `root` 权限进入 `/etc/dhcp` 或 `/etc/dhcp3` 目录(视乎 dhclient.conf 文件位置) * 直接修改 `dhclient.conf` 文件,修改或添加 `prepend domain-name-servers` 一项即可 * 如果 `prepend domain-name-servers` 一项被 # 注释则需要把注释去掉以使配置生效,不需要添加新的条目 * `dhclient.conf` 文件可能存在多个 `prepend domain-name-servers` 项,是各个网络接口的配置项目,直接修改总的配置项目即可 * 使用 `service network(/networking) restart` 或 `ifdown/ifup` 或 `ifconfig stop/start` 重启网络服务/网络端口 * 非自动获取地址(DHCP)时: * 以 `root` 权限进入 `/etc` 目录 * 直接修改 `resolv.conf` 文件里的 `nameserver` 即可 * 如果重启后配置被覆盖,则需要修改或新建 `/etc/resolvconf/resolv.conf.d` 文件,内容和 `resolv.conf` 一样 * 使用 `service network(/networking) restart` 或 `ifdown/ifup` 或 `ifconfig stop/start` 重启网络服务/网络端口 ### 1.8 打开流量转发 ```bash $ cat /etc/sysctl.d/30-ipforward.conf ``` ```bash net.ipv4.ip_forward=1 net.ipv6.conf.all.forwarding = 1 net.ipv4.tcp_congestion_control=westwood net.ipv4.tcp_syn_retries = 5 net.ipv4.tcp_synack_retries = 5 ``` 编辑完成后,执行以下命令使变动立即生效 ```bash $ sysctl -p ``` 方案一固然可以实现全局智能分流,可这里有一个问题,它并不能让连接到此电脑上的设备也实现智能分流,也就是说,它还不能当成一个翻墙路由器使用,下面我们介绍的方案二便可以解决这个问题。前面的步骤大致相似,到后面略有不同。 ## 2. 通过策略路由实现智能分流 ### 2.1 安装相关软件 * badvpn * pdnsd * shadowsocks ```bash $ pacman -S badvpn pdnsd shadowsocks ``` ### 2.2 配置shadowsocks(略过) 假设shadowsocks配置文件为/etc/shadowsocks.json ### 2.3 获取中国IP段 将以下命令写入脚本保存执行(假设保存在/home/yang/bin/路由表/目录下): ```bash #!/bin/sh wget -c http://ftp.apnic.net/stats/apnic/delegated-apnic-latest cat delegated-apnic-latest | awk -F '|' '/CN/&&/ipv4/ {print $4 "/" 32-log($5)/log(2)}' | cat > /home/yang/bin/路由表/cn_rules.conf ``` ### 2.4 配置智能 DNS 服务 同上 ### 2.5 配置系统 DNS 服务器设置 同上 ### 2.6 写路由表启动和终止脚本 ```bash $ vim /usr/local/bin/socksfwd ``` ```bash #!/bin/bash SOCKS_SERVER=$SERVER_IP # SOCKS 服务器的 IP 地址 SOCKS_PORT=1081 # 本地SOCKS 服务器的端口 GATEWAY_IP=$(ip route|grep "default"|awk '{print $3}') # 家用网关(路由器)的 IP 地址,你也可以手动指定 TUN_NETWORK_DEV=tun0 # 选一个不冲突的 tun 设备号 TUN_NETWORK_PREFIX=10.0.0 # 选一个不冲突的内网 IP 段的前缀 start_fwd() { ip tuntap del dev "$TUN_NETWORK_DEV" mode tun # 添加虚拟网卡 ip tuntap add dev "$TUN_NETWORK_DEV" mode tun # 给虚拟网卡绑定IP地址 ip addr add "$TUN_NETWORK_PREFIX.1/24" dev "$TUN_NETWORK_DEV" # 启动虚拟网卡 ip link set "$TUN_NETWORK_DEV" up ip route del default via "$GATEWAY_IP" ip route add "$SOCKS_SERVER" via "$GATEWAY_IP" # 特殊ip段走家用网关(路由器)的 IP 地址(如局域网联机) # ip route add "172.16.39.0/24" via "$GATEWAY_IP" # 国内网段走家用网关(路由器)的 IP 地址 for i in $(cat /home/yang/bin/路由表/cn_rules.conf) do ip route add "$i" via "$GATEWAY_IP" done # 将默认网关设为虚拟网卡的IP地址 ip route add 0.0.0.0/1 via "$TUN_NETWORK_PREFIX.1" ip route add 128.0.0.0/1 via "$TUN_NETWORK_PREFIX.1" # 将socks5转为vpn badvpn-tun2socks --tundev "$TUN_NETWORK_DEV" --netif-ipaddr "$TUN_NETWORK_PREFIX.2" --netif-netmask 255.255.255.0 --socks-server-addr "127.0.0.1:$SOCKS_PORT" TUN2SOCKS_PID="$!" } stop_fwd() { ip route del 128.0.0.0/1 via "$TUN_NETWORK_PREFIX.1" ip route del 0.0.0.0/1 via "$TUN_NETWORK_PREFIX.1" for i in $(cat /home/yang/bin/路由表/cn_rules.conf) do ip route del "$i" via "$GATEWAY_IP" done ip route del "172.16.39.0/24" via "$GATEWAY_IP" ip route del "$SOCKS_SERVER" via "$GATEWAY_IP" ip route add default via "$GATEWAY_IP" ip link set "$TUN_NETWORK_DEV" down ip addr del "$TUN_NETWORK_PREFIX.1/24" dev "$TUN_NETWORK_DEV" ip tuntap del dev "$TUN_NETWORK_DEV" mode tun } start_fwd trap stop_fwd INT TERM wait "$TUN2SOCKS_PID" ``` ```bash $ vim /etc/systemd/system/socksfwd.service ``` ```bash [Unit] Description=Transparent SOCKS5 forwarding After=network-online.target [Service] Type=simple ExecStart=/usr/local/bin/socksfwd LimitNOFILE=1048576 [Install] WantedBy=multi-user.target ``` 启动服务 ```bash $ systemctl start socksfwd ``` 开机自启 ```bash $ systemctl enable socksfwd ``` ### 2.7 打开流量转发 ```bash $ cat /etc/sysctl.d/30-ipforward.conf ``` ```bash net.ipv4.ip_forward=1 net.ipv6.conf.all.forwarding = 1 net.ipv4.tcp_congestion_control=westwood net.ipv4.tcp_syn_retries = 5 net.ipv4.tcp_synack_retries = 5 ``` 编辑完成后,执行以下命令使变动立即生效 ```bash $ sysctl -p ```
json metadata{"tags":["circumvention","technology"],"links":["https://dnscrypt.org/","https://github.com/chengr28/Pcap_DNSProxy","https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe_Linux.zh-Hans.txt","https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe.zh-Hans.txt","https://developers.google.com/speed/public-dns/docs/using"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinkcircumvention
permlinklinux
titlelinux全局智能分流方案
Transaction InfoBlock #17611768/Trx f3318dc25ef58c524d9eb57f85dfc77271a7bfad
View Raw JSON Data
{
  "block": 17611768,
  "op": [
    "comment",
    {
      "author": "ryyan",
      "body": "**本来我是决定不再写这样的文章了的。但是呢,最近连续配置了两次 `ArchLinux`,在配置这种东西的时候连续撞到了同样的坑,加上这段时间经常有人问我关于 `Linux` 下的 `shadowsocks` 的问题,所以我想了想还是写一篇记录一下吧,也免得自己以后再忘记了。**\n\n这里有两种方案,都可以实现全局智能分流。第一种方案的思路是使用 `ipset` 载入 `chnroute` 的 `IP` 列表并使用 `iptables` 实现带自动分流国内外流量的全局代理。为什么不用 `PAC` 呢?因为 `PAC` 这种东西只对浏览器有用。难道你在浏览器之外就不需要科学上网了吗?反正我是不信的……\n\n**本教程所用系统为 `Archlinux`,其他发型版类似,请自行参考相关资料。**\n\n## 1. 通过 iptables 实现智能分流\n\n### 1.1 安装相关软件\n\n* shadowsocks-libev\n* ipset\n\n```bash\n$ pacman -S shadowsocks-libev ipset\n```\n\n### 1.2 配置shadowsocks-libev(略过)\n\n假设shadowsocks配置文件为/etc/shadowsocks.json\n\n### 1.3 获取中国IP段\n\n将以下命令写入脚本保存执行(假设保存在/home/yang/bin/路由表/目录下):\n\n```bash\n#!/bin/sh\nwget -c http://ftp.apnic.net/stats/apnic/delegated-apnic-latest\ncat delegated-apnic-latest | awk -F '|' '/CN/&&/ipv4/ {print $4 \"/\" 32-log($5)/log(2)}' | cat > /home/yang/bin/路由表/cn_rules.conf\n```\n\n### 1.4 创建启动和关闭脚本\n\n```bash\n$ vim /home/yang/bin/shadowsocks/ss-up.sh\n```\n\n```bash\n#!/bin/bash\n\nSOCKS_SERVER=$SERVER_IP # SOCKS 服务器的 IP 地址\n# Setup the ipset\nipset -N chnroute hash:net maxelem 65536\n\nfor ip in $(cat '/home/yang/bin/路由表/cn_rules.conf'); do\n  ipset add chnroute $ip\ndone\n\n# 在nat表中新增一个链,名叫:SHADOWSOCKS\niptables -t nat -N SHADOWSOCKS\n\n# Allow connection to the server\niptables -t nat -A SHADOWSOCKS -d $SOCKS_SERVER -j RETURN\n\n# Allow connection to reserved networks\niptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN\n\n# Allow connection to chinese IPs\niptables -t nat -A SHADOWSOCKS -p tcp -m set --match-set chnroute dst -j RETURN\n# 如果你想对 icmp 协议也实现智能分流,可以加上下面这一条\n# iptables -t nat -A SHADOWSOCKS -p icmp -m set --match-set chnroute dst -j RETURN\n\n# Redirect to Shadowsocks\n# 把1081改成你的shadowsocks本地端口\niptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-port 1081\n# 如果你想对 icmp 协议也实现智能分流,可以加上下面这一条\n# iptables -t nat -A SHADOWSOCKS -p icmp -j REDIRECT --to-port 1081\n\n# 将SHADOWSOCKS链中所有的规则追加到OUTPUT链中\niptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS\n# 如果你想对 icmp 协议也实现智能分流,可以加上下面这一条\n# iptables -t nat -A OUTPUT -p icmp -j SHADOWSOCKS\n```\n&emsp;&emsp;这是在启动 `shadowsocks` 之前执行的脚本,用来设置 `iptables` 规则,对全局应用代理并将 `chnroute` 导入 `ipset` 来实现自动分流。注意要把服务器 `IP` 和本地端口相关的代码全部替换成你自己的。\n&emsp;&emsp;这里就有一个坑了,就是在把 `chnroute.txt` 加入 `ipset` 的时候。因为 `chnroute.txt` 是一个 `IP` 段列表,而中国持有的 `IP` 数量上还是比较大的,所以如果使用 `hash:ip` 来导入的话会使内存溢出。我在第二次重新配置的时候就撞进了这个大坑……\n&emsp;&emsp;但是你也不能尝试把整个列表导入 `iptables`。虽然导入 `iptables` 不会导致内存溢出,但是 `iptables` 是线性查表,即使你全部导入进去,也会因为低下的性能而抓狂。\n\n然后再创建 `/home/yang/bin/shadowsocks/ss-down.sh`, 这是用来清除上述规则的脚本,比较简单\n\n```bash\n#!/bin/bash\n\n# iptables -t nat -D OUTPUT -p icmp -j SHADOWSOCKS\niptables -t nat -D OUTPUT -p tcp -j SHADOWSOCKS\niptables -t nat -F SHADOWSOCKS\niptables -t nat -X SHADOWSOCKS\nipset destroy chnroute\n```\n\n接着执行\n\n```bash\n$ chmod +x ss-up.sh\n$ chmod +x ss-down.sh\n```\n\n### 1.5 配置ss-redir服务\n\n首先,默认的 `ss-local` 并不能用来作为 `iptables` 流量转发的目标,因为它是 `socks5` 代理而非透明代理。我们至少要把 `systemd` 执行的程序改成 `ss-redir`。其次,上述两个脚本还不能自动执行,必须让 `systemd` 分别在启动 `shadowsocks` 之前和关闭之后将脚本执行,这样才能自动配置好 `iptables` 规则。\n\n```bash\n$ vim /usr/lib/systemd/system/[email protected]\n```\n\n```bash\n[Unit]\nDescription=Shadowsocks-Libev Client Service\nAfter=network.target\n\n[Service]\nUser=root\nCapabilityBoundingSet=~CAP_SYS_ADMIN\nExecStart=\nExecStartPre=/home/yang/bin/shadowsocks/ss-up.sh\nExecStart=/usr/bin/ss-redir -u -c /etc/%i.json\nExecStopPost=/home/yang/bin/shadowsocks/ss-down.sh\n\n[Install]\nWantedBy=multi-user.target\n```\n然后启动服务\n```bash\n$ systemctl start shadowsocks-libev@shadowsocks\n```\n\n开机自启\n\n```bash\n$ systemctl enable shadowsocks-libev@shadowsocks\n```\n\n### 1.6 配置智能 DNS 服务\n\n完成了以上工作之后是不是就可以实现全局科学上网了呢?答案是否定的,我们还有最后一项工作需要完成,那就是解决 `DNS` 污染问题。如果你不知道什么是 `DNS` 污染,我可以简单地给你普及一下:\n\n> `DNS` 污染是一种让一般用户由于得到虚假目标主机 `IP` 而不能与其通信的方法,是一种 `DNS` 缓存投毒攻击(DNS cache poisoning)。其工作方式是:由于通常的 `DNS` 查询没有任何认证机制,而且 `DNS` 查询通常基于的 `UDP` 是无连接不可靠的协议,因此 `DNS` 的查询非常容易被篡改,通过对 `UDP` 端口 53 上的 `DNS` 查询进行入侵检测,一经发现与关键词相匹配的请求则立即伪装成目标域名的解析服务器(NS,Name Server)给查询者返回虚假结果。\n\n`DNS` 污染症状:目前一些被禁止访问的网站很多就是通过 `DNS` 污染来实现的,例如 `YouTube`、`Facebook` 等网站。\n\n**应对dns污染的方法**\n\n- 对于 `DNS` 污染,可以说,个人用户很难单单靠设置解决,通常可以使用 `VPN` 或者域名远程解析的方法解决,但这大多需要购买付费的 `VPN` 或 `SSH` 等\n- 修改 `Hosts` 的方法,手动设置域名正确的 `IP` 地址\n- `dns` 加密解析:[DNSCrypt](https://dnscrypt.org/)\n- 忽略 `DNS` 投毒污染小工具:[Pcap_DNSProxy](https://github.com/chengr28/Pcap_DNSProxy)\n\n我们选择用 `Pcap_DNSProxy` 来解决这个问题,以前用的是 `Pdnsd + Dnsmasq` 组合, 后来发现 `TCP` 请求效率太低加上家里网络与那些国外的 `DNS` 丢包实在是严重, 所以打算用 `Pcap_DNSProxy` 代替 `Pdnsd`。\n\n关于 `Pcap_DNSProxy` 的详细介绍,可以参考:\n[https://github.com/chengr28/Pcap_DNSProxy](https://github.com/chengr28/Pcap_DNSProxy)\n安装过程可以参考:\n[https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe_Linux.zh-Hans.txt](https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe_Linux.zh-Hans.txt)\n更详细的使用说明可以参考:\n[https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe.zh-Hans.txt](https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe.zh-Hans.txt)\n\n这里主要重点强调一些需要注意的配置项:\n\n- `DNS` - 境外域名解析参数区域(这是最关键的一项配置)\n\n```bash\n[DNS]\n# 这里一定要填 IPv4 + TCP!!!表示只使用 TCP 协议向境外远程 DNS 服务器发出请求\nOutgoing Protocol = IPv4 + TCP\n# 建议当系统使用全局代理功能时启用,程序将除境内服务器外的所有请求直接交给系统而不作任何过滤等处理,系统会将请求自动发往远程服务器进行解析\nDirect Request = IPv4\n...\n...\n```\n\n- `Local DNS` - 境内域名解析参数区域\n\n```bash\n[Local DNS]\n# 发送请求到境内 DNS 服务器时所使用的协议\nLocal Protocol = IPv4 + UDP\n...\n...\n```\n\n- `Addresses` - 普通模式地址区域\n\n```bash\n[Addresses]\n...\n...\n# IPv4 主要境外 DNS 服务器地址\nIPv4 Main DNS Address = 8.8.4.4:53\n# IPv4 备用境外 DNS 服务器地址\nIPv4 Alternate DNS Address = 8.8.8.8:53|208.67.220.220:443|208.67.222.222:5353\n# IPv4 主要境内 DNS 服务器地址,用于境内域名解析,推荐使用 onedns\nIPv4 Local Main DNS Address = 112.124.47.27:53\n# IPv4 备用境内 DNS 服务器地址,用于境内域名解析\nIPv4 Local Alternate DNS Address = 114.215.126.16:53\n...\n...\n```\n\n### 1.7 配置系统 DNS 服务器设置\n\n* 可参见 [https://developers.google.com/speed/public-dns/docs/using](https://developers.google.com/speed/public-dns/docs/using) 中 `Changing your DNS servers settings` 中 `Linux` 一节\n\n* 图形界面以 `GNOME 3` 为例:\n\n* 打开所有程序列表,并 -> 设置 – 硬件分类 – 网络\n\n* 如果要对当前的网络配置进行编辑 -&gt; 单击齿轮按钮\n\n* 选中 `IPv4`\n\n* `DNS` 栏目中,将自动拨向关闭\n\n* 在服务器中填入 `127.0.0.1` (或103.214.195.99:7300)并应用\n\n* 选中 `IPv6`\n\n* `DNS` 栏目中,将自动拨向关闭\n\n* 在服务器中填入 ::1 并应用\n\n* 请务必确保只填入这两个地址,填入其它地址可能会导致系统选择其它 DNS 服务器绕过程序的代理\n\n* 重启网络连接\n\n* 直接修改系统文件修改 DNS 服务器设置:\n\n* 自动获取地址(DHCP)时:\n\n* 以 `root` 权限进入 `/etc/dhcp` 或 `/etc/dhcp3` 目录(视乎 dhclient.conf 文件位置)\n\n* 直接修改 `dhclient.conf` 文件,修改或添加 `prepend domain-name-servers` 一项即可\n\n* 如果 `prepend domain-name-servers` 一项被 # 注释则需要把注释去掉以使配置生效,不需要添加新的条目\n\n* `dhclient.conf` 文件可能存在多个 `prepend domain-name-servers` 项,是各个网络接口的配置项目,直接修改总的配置项目即可\n\n* 使用 `service network(/networking) restart` 或 `ifdown/ifup` 或 `ifconfig stop/start` 重启网络服务/网络端口\n\n* 非自动获取地址(DHCP)时:\n\n* 以 `root` 权限进入 `/etc` 目录\n\n* 直接修改 `resolv.conf` 文件里的 `nameserver` 即可\n\n* 如果重启后配置被覆盖,则需要修改或新建 `/etc/resolvconf/resolv.conf.d` 文件,内容和 `resolv.conf` 一样\n\n* 使用 `service network(/networking) restart` 或 `ifdown/ifup` 或 `ifconfig stop/start` 重启网络服务/网络端口\n\n### 1.8 打开流量转发\n\n```bash\n$ cat /etc/sysctl.d/30-ipforward.conf\n```\n\n```bash\nnet.ipv4.ip_forward=1\n\nnet.ipv6.conf.all.forwarding = 1\n\nnet.ipv4.tcp_congestion_control=westwood\n\nnet.ipv4.tcp_syn_retries = 5\n\nnet.ipv4.tcp_synack_retries = 5\n```\n编辑完成后,执行以下命令使变动立即生效\n\n```bash\n$ sysctl -p\n```\n\n方案一固然可以实现全局智能分流,可这里有一个问题,它并不能让连接到此电脑上的设备也实现智能分流,也就是说,它还不能当成一个翻墙路由器使用,下面我们介绍的方案二便可以解决这个问题。前面的步骤大致相似,到后面略有不同。\n\n## 2. 通过策略路由实现智能分流\n\n### 2.1 安装相关软件\n\n* badvpn\n* pdnsd\n* shadowsocks\n\n```bash\n$ pacman -S badvpn pdnsd shadowsocks\n```\n\n### 2.2 配置shadowsocks(略过)\n假设shadowsocks配置文件为/etc/shadowsocks.json\n\n### 2.3 获取中国IP段\n\n将以下命令写入脚本保存执行(假设保存在/home/yang/bin/路由表/目录下):\n\n```bash\n#!/bin/sh\nwget -c http://ftp.apnic.net/stats/apnic/delegated-apnic-latest\ncat delegated-apnic-latest | awk -F '|' '/CN/&&/ipv4/ {print $4 \"/\" 32-log($5)/log(2)}' | cat > /home/yang/bin/路由表/cn_rules.conf\n```\n\n### 2.4 配置智能 DNS 服务\n\n同上\n\n### 2.5 配置系统 DNS 服务器设置\n\n同上\n\n### 2.6 写路由表启动和终止脚本\n\n```bash\n$ vim /usr/local/bin/socksfwd\n```\n\n```bash\n#!/bin/bash\nSOCKS_SERVER=$SERVER_IP # SOCKS 服务器的 IP 地址\nSOCKS_PORT=1081 # 本地SOCKS 服务器的端口\nGATEWAY_IP=$(ip route|grep \"default\"|awk '{print $3}') # 家用网关(路由器)的 IP 地址,你也可以手动指定\nTUN_NETWORK_DEV=tun0 # 选一个不冲突的 tun 设备号\nTUN_NETWORK_PREFIX=10.0.0 # 选一个不冲突的内网 IP 段的前缀\n\n\nstart_fwd() {\nip tuntap del dev \"$TUN_NETWORK_DEV\" mode tun\n# 添加虚拟网卡\nip tuntap add dev \"$TUN_NETWORK_DEV\" mode tun\n# 给虚拟网卡绑定IP地址\nip addr add \"$TUN_NETWORK_PREFIX.1/24\" dev \"$TUN_NETWORK_DEV\"\n# 启动虚拟网卡\nip link set \"$TUN_NETWORK_DEV\" up\nip route del default via \"$GATEWAY_IP\"\nip route add \"$SOCKS_SERVER\" via \"$GATEWAY_IP\"\n# 特殊ip段走家用网关(路由器)的 IP 地址(如局域网联机)\n# ip route add \"172.16.39.0/24\" via \"$GATEWAY_IP\"\n# 国内网段走家用网关(路由器)的 IP 地址\nfor i in $(cat /home/yang/bin/路由表/cn_rules.conf)\ndo\nip route add \"$i\" via \"$GATEWAY_IP\"\ndone\n# 将默认网关设为虚拟网卡的IP地址\nip route add 0.0.0.0/1 via \"$TUN_NETWORK_PREFIX.1\"\nip route add 128.0.0.0/1 via \"$TUN_NETWORK_PREFIX.1\"\n# 将socks5转为vpn\nbadvpn-tun2socks --tundev \"$TUN_NETWORK_DEV\" --netif-ipaddr \"$TUN_NETWORK_PREFIX.2\" --netif-netmask 255.255.255.0 --socks-server-addr \"127.0.0.1:$SOCKS_PORT\"\nTUN2SOCKS_PID=\"$!\"\n}\n\n\nstop_fwd() {\nip route del 128.0.0.0/1 via \"$TUN_NETWORK_PREFIX.1\"\nip route del 0.0.0.0/1 via \"$TUN_NETWORK_PREFIX.1\"\nfor i in $(cat /home/yang/bin/路由表/cn_rules.conf)\ndo\nip route del \"$i\" via \"$GATEWAY_IP\"\ndone\nip route del \"172.16.39.0/24\" via \"$GATEWAY_IP\"\nip route del \"$SOCKS_SERVER\" via \"$GATEWAY_IP\"\nip route add default via \"$GATEWAY_IP\"\nip link set \"$TUN_NETWORK_DEV\" down\nip addr del \"$TUN_NETWORK_PREFIX.1/24\" dev \"$TUN_NETWORK_DEV\"\nip tuntap del dev \"$TUN_NETWORK_DEV\" mode tun\n}\n\n\n\nstart_fwd\ntrap stop_fwd INT TERM\nwait \"$TUN2SOCKS_PID\"\n```\n\n```bash\n$ vim /etc/systemd/system/socksfwd.service\n```\n\n```bash\n[Unit]\n\nDescription=Transparent SOCKS5 forwarding\n\nAfter=network-online.target\n\n[Service]\n\nType=simple\n\nExecStart=/usr/local/bin/socksfwd\n\nLimitNOFILE=1048576\n\n\n[Install]\n\nWantedBy=multi-user.target\n```\n\n启动服务\n\n```bash\n$ systemctl start socksfwd\n```\n\n开机自启\n\n```bash\n$ systemctl enable socksfwd\n```\n\n### 2.7 打开流量转发\n\n```bash\n$ cat /etc/sysctl.d/30-ipforward.conf\n```\n\n```bash\nnet.ipv4.ip_forward=1\n\nnet.ipv6.conf.all.forwarding = 1\n\nnet.ipv4.tcp_congestion_control=westwood\n\nnet.ipv4.tcp_syn_retries = 5\n\nnet.ipv4.tcp_synack_retries = 5\n```\n\n编辑完成后,执行以下命令使变动立即生效\n\n```bash\n$ sysctl -p\n```",
      "json_metadata": "{\"tags\":[\"circumvention\",\"technology\"],\"links\":[\"https://dnscrypt.org/\",\"https://github.com/chengr28/Pcap_DNSProxy\",\"https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe_Linux.zh-Hans.txt\",\"https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe.zh-Hans.txt\",\"https://developers.google.com/speed/public-dns/docs/using\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "circumvention",
      "permlink": "linux",
      "title": "linux全局智能分流方案"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T07:29:36",
  "trx_id": "f3318dc25ef58c524d9eb57f85dfc77271a7bfad",
  "trx_in_block": 11,
  "virtual_op": 0
}
2017/11/28 07:28:42
idfollow
json["follow",{"follower":"ryyan","following":"cheetah","what":["ignore"]}]
required auths[]
required posting auths["ryyan"]
Transaction InfoBlock #17611750/Trx 49aef3a157006f5a65ca960fd9c83bc9dd1a5aec
View Raw JSON Data
{
  "block": 17611750,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"ryyan\",\"following\":\"cheetah\",\"what\":[\"ignore\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "ryyan"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T07:28:42",
  "trx_id": "49aef3a157006f5a65ca960fd9c83bc9dd1a5aec",
  "trx_in_block": 13,
  "virtual_op": 0
}
2017/11/28 07:26:06
authorcheetah
bodyHi! I am a robot. I just upvoted you! I found similar content that readers might be interested in: https://www.yangcs.net/posts/11b0e2ac/
json metadata
parent authorryyan
parent permlinklinux
permlinkcheetah-re-ryyanlinux
title
Transaction InfoBlock #17611698/Trx d4267d23be1a173bd3a6be151ea72fc1c35d7120
View Raw JSON Data
{
  "block": 17611698,
  "op": [
    "comment",
    {
      "author": "cheetah",
      "body": "Hi! I am a robot. I just upvoted you! I found similar content that readers might be interested in:\nhttps://www.yangcs.net/posts/11b0e2ac/",
      "json_metadata": "",
      "parent_author": "ryyan",
      "parent_permlink": "linux",
      "permlink": "cheetah-re-ryyanlinux",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T07:26:06",
  "trx_id": "d4267d23be1a173bd3a6be151ea72fc1c35d7120",
  "trx_in_block": 38,
  "virtual_op": 0
}
cheetahupvoted (0.08%) @ryyan / linux
2017/11/28 07:26:03
authorryyan
permlinklinux
votercheetah
weight8 (0.08%)
Transaction InfoBlock #17611697/Trx 982eb45c92f2d7c9b3ec5e0f1b32d2555d54efc3
View Raw JSON Data
{
  "block": 17611697,
  "op": [
    "vote",
    {
      "author": "ryyan",
      "permlink": "linux",
      "voter": "cheetah",
      "weight": 8
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T07:26:03",
  "trx_id": "982eb45c92f2d7c9b3ec5e0f1b32d2555d54efc3",
  "trx_in_block": 15,
  "virtual_op": 0
}
ryyanupvoted (100.00%) @ryyan / linux
2017/11/28 07:25:48
authorryyan
permlinklinux
voterryyan
weight10000 (100.00%)
Transaction InfoBlock #17611692/Trx 81df2afb09f3099b966b7251087cfce0a5524616
View Raw JSON Data
{
  "block": 17611692,
  "op": [
    "vote",
    {
      "author": "ryyan",
      "permlink": "linux",
      "voter": "ryyan",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T07:25:48",
  "trx_id": "81df2afb09f3099b966b7251087cfce0a5524616",
  "trx_in_block": 24,
  "virtual_op": 0
}
ryyanpublished a new post: linux
2017/11/28 07:25:48
authorryyan
body**本来我是决定不再写这样的文章了的。但是呢,最近连续配置了两次 `ArchLinux`,在配置这种东西的时候连续撞到了同样的坑,加上这段时间经常有人问我关于 `Linux` 下的 `shadowsocks` 的问题,所以我想了想还是写一篇记录一下吧,也免得自己以后再忘记了。** 这里有两种方案,都可以实现全局智能分流。第一种方案的思路是使用 `ipset` 载入 `chnroute` 的 `IP` 列表并使用 `iptables` 实现带自动分流国内外流量的全局代理。为什么不用 `PAC` 呢?因为 `PAC` 这种东西只对浏览器有用。难道你在浏览器之外就不需要科学上网了吗?反正我是不信的…… **本教程所用系统为 `Archlinux`,其他发型版类似,请自行参考相关资料。** ## 1. 通过 iptables 实现智能分流 ### 1.1 安装相关软件 * shadowsocks-libev * ipset ```bash $ pacman -S shadowsocks-libev ipset ``` ### 1.2 配置shadowsocks-libev(略过) 假设shadowsocks配置文件为/etc/shadowsocks.json ### 1.3 获取中国IP段 将以下命令写入脚本保存执行(假设保存在/home/yang/bin/路由表/目录下): ```bash #!/bin/sh wget -c http://ftp.apnic.net/stats/apnic/delegated-apnic-latest cat delegated-apnic-latest | awk -F '|' '/CN/&&/ipv4/ {print $4 "/" 32-log($5)/log(2)}' | cat > /home/yang/bin/路由表/cn_rules.conf ``` ### 1.4 创建启动和关闭脚本 ```bash $ vim /home/yang/bin/shadowsocks/ss-up.sh ``` ```bash #!/bin/bash SOCKS_SERVER=$SERVER_IP # SOCKS 服务器的 IP 地址 # Setup the ipset ipset -N chnroute hash:net maxelem 65536 for ip in $(cat '/home/yang/bin/路由表/cn_rules.conf'); do ipset add chnroute $ip done # 在nat表中新增一个链,名叫:SHADOWSOCKS iptables -t nat -N SHADOWSOCKS # Allow connection to the server iptables -t nat -A SHADOWSOCKS -d $SOCKS_SERVER -j RETURN # Allow connection to reserved networks iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN # Allow connection to chinese IPs iptables -t nat -A SHADOWSOCKS -p tcp -m set --match-set chnroute dst -j RETURN # 如果你想对 icmp 协议也实现智能分流,可以加上下面这一条 # iptables -t nat -A SHADOWSOCKS -p icmp -m set --match-set chnroute dst -j RETURN # Redirect to Shadowsocks # 把1081改成你的shadowsocks本地端口 iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-port 1081 # 如果你想对 icmp 协议也实现智能分流,可以加上下面这一条 # iptables -t nat -A SHADOWSOCKS -p icmp -j REDIRECT --to-port 1081 # 将SHADOWSOCKS链中所有的规则追加到OUTPUT链中 iptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS # 如果你想对 icmp 协议也实现智能分流,可以加上下面这一条 # iptables -t nat -A OUTPUT -p icmp -j SHADOWSOCKS ``` &emsp;&emsp;这是在启动 `shadowsocks` 之前执行的脚本,用来设置 `iptables` 规则,对全局应用代理并将 `chnroute` 导入 `ipset` 来实现自动分流。注意要把服务器 `IP` 和本地端口相关的代码全部替换成你自己的。 &emsp;&emsp;这里就有一个坑了,就是在把 `chnroute.txt` 加入 `ipset` 的时候。因为 `chnroute.txt` 是一个 `IP` 段列表,而中国持有的 `IP` 数量上还是比较大的,所以如果使用 `hash:ip` 来导入的话会使内存溢出。我在第二次重新配置的时候就撞进了这个大坑…… &emsp;&emsp;但是你也不能尝试把整个列表导入 `iptables`。虽然导入 `iptables` 不会导致内存溢出,但是 `iptables` 是线性查表,即使你全部导入进去,也会因为低下的性能而抓狂。 然后再创建 `/home/yang/bin/shadowsocks/ss-down.sh`, 这是用来清除上述规则的脚本,比较简单 ```bash #!/bin/bash # iptables -t nat -D OUTPUT -p icmp -j SHADOWSOCKS iptables -t nat -D OUTPUT -p tcp -j SHADOWSOCKS iptables -t nat -F SHADOWSOCKS iptables -t nat -X SHADOWSOCKS ipset destroy chnroute ``` 接着执行 ```bash $ chmod +x ss-up.sh $ chmod +x ss-down.sh ``` ### 1.5 配置ss-redir服务 首先,默认的 `ss-local` 并不能用来作为 `iptables` 流量转发的目标,因为它是 `socks5` 代理而非透明代理。我们至少要把 `systemd` 执行的程序改成 `ss-redir`。其次,上述两个脚本还不能自动执行,必须让 `systemd` 分别在启动 `shadowsocks` 之前和关闭之后将脚本执行,这样才能自动配置好 `iptables` 规则。 ```bash $ vim /usr/lib/systemd/system/[email protected] ``` ```bash [Unit] Description=Shadowsocks-Libev Client Service After=network.target [Service] User=root CapabilityBoundingSet=~CAP_SYS_ADMIN ExecStart= ExecStartPre=/home/yang/bin/shadowsocks/ss-up.sh ExecStart=/usr/bin/ss-redir -u -c /etc/%i.json ExecStopPost=/home/yang/bin/shadowsocks/ss-down.sh [Install] WantedBy=multi-user.target ``` 然后启动服务 ```bash $ systemctl start shadowsocks-libev@shadowsocks ``` 开机自启 ```bash $ systemctl enable shadowsocks-libev@shadowsocks ``` ### 1.6 配置智能 DNS 服务 完成了以上工作之后是不是就可以实现全局科学上网了呢?答案是否定的,我们还有最后一项工作需要完成,那就是解决 `DNS` 污染问题。如果你不知道什么是 `DNS` 污染,我可以简单地给你普及一下: > `DNS` 污染是一种让一般用户由于得到虚假目标主机 `IP` 而不能与其通信的方法,是一种 `DNS` 缓存投毒攻击(DNS cache poisoning)。其工作方式是:由于通常的 `DNS` 查询没有任何认证机制,而且 `DNS` 查询通常基于的 `UDP` 是无连接不可靠的协议,因此 `DNS` 的查询非常容易被篡改,通过对 `UDP` 端口 53 上的 `DNS` 查询进行入侵检测,一经发现与关键词相匹配的请求则立即伪装成目标域名的解析服务器(NS,Name Server)给查询者返回虚假结果。 `DNS` 污染症状:目前一些被禁止访问的网站很多就是通过 `DNS` 污染来实现的,例如 `YouTube`、`Facebook` 等网站。 **应对dns污染的方法** - 对于 `DNS` 污染,可以说,个人用户很难单单靠设置解决,通常可以使用 `VPN` 或者域名远程解析的方法解决,但这大多需要购买付费的 `VPN` 或 `SSH` 等 - 修改 `Hosts` 的方法,手动设置域名正确的 `IP` 地址 - `dns` 加密解析:[DNSCrypt](https://dnscrypt.org/) - 忽略 `DNS` 投毒污染小工具:[Pcap_DNSProxy](https://github.com/chengr28/Pcap_DNSProxy) 我们选择用 `Pcap_DNSProxy` 来解决这个问题,以前用的是 `Pdnsd + Dnsmasq` 组合, 后来发现 `TCP` 请求效率太低加上家里网络与那些国外的 `DNS` 丢包实在是严重, 所以打算用 `Pcap_DNSProxy` 代替 `Pdnsd`。 关于 `Pcap_DNSProxy` 的详细介绍,可以参考: [https://github.com/chengr28/Pcap_DNSProxy](https://github.com/chengr28/Pcap_DNSProxy) 安装过程可以参考: [https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe_Linux.zh-Hans.txt](https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe_Linux.zh-Hans.txt) 更详细的使用说明可以参考: [https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe.zh-Hans.txt](https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe.zh-Hans.txt) 这里主要重点强调一些需要注意的配置项: - `DNS` - 境外域名解析参数区域(这是最关键的一项配置) ```bash [DNS] # 这里一定要填 IPv4 + TCP!!!表示只使用 TCP 协议向境外远程 DNS 服务器发出请求 Outgoing Protocol = IPv4 + TCP # 建议当系统使用全局代理功能时启用,程序将除境内服务器外的所有请求直接交给系统而不作任何过滤等处理,系统会将请求自动发往远程服务器进行解析 Direct Request = IPv4 ... ... ``` - `Local DNS` - 境内域名解析参数区域 ```bash [Local DNS] # 发送请求到境内 DNS 服务器时所使用的协议 Local Protocol = IPv4 + UDP ... ... ``` - `Addresses` - 普通模式地址区域 ```bash [Addresses] ... ... # IPv4 主要境外 DNS 服务器地址 IPv4 Main DNS Address = 8.8.4.4:53 # IPv4 备用境外 DNS 服务器地址 IPv4 Alternate DNS Address = 8.8.8.8:53|208.67.220.220:443|208.67.222.222:5353 # IPv4 主要境内 DNS 服务器地址,用于境内域名解析,推荐使用 onedns IPv4 Local Main DNS Address = 112.124.47.27:53 # IPv4 备用境内 DNS 服务器地址,用于境内域名解析 IPv4 Local Alternate DNS Address = 114.215.126.16:53 ... ... ``` ### 1.7 配置系统 DNS 服务器设置 * 可参见 [https://developers.google.com/speed/public-dns/docs/using](https://developers.google.com/speed/public-dns/docs/using) 中 `Changing your DNS servers settings` 中 `Linux` 一节 * 图形界面以 `GNOME 3` 为例: * 打开所有程序列表,并 -> 设置 – 硬件分类 – 网络 * 如果要对当前的网络配置进行编辑 -&gt; 单击齿轮按钮 * 选中 `IPv4` * `DNS` 栏目中,将自动拨向关闭 * 在服务器中填入 `127.0.0.1` (或103.214.195.99:7300)并应用 * 选中 `IPv6` * `DNS` 栏目中,将自动拨向关闭 * 在服务器中填入 ::1 并应用 * 请务必确保只填入这两个地址,填入其它地址可能会导致系统选择其它 DNS 服务器绕过程序的代理 * 重启网络连接 * 直接修改系统文件修改 DNS 服务器设置: * 自动获取地址(DHCP)时: * 以 `root` 权限进入 `/etc/dhcp` 或 `/etc/dhcp3` 目录(视乎 dhclient.conf 文件位置) * 直接修改 `dhclient.conf` 文件,修改或添加 `prepend domain-name-servers` 一项即可 * 如果 `prepend domain-name-servers` 一项被 # 注释则需要把注释去掉以使配置生效,不需要添加新的条目 * `dhclient.conf` 文件可能存在多个 `prepend domain-name-servers` 项,是各个网络接口的配置项目,直接修改总的配置项目即可 * 使用 `service network(/networking) restart` 或 `ifdown/ifup` 或 `ifconfig stop/start` 重启网络服务/网络端口 * 非自动获取地址(DHCP)时: * 以 `root` 权限进入 `/etc` 目录 * 直接修改 `resolv.conf` 文件里的 `nameserver` 即可 * 如果重启后配置被覆盖,则需要修改或新建 `/etc/resolvconf/resolv.conf.d` 文件,内容和 `resolv.conf` 一样 * 使用 `service network(/networking) restart` 或 `ifdown/ifup` 或 `ifconfig stop/start` 重启网络服务/网络端口 ### 1.8 打开流量转发 ```bash $ cat /etc/sysctl.d/30-ipforward.conf ``` ```bash net.ipv4.ip_forward=1 net.ipv6.conf.all.forwarding = 1 net.ipv4.tcp_congestion_control=westwood net.ipv4.tcp_syn_retries = 5 net.ipv4.tcp_synack_retries = 5 ``` 编辑完成后,执行以下命令使变动立即生效 ```bash $ sysctl -p ``` 方案一固然可以实现全局智能分流,可这里有一个问题,它并不能让连接到此电脑上的设备也实现智能分流,也就是说,它还不能当成一个翻墙路由器使用,下面我们介绍的方案二便可以解决这个问题。前面的步骤大致相似,到后面略有不同。 ## 2. 通过策略路由实现智能分流 ### 2.1 安装相关软件 * badvpn * pdnsd * shadowsocks ```bash $ pacman -S badvpn pdnsd shadowsocks ``` ### 2.2 配置shadowsocks(略过) 假设shadowsocks配置文件为/etc/shadowsocks.json ### 2.3 获取中国IP段 将以下命令写入脚本保存执行(假设保存在/home/yang/bin/路由表/目录下): ```bash #!/bin/sh wget -c http://ftp.apnic.net/stats/apnic/delegated-apnic-latest cat delegated-apnic-latest | awk -F '|' '/CN/&&/ipv4/ {print $4 "/" 32-log($5)/log(2)}' | cat > /home/yang/bin/路由表/cn_rules.conf ``` ### 2.4 配置智能 DNS 服务 同上 ### 2.5 配置系统 DNS 服务器设置 同上 ### 2.6 写路由表启动和终止脚本 ```bash $ vim /usr/local/bin/socksfwd ``` ```bash #!/bin/bash SOCKS_SERVER=$SERVER_IP # SOCKS 服务器的 IP 地址 SOCKS_PORT=1081 # 本地SOCKS 服务器的端口 GATEWAY_IP=$(ip route|grep "default"|awk '{print $3}') # 家用网关(路由器)的 IP 地址,你也可以手动指定 TUN_NETWORK_DEV=tun0 # 选一个不冲突的 tun 设备号 TUN_NETWORK_PREFIX=10.0.0 # 选一个不冲突的内网 IP 段的前缀 start_fwd() { ip tuntap del dev "$TUN_NETWORK_DEV" mode tun # 添加虚拟网卡 ip tuntap add dev "$TUN_NETWORK_DEV" mode tun # 给虚拟网卡绑定IP地址 ip addr add "$TUN_NETWORK_PREFIX.1/24" dev "$TUN_NETWORK_DEV" # 启动虚拟网卡 ip link set "$TUN_NETWORK_DEV" up ip route del default via "$GATEWAY_IP" ip route add "$SOCKS_SERVER" via "$GATEWAY_IP" # 特殊ip段走家用网关(路由器)的 IP 地址(如局域网联机) # ip route add "172.16.39.0/24" via "$GATEWAY_IP" # 国内网段走家用网关(路由器)的 IP 地址 for i in $(cat /home/yang/bin/路由表/cn_rules.conf) do ip route add "$i" via "$GATEWAY_IP" done # 将默认网关设为虚拟网卡的IP地址 ip route add 0.0.0.0/1 via "$TUN_NETWORK_PREFIX.1" ip route add 128.0.0.0/1 via "$TUN_NETWORK_PREFIX.1" # 将socks5转为vpn badvpn-tun2socks --tundev "$TUN_NETWORK_DEV" --netif-ipaddr "$TUN_NETWORK_PREFIX.2" --netif-netmask 255.255.255.0 --socks-server-addr "127.0.0.1:$SOCKS_PORT" TUN2SOCKS_PID="$!" } stop_fwd() { ip route del 128.0.0.0/1 via "$TUN_NETWORK_PREFIX.1" ip route del 0.0.0.0/1 via "$TUN_NETWORK_PREFIX.1" for i in $(cat /home/yang/bin/路由表/cn_rules.conf) do ip route del "$i" via "$GATEWAY_IP" done ip route del "172.16.39.0/24" via "$GATEWAY_IP" ip route del "$SOCKS_SERVER" via "$GATEWAY_IP" ip route add default via "$GATEWAY_IP" ip link set "$TUN_NETWORK_DEV" down ip addr del "$TUN_NETWORK_PREFIX.1/24" dev "$TUN_NETWORK_DEV" ip tuntap del dev "$TUN_NETWORK_DEV" mode tun } start_fwd trap stop_fwd INT TERM wait "$TUN2SOCKS_PID" ``` ```bash $ vim /etc/systemd/system/socksfwd.service ``` ```bash [Unit] Description=Transparent SOCKS5 forwarding After=network-online.target [Service] Type=simple ExecStart=/usr/local/bin/socksfwd LimitNOFILE=1048576 [Install] WantedBy=multi-user.target ``` 启动服务 ```bash $ systemctl start socksfwd ``` 开机自启 ```bash $ systemctl enable socksfwd ``` ### 2.7 打开流量转发 ```bash $ cat /etc/sysctl.d/30-ipforward.conf ``` ```bash net.ipv4.ip_forward=1 net.ipv6.conf.all.forwarding = 1 net.ipv4.tcp_congestion_control=westwood net.ipv4.tcp_syn_retries = 5 net.ipv4.tcp_synack_retries = 5 ``` 编辑完成后,执行以下命令使变动立即生效 ```bash $ sysctl -p ```
json metadata{"tags":["circumvention","technology"],"links":["https://dnscrypt.org/","https://github.com/chengr28/Pcap_DNSProxy","https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe_Linux.zh-Hans.txt","https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe.zh-Hans.txt","https://developers.google.com/speed/public-dns/docs/using"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinkcircumvention
permlinklinux
titlelinux全局智能分流方案
Transaction InfoBlock #17611692/Trx 81df2afb09f3099b966b7251087cfce0a5524616
View Raw JSON Data
{
  "block": 17611692,
  "op": [
    "comment",
    {
      "author": "ryyan",
      "body": "**本来我是决定不再写这样的文章了的。但是呢,最近连续配置了两次 `ArchLinux`,在配置这种东西的时候连续撞到了同样的坑,加上这段时间经常有人问我关于 `Linux` 下的 `shadowsocks` 的问题,所以我想了想还是写一篇记录一下吧,也免得自己以后再忘记了。**\n\n这里有两种方案,都可以实现全局智能分流。第一种方案的思路是使用 `ipset` 载入 `chnroute` 的 `IP` 列表并使用 `iptables` 实现带自动分流国内外流量的全局代理。为什么不用 `PAC` 呢?因为 `PAC` 这种东西只对浏览器有用。难道你在浏览器之外就不需要科学上网了吗?反正我是不信的……\n\n**本教程所用系统为 `Archlinux`,其他发型版类似,请自行参考相关资料。**\n\n## 1. 通过 iptables 实现智能分流\n\n### 1.1 安装相关软件\n\n* shadowsocks-libev\n* ipset\n\n```bash\n$ pacman -S shadowsocks-libev ipset\n```\n\n### 1.2 配置shadowsocks-libev(略过)\n\n假设shadowsocks配置文件为/etc/shadowsocks.json\n\n### 1.3 获取中国IP段\n\n将以下命令写入脚本保存执行(假设保存在/home/yang/bin/路由表/目录下):\n\n```bash\n#!/bin/sh\nwget -c http://ftp.apnic.net/stats/apnic/delegated-apnic-latest\ncat delegated-apnic-latest | awk -F '|' '/CN/&&/ipv4/ {print $4 \"/\" 32-log($5)/log(2)}' | cat > /home/yang/bin/路由表/cn_rules.conf\n```\n\n### 1.4 创建启动和关闭脚本\n\n```bash\n$ vim /home/yang/bin/shadowsocks/ss-up.sh\n```\n\n```bash\n#!/bin/bash\n\nSOCKS_SERVER=$SERVER_IP # SOCKS 服务器的 IP 地址\n# Setup the ipset\nipset -N chnroute hash:net maxelem 65536\n\nfor ip in $(cat '/home/yang/bin/路由表/cn_rules.conf'); do\n  ipset add chnroute $ip\ndone\n\n# 在nat表中新增一个链,名叫:SHADOWSOCKS\niptables -t nat -N SHADOWSOCKS\n\n# Allow connection to the server\niptables -t nat -A SHADOWSOCKS -d $SOCKS_SERVER -j RETURN\n\n# Allow connection to reserved networks\niptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN\niptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN\n\n# Allow connection to chinese IPs\niptables -t nat -A SHADOWSOCKS -p tcp -m set --match-set chnroute dst -j RETURN\n# 如果你想对 icmp 协议也实现智能分流,可以加上下面这一条\n# iptables -t nat -A SHADOWSOCKS -p icmp -m set --match-set chnroute dst -j RETURN\n\n# Redirect to Shadowsocks\n# 把1081改成你的shadowsocks本地端口\niptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-port 1081\n# 如果你想对 icmp 协议也实现智能分流,可以加上下面这一条\n# iptables -t nat -A SHADOWSOCKS -p icmp -j REDIRECT --to-port 1081\n\n# 将SHADOWSOCKS链中所有的规则追加到OUTPUT链中\niptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS\n# 如果你想对 icmp 协议也实现智能分流,可以加上下面这一条\n# iptables -t nat -A OUTPUT -p icmp -j SHADOWSOCKS\n```\n&emsp;&emsp;这是在启动 `shadowsocks` 之前执行的脚本,用来设置 `iptables` 规则,对全局应用代理并将 `chnroute` 导入 `ipset` 来实现自动分流。注意要把服务器 `IP` 和本地端口相关的代码全部替换成你自己的。\n&emsp;&emsp;这里就有一个坑了,就是在把 `chnroute.txt` 加入 `ipset` 的时候。因为 `chnroute.txt` 是一个 `IP` 段列表,而中国持有的 `IP` 数量上还是比较大的,所以如果使用 `hash:ip` 来导入的话会使内存溢出。我在第二次重新配置的时候就撞进了这个大坑……\n&emsp;&emsp;但是你也不能尝试把整个列表导入 `iptables`。虽然导入 `iptables` 不会导致内存溢出,但是 `iptables` 是线性查表,即使你全部导入进去,也会因为低下的性能而抓狂。\n\n然后再创建 `/home/yang/bin/shadowsocks/ss-down.sh`, 这是用来清除上述规则的脚本,比较简单\n\n```bash\n#!/bin/bash\n\n# iptables -t nat -D OUTPUT -p icmp -j SHADOWSOCKS\niptables -t nat -D OUTPUT -p tcp -j SHADOWSOCKS\niptables -t nat -F SHADOWSOCKS\niptables -t nat -X SHADOWSOCKS\nipset destroy chnroute\n```\n\n接着执行\n\n```bash\n$ chmod +x ss-up.sh\n$ chmod +x ss-down.sh\n```\n\n### 1.5 配置ss-redir服务\n\n首先,默认的 `ss-local` 并不能用来作为 `iptables` 流量转发的目标,因为它是 `socks5` 代理而非透明代理。我们至少要把 `systemd` 执行的程序改成 `ss-redir`。其次,上述两个脚本还不能自动执行,必须让 `systemd` 分别在启动 `shadowsocks` 之前和关闭之后将脚本执行,这样才能自动配置好 `iptables` 规则。\n\n```bash\n$ vim /usr/lib/systemd/system/[email protected]\n```\n\n```bash\n[Unit]\nDescription=Shadowsocks-Libev Client Service\nAfter=network.target\n\n[Service]\nUser=root\nCapabilityBoundingSet=~CAP_SYS_ADMIN\nExecStart=\nExecStartPre=/home/yang/bin/shadowsocks/ss-up.sh\nExecStart=/usr/bin/ss-redir -u -c /etc/%i.json\nExecStopPost=/home/yang/bin/shadowsocks/ss-down.sh\n\n[Install]\nWantedBy=multi-user.target\n```\n然后启动服务\n```bash\n$ systemctl start shadowsocks-libev@shadowsocks\n```\n\n开机自启\n\n```bash\n$ systemctl enable shadowsocks-libev@shadowsocks\n```\n\n### 1.6 配置智能 DNS 服务\n\n完成了以上工作之后是不是就可以实现全局科学上网了呢?答案是否定的,我们还有最后一项工作需要完成,那就是解决 `DNS` 污染问题。如果你不知道什么是 `DNS` 污染,我可以简单地给你普及一下:\n\n> `DNS` 污染是一种让一般用户由于得到虚假目标主机 `IP` 而不能与其通信的方法,是一种 `DNS` 缓存投毒攻击(DNS cache poisoning)。其工作方式是:由于通常的 `DNS` 查询没有任何认证机制,而且 `DNS` 查询通常基于的 `UDP` 是无连接不可靠的协议,因此 `DNS` 的查询非常容易被篡改,通过对 `UDP` 端口 53 上的 `DNS` 查询进行入侵检测,一经发现与关键词相匹配的请求则立即伪装成目标域名的解析服务器(NS,Name Server)给查询者返回虚假结果。\n\n`DNS` 污染症状:目前一些被禁止访问的网站很多就是通过 `DNS` 污染来实现的,例如 `YouTube`、`Facebook` 等网站。\n\n**应对dns污染的方法**\n\n- 对于 `DNS` 污染,可以说,个人用户很难单单靠设置解决,通常可以使用 `VPN` 或者域名远程解析的方法解决,但这大多需要购买付费的 `VPN` 或 `SSH` 等\n- 修改 `Hosts` 的方法,手动设置域名正确的 `IP` 地址\n- `dns` 加密解析:[DNSCrypt](https://dnscrypt.org/)\n- 忽略 `DNS` 投毒污染小工具:[Pcap_DNSProxy](https://github.com/chengr28/Pcap_DNSProxy)\n\n我们选择用 `Pcap_DNSProxy` 来解决这个问题,以前用的是 `Pdnsd + Dnsmasq` 组合, 后来发现 `TCP` 请求效率太低加上家里网络与那些国外的 `DNS` 丢包实在是严重, 所以打算用 `Pcap_DNSProxy` 代替 `Pdnsd`。\n\n关于 `Pcap_DNSProxy` 的详细介绍,可以参考:\n[https://github.com/chengr28/Pcap_DNSProxy](https://github.com/chengr28/Pcap_DNSProxy)\n安装过程可以参考:\n[https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe_Linux.zh-Hans.txt](https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe_Linux.zh-Hans.txt)\n更详细的使用说明可以参考:\n[https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe.zh-Hans.txt](https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe.zh-Hans.txt)\n\n这里主要重点强调一些需要注意的配置项:\n\n- `DNS` - 境外域名解析参数区域(这是最关键的一项配置)\n\n```bash\n[DNS]\n# 这里一定要填 IPv4 + TCP!!!表示只使用 TCP 协议向境外远程 DNS 服务器发出请求\nOutgoing Protocol = IPv4 + TCP\n# 建议当系统使用全局代理功能时启用,程序将除境内服务器外的所有请求直接交给系统而不作任何过滤等处理,系统会将请求自动发往远程服务器进行解析\nDirect Request = IPv4\n...\n...\n```\n\n- `Local DNS` - 境内域名解析参数区域\n\n```bash\n[Local DNS]\n# 发送请求到境内 DNS 服务器时所使用的协议\nLocal Protocol = IPv4 + UDP\n...\n...\n```\n\n- `Addresses` - 普通模式地址区域\n\n```bash\n[Addresses]\n...\n...\n# IPv4 主要境外 DNS 服务器地址\nIPv4 Main DNS Address = 8.8.4.4:53\n# IPv4 备用境外 DNS 服务器地址\nIPv4 Alternate DNS Address = 8.8.8.8:53|208.67.220.220:443|208.67.222.222:5353\n# IPv4 主要境内 DNS 服务器地址,用于境内域名解析,推荐使用 onedns\nIPv4 Local Main DNS Address = 112.124.47.27:53\n# IPv4 备用境内 DNS 服务器地址,用于境内域名解析\nIPv4 Local Alternate DNS Address = 114.215.126.16:53\n...\n...\n```\n\n### 1.7 配置系统 DNS 服务器设置\n\n* 可参见 [https://developers.google.com/speed/public-dns/docs/using](https://developers.google.com/speed/public-dns/docs/using) 中 `Changing your DNS servers settings` 中 `Linux` 一节\n\n* 图形界面以 `GNOME 3` 为例:\n\n* 打开所有程序列表,并 -> 设置 – 硬件分类 – 网络\n\n* 如果要对当前的网络配置进行编辑 -&gt; 单击齿轮按钮\n\n* 选中 `IPv4`\n\n* `DNS` 栏目中,将自动拨向关闭\n\n* 在服务器中填入 `127.0.0.1` (或103.214.195.99:7300)并应用\n\n* 选中 `IPv6`\n\n* `DNS` 栏目中,将自动拨向关闭\n\n* 在服务器中填入 ::1 并应用\n\n* 请务必确保只填入这两个地址,填入其它地址可能会导致系统选择其它 DNS 服务器绕过程序的代理\n\n* 重启网络连接\n\n* 直接修改系统文件修改 DNS 服务器设置:\n\n* 自动获取地址(DHCP)时:\n\n* 以 `root` 权限进入 `/etc/dhcp` 或 `/etc/dhcp3` 目录(视乎 dhclient.conf 文件位置)\n\n* 直接修改 `dhclient.conf` 文件,修改或添加 `prepend domain-name-servers` 一项即可\n\n* 如果 `prepend domain-name-servers` 一项被 # 注释则需要把注释去掉以使配置生效,不需要添加新的条目\n\n* `dhclient.conf` 文件可能存在多个 `prepend domain-name-servers` 项,是各个网络接口的配置项目,直接修改总的配置项目即可\n\n* 使用 `service network(/networking) restart` 或 `ifdown/ifup` 或 `ifconfig stop/start` 重启网络服务/网络端口\n\n* 非自动获取地址(DHCP)时:\n\n* 以 `root` 权限进入 `/etc` 目录\n\n* 直接修改 `resolv.conf` 文件里的 `nameserver` 即可\n\n* 如果重启后配置被覆盖,则需要修改或新建 `/etc/resolvconf/resolv.conf.d` 文件,内容和 `resolv.conf` 一样\n\n* 使用 `service network(/networking) restart` 或 `ifdown/ifup` 或 `ifconfig stop/start` 重启网络服务/网络端口\n\n### 1.8 打开流量转发\n\n```bash\n$ cat /etc/sysctl.d/30-ipforward.conf\n```\n\n```bash\nnet.ipv4.ip_forward=1\n\nnet.ipv6.conf.all.forwarding = 1\n\nnet.ipv4.tcp_congestion_control=westwood\n\nnet.ipv4.tcp_syn_retries = 5\n\nnet.ipv4.tcp_synack_retries = 5\n```\n编辑完成后,执行以下命令使变动立即生效\n\n```bash\n$ sysctl -p\n```\n\n方案一固然可以实现全局智能分流,可这里有一个问题,它并不能让连接到此电脑上的设备也实现智能分流,也就是说,它还不能当成一个翻墙路由器使用,下面我们介绍的方案二便可以解决这个问题。前面的步骤大致相似,到后面略有不同。\n\n## 2. 通过策略路由实现智能分流\n\n### 2.1 安装相关软件\n\n* badvpn\n* pdnsd\n* shadowsocks\n\n```bash\n$ pacman -S badvpn pdnsd shadowsocks\n```\n\n### 2.2 配置shadowsocks(略过)\n假设shadowsocks配置文件为/etc/shadowsocks.json\n\n### 2.3 获取中国IP段\n\n将以下命令写入脚本保存执行(假设保存在/home/yang/bin/路由表/目录下):\n\n```bash\n#!/bin/sh\nwget -c http://ftp.apnic.net/stats/apnic/delegated-apnic-latest\ncat delegated-apnic-latest | awk -F '|' '/CN/&&/ipv4/ {print $4 \"/\" 32-log($5)/log(2)}' | cat > /home/yang/bin/路由表/cn_rules.conf\n```\n\n### 2.4 配置智能 DNS 服务\n\n同上\n\n### 2.5 配置系统 DNS 服务器设置\n\n同上\n\n### 2.6 写路由表启动和终止脚本\n\n```bash\n$ vim /usr/local/bin/socksfwd\n```\n\n```bash\n#!/bin/bash\nSOCKS_SERVER=$SERVER_IP # SOCKS 服务器的 IP 地址\nSOCKS_PORT=1081 # 本地SOCKS 服务器的端口\nGATEWAY_IP=$(ip route|grep \"default\"|awk '{print $3}') # 家用网关(路由器)的 IP 地址,你也可以手动指定\nTUN_NETWORK_DEV=tun0 # 选一个不冲突的 tun 设备号\nTUN_NETWORK_PREFIX=10.0.0 # 选一个不冲突的内网 IP 段的前缀\n\n\nstart_fwd() {\nip tuntap del dev \"$TUN_NETWORK_DEV\" mode tun\n# 添加虚拟网卡\nip tuntap add dev \"$TUN_NETWORK_DEV\" mode tun\n# 给虚拟网卡绑定IP地址\nip addr add \"$TUN_NETWORK_PREFIX.1/24\" dev \"$TUN_NETWORK_DEV\"\n# 启动虚拟网卡\nip link set \"$TUN_NETWORK_DEV\" up\nip route del default via \"$GATEWAY_IP\"\nip route add \"$SOCKS_SERVER\" via \"$GATEWAY_IP\"\n# 特殊ip段走家用网关(路由器)的 IP 地址(如局域网联机)\n# ip route add \"172.16.39.0/24\" via \"$GATEWAY_IP\"\n# 国内网段走家用网关(路由器)的 IP 地址\nfor i in $(cat /home/yang/bin/路由表/cn_rules.conf)\ndo\nip route add \"$i\" via \"$GATEWAY_IP\"\ndone\n# 将默认网关设为虚拟网卡的IP地址\nip route add 0.0.0.0/1 via \"$TUN_NETWORK_PREFIX.1\"\nip route add 128.0.0.0/1 via \"$TUN_NETWORK_PREFIX.1\"\n# 将socks5转为vpn\nbadvpn-tun2socks --tundev \"$TUN_NETWORK_DEV\" --netif-ipaddr \"$TUN_NETWORK_PREFIX.2\" --netif-netmask 255.255.255.0 --socks-server-addr \"127.0.0.1:$SOCKS_PORT\"\nTUN2SOCKS_PID=\"$!\"\n}\n\n\nstop_fwd() {\nip route del 128.0.0.0/1 via \"$TUN_NETWORK_PREFIX.1\"\nip route del 0.0.0.0/1 via \"$TUN_NETWORK_PREFIX.1\"\nfor i in $(cat /home/yang/bin/路由表/cn_rules.conf)\ndo\nip route del \"$i\" via \"$GATEWAY_IP\"\ndone\nip route del \"172.16.39.0/24\" via \"$GATEWAY_IP\"\nip route del \"$SOCKS_SERVER\" via \"$GATEWAY_IP\"\nip route add default via \"$GATEWAY_IP\"\nip link set \"$TUN_NETWORK_DEV\" down\nip addr del \"$TUN_NETWORK_PREFIX.1/24\" dev \"$TUN_NETWORK_DEV\"\nip tuntap del dev \"$TUN_NETWORK_DEV\" mode tun\n}\n\n\n\nstart_fwd\ntrap stop_fwd INT TERM\nwait \"$TUN2SOCKS_PID\"\n```\n\n```bash\n$ vim /etc/systemd/system/socksfwd.service\n```\n\n```bash\n[Unit]\n\nDescription=Transparent SOCKS5 forwarding\n\nAfter=network-online.target\n\n[Service]\n\nType=simple\n\nExecStart=/usr/local/bin/socksfwd\n\nLimitNOFILE=1048576\n\n\n[Install]\n\nWantedBy=multi-user.target\n```\n\n启动服务\n\n```bash\n$ systemctl start socksfwd\n```\n\n开机自启\n\n```bash\n$ systemctl enable socksfwd\n```\n\n### 2.7 打开流量转发\n\n```bash\n$ cat /etc/sysctl.d/30-ipforward.conf\n```\n\n```bash\nnet.ipv4.ip_forward=1\n\nnet.ipv6.conf.all.forwarding = 1\n\nnet.ipv4.tcp_congestion_control=westwood\n\nnet.ipv4.tcp_syn_retries = 5\n\nnet.ipv4.tcp_synack_retries = 5\n```\n\n编辑完成后,执行以下命令使变动立即生效\n\n```bash\n$ sysctl -p\n```",
      "json_metadata": "{\"tags\":[\"circumvention\",\"technology\"],\"links\":[\"https://dnscrypt.org/\",\"https://github.com/chengr28/Pcap_DNSProxy\",\"https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe_Linux.zh-Hans.txt\",\"https://github.com/chengr28/Pcap_DNSProxy/blob/master/Documents/ReadMe.zh-Hans.txt\",\"https://developers.google.com/speed/public-dns/docs/using\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "circumvention",
      "permlink": "linux",
      "title": "linux全局智能分流方案"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T07:25:48",
  "trx_id": "81df2afb09f3099b966b7251087cfce0a5524616",
  "trx_in_block": 24,
  "virtual_op": 0
}
ryyanupdated their account properties
2017/11/28 07:01:33
accountryyan
json metadata{"profile":{"name":"ryan","about":"云计算工程师,不务正业,随心所欲"}}
memo keySTM824xHURUciC4qWdkset97fQnueFnD8Qx1VcUAqkJmtFzzp4hzo
Transaction InfoBlock #17611208/Trx 7ec826df2c8f6efc578ac1fd204bdbc7b1995244
View Raw JSON Data
{
  "block": 17611208,
  "op": [
    "account_update",
    {
      "account": "ryyan",
      "json_metadata": "{\"profile\":{\"name\":\"ryan\",\"about\":\"云计算工程师,不务正业,随心所欲\"}}",
      "memo_key": "STM824xHURUciC4qWdkset97fQnueFnD8Qx1VcUAqkJmtFzzp4hzo"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T07:01:33",
  "trx_id": "7ec826df2c8f6efc578ac1fd204bdbc7b1995244",
  "trx_in_block": 20,
  "virtual_op": 0
}
steemcreated a new account: @ryyan
2017/11/28 06:56:06
active{"account_auths":[],"key_auths":[["STM69uY3bSmDgGkZfkSVRHMSMpgGf5QADgLCDsZgJ2kfpHdBD4jhx",1]],"weight_threshold":1}
creatorsteem
delegation57000.000000 VESTS
extensions[]
fee0.500 STEEM
json metadata
memo keySTM824xHURUciC4qWdkset97fQnueFnD8Qx1VcUAqkJmtFzzp4hzo
new account nameryyan
owner{"account_auths":[],"key_auths":[["STM77jM1ratqyqQ8C4RmKiaYzkLM5SdAEuo8TJsuMugJU184oNksc",1]],"weight_threshold":1}
posting{"account_auths":[],"key_auths":[["STM7imbdXM2ZffH4qQ7neDoDNXsENzHkqijAviPwnfepC7wQSKyYq",1]],"weight_threshold":1}
Transaction InfoBlock #17611099/Trx 6eb8c7ce3d93d5d9e43e0e55318f20d06097c24b
View Raw JSON Data
{
  "block": 17611099,
  "op": [
    "account_create_with_delegation",
    {
      "active": {
        "account_auths": [],
        "key_auths": [
          [
            "STM69uY3bSmDgGkZfkSVRHMSMpgGf5QADgLCDsZgJ2kfpHdBD4jhx",
            1
          ]
        ],
        "weight_threshold": 1
      },
      "creator": "steem",
      "delegation": "57000.000000 VESTS",
      "extensions": [],
      "fee": "0.500 STEEM",
      "json_metadata": "",
      "memo_key": "STM824xHURUciC4qWdkset97fQnueFnD8Qx1VcUAqkJmtFzzp4hzo",
      "new_account_name": "ryyan",
      "owner": {
        "account_auths": [],
        "key_auths": [
          [
            "STM77jM1ratqyqQ8C4RmKiaYzkLM5SdAEuo8TJsuMugJU184oNksc",
            1
          ]
        ],
        "weight_threshold": 1
      },
      "posting": {
        "account_auths": [],
        "key_auths": [
          [
            "STM7imbdXM2ZffH4qQ7neDoDNXsENzHkqijAviPwnfepC7wQSKyYq",
            1
          ]
        ],
        "weight_threshold": 1
      }
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-11-28T06:56:06",
  "trx_id": "6eb8c7ce3d93d5d9e43e0e55318f20d06097c24b",
  "trx_in_block": 18,
  "virtual_op": 0
}

Account Metadata

POSTING JSON METADATA
profile{"name":"Ryan","about":"Cloud Native 工程师,不务正业,随心所欲","profile_image":"http://o7z41ciog.bkt.clouddn.com/05ba932c.jpg"}
JSON METADATA
profile{"name":"Ryan","about":"Cloud Native 工程师,不务正业,随心所欲","profile_image":"http://o7z41ciog.bkt.clouddn.com/05ba932c.jpg"}
{
  "posting_json_metadata": {
    "profile": {
      "name": "Ryan",
      "about": "Cloud Native 工程师,不务正业,随心所欲",
      "profile_image": "http://o7z41ciog.bkt.clouddn.com/05ba932c.jpg"
    }
  },
  "json_metadata": {
    "profile": {
      "name": "Ryan",
      "about": "Cloud Native 工程师,不务正业,随心所欲",
      "profile_image": "http://o7z41ciog.bkt.clouddn.com/05ba932c.jpg"
    }
  }
}

Auth Keys

Owner
Single Signature
Public Keys
STM77jM1ratqyqQ8C4RmKiaYzkLM5SdAEuo8TJsuMugJU184oNksc1/1
Active
Single Signature
Public Keys
STM69uY3bSmDgGkZfkSVRHMSMpgGf5QADgLCDsZgJ2kfpHdBD4jhx1/1
Posting
Single Signature
Public Keys
STM7imbdXM2ZffH4qQ7neDoDNXsENzHkqijAviPwnfepC7wQSKyYq1/1
App Permissions
Memo
STM824xHURUciC4qWdkset97fQnueFnD8Qx1VcUAqkJmtFzzp4hzo
{
  "owner": {
    "account_auths": [],
    "key_auths": [
      [
        "STM77jM1ratqyqQ8C4RmKiaYzkLM5SdAEuo8TJsuMugJU184oNksc",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "active": {
    "account_auths": [],
    "key_auths": [
      [
        "STM69uY3bSmDgGkZfkSVRHMSMpgGf5QADgLCDsZgJ2kfpHdBD4jhx",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "posting": {
    "account_auths": [
      [
        "dtubeviewer",
        1
      ]
    ],
    "key_auths": [
      [
        "STM7imbdXM2ZffH4qQ7neDoDNXsENzHkqijAviPwnfepC7wQSKyYq",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "memo": "STM824xHURUciC4qWdkset97fQnueFnD8Qx1VcUAqkJmtFzzp4hzo"
}

Witness Votes

0 / 30
No active witness votes.
[]